2012-02-03 5 views
7

fopen을하고 나서 fread를 할 때, 실제로/부분적으로 메모리에로드되는 파일은 fopen 또는 fread 중에 입니까?fread, fopen 및 fwrite 호출의 경우 파일이 메모리에로드되는시기는 언제입니까?

또는 부분적으로 파일 크기에 따라 fopen에로드 된 다음 fread의 에 완전히로드 되었습니까?

비슷하게 fwrite가 호출 될 때 OS 레벨에서 내부적으로 어떤 일이 발생합니까? 그 시점에 파일이 메모리에로드 되었습니까? 아니면 해당 부분의 메모리에있는 파일 을 다시 검색하는 페이지 스왑이 발생 했습니까?

메모리에서 파일 로딩과 관련하여 이러한 호출이 발생할 때마다 OS 수준에서 어떤 일이 발생합니까?

+4

어떤 파일 시스템입니까? 어떤 운영 체제가 필요합니까? –

+4

어떤 OS입니까? 이것은 전적으로 OS 의존적입니다. (나는 보통 파일을 읽을 때 파일을 읽을 때 데이터가 읽히지 않을 것이라고 기대한다.) –

+0

윈도우 용 데이터가 필요하지만 리눅스에서도 같은 점을 알기에는 궁금하다. – seahorse

답변

6
  • fopen()은 파일에 대한 핸들 만 생성합니다. 지연 생길 수의 스토리지에 커밋 비록
  • fread() 실제로
  • fwrite() 파일에 데이터를 기록하는 메모리 버퍼 (클라이언트에게 투명하게 발생할 수 OS 레벨 버퍼링.)로 파일을 판독한다 (예 저널링 파일 시스템과.)
4

일반적으로 파일을 열 때 메모리에로드되지 않습니다. 대신 각 읽기에 대해 부품이로드됩니다. 모든 종류의 버퍼링으로 인해 큰 덩어리가로드 될 수 있으며 각 fread에서 요청할 수 있습니다.

데이터가 fwrite 일 때, 결국 커널에 복사되어 버퍼링 된 후 디스크에 (또는 어디에서) 기록됩니다. 일반적으로 파일을 작성할 때 파일을로드 할 필요가 없습니다.

2

일반적으로 파일 시스템 및 OS에 따라 다릅니다. 윈도우즈에는 256KB 청크 파일을 처리하고 그 청크에 속하는 읽기 요청시 각 청크를로드하는 캐싱 메커니즘이 있습니다. fopen에 대한 호출로 인해 미디어에서 파일 내용을 읽지 않아야합니다. fread을 사용하면 미디어에서 부분 읽기 (또는 작은 파일의 경우 전체 읽기)가 발생합니다. 부분 읽기는 일반적으로 캐시 관리자 (256KB)의 캐시 라인 크기와 같습니다.

fwrite도 실제 미디어에 쓸 수 있습니다. 일반적으로 클라이언트 데이터가 RAM의 캐시 된 파일 영역으로 전송되지만 데이터가 실제로 미디어에 쓰여지는 것은 아닙니다. Windows에서 캐시 관리자는 파일의 캐시 된 영역을 미디어로 플러시 할시기를 결정합니다. fwrite 이후 더러운 데이터가 모두 미디어로 플러시되도록하려면 나중에 fflush으로 전화해야합니다.

1

이것은 운영 체제에 따라 다르지만 모든 운영 체제는 투명하게 캐시되므로 실제 파일을 열 때 가상 메모리 공간의 일부에 매핑됩니다.

이것은 실제 읽기/쓰기 전에 디스크 활동이 발생하지 않는다는 것을 의미합니다.

메모리 매핑 (예 : : mmap)을 사용하여 파일을 열면 "투명도"가 손실되는 반면, 메모리 매핑 (예 : fopen)이없는 파일을 열어도이 내용이 적용됩니다 (예 : ).