Когда вы используете fread
или другие функции файлового ввода-вывода в стандартной библиотеке C, память буферизуется в нескольких местах.
- Ваше приложение выделяет буфер, который передается в
fread
. fread
копирует данные в ваш буфер, и затем вы можете делать с ним все, что хотите. Вы несете ответственность за распределение / освобождение этого буфера.
- Библиотека C обычно создает буфер для каждого
FILE*
, который у вас открыт. Данные считываются в эти буферы большими кусками. Это позволяет fread
удовлетворять множество небольших запросов без необходимости выполнять большое количество системных вызовов, которые являются дорогостоящими. Это то, что люди имеют в виду, когда говорят, что fread
буферизовано.
- Ядро также буферизует файлы, которые читаются в кеше диска. Это сокращает время, необходимое для системного вызова
read
, поскольку, если данные уже находятся в памяти, вашей программе не придется ждать, пока ядро загрузит их с диска. Ядро будет удерживать недавно прочитанные файлы и может читать вперед для файлов, к которым осуществляется последовательный доступ.
Буфер библиотеки C выделяется автоматически при открытии файла и освобождается при закрытии файла. Вам совсем не обязательно с этим справляться.
Дисковый кеш ядра хранится в физической памяти, которая больше ни для чего не используется. Опять же, вам не нужно управлять этим. Память будет освобождена, как только она понадобится для чего-то другого.