Когда файл загружается в память - для вызовов fread, fopen и fwrite? - PullRequest
7 голосов
/ 03 февраля 2012

Когда я выполняю fopen, а затем fread, когда файл фактически / частично загружается в память во время fopen или fread?

Или он частично загружается в fopen в зависимости от размера файла и затем полностьюзагружается во время fread?

Точно так же, что происходит внутри на уровне ОС, когда вызывается fwrite?Загружен ли файл в память в это время или происходит перестановка страниц, извлекающая только ту часть файла в памяти?

Что происходит на уровне ОС при каждом из этих вызовов в отношении загрузки файла в память?

Ответы [ 4 ]

6 голосов
/ 03 февраля 2012
  • fopen() создает только дескриптор файла.
  • fread() фактически считывает файл в буфер памяти (буферизация на уровне ОС может выполняться прозрачно для клиента.)
  • fwrite() записывает данные в файл, хотя их фиксация в хранилище может быть отложена (например, с журналированной файловой системой.)
4 голосов
/ 03 февраля 2012

Как правило, файл не загружается в память при его открытии. Вместо этого части загружаются для каждого чтения; из-за всех видов буферизации могут быть загружены большие порции, чем вы запрашиваете в каждом fread.

Когда вы fwrite некоторые данные, они в конечном итоге копируются в ядро, которое затем записывает их на диск (или куда-либо) после буферизации. Как правило, для записи не требуется загружать часть файла.

2 голосов
/ 03 февраля 2012

Обычно это зависит от файловой системы и ОС.в окнах есть механизм кэширования, который обрабатывает файл в кусках по 256 КБ и загружает каждый кусок по запросу чтения, попадающему в этот блокВызов fopen не должен вызывать чтение содержимого файла с носителя.И fread вызовет частичное чтение (или полное чтение для небольших файлов) с носителя.Частичное чтение обычно равно размеру строки кэша в менеджере кэша (256 КБ).

fwrite также может / не может вызвать фактическую запись на носитель.Обычно это приводит к тому, что данные клиента передаются в область кэшированных файлов в ОЗУ, но нет гарантии, что данные действительно записываются на носитель.в Windows диспетчер кэша решает, когда записывать кэшированную область файла на носитель.Если вы хотите убедиться, что все грязные данные сброшены на носитель после fwrite, вам нужно позвонить fflush впоследствии.

1 голос
/ 03 февраля 2012

Несмотря на то, что это зависит от ОС, в современной операционной системе вся активность диска прозрачно кэшируется, поэтому при реальном открытии файла он отображается на часть пространства виртуальной памяти.

Это означает, чточто никакое дисковое действие не происходит до фактического чтения / записи.

Это верно, даже если вы открываете файл без отображения памяти (например, fopen), в то время как вы открываете его с отображением памяти (например: mmap)) вы просто теряете «прозрачность».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...