fseek(...)
- это библиотечный вызов, а не системный вызов ОС. Это библиотека времени выполнения, которая заботится о фактических издержках, связанных с выполнением системного вызова ОС, технически говоря, fseek косвенно выполняет вызов системы, но на самом деле это не так (это приводит к четкому различию между различия между вызовом библиотеки и системным вызовом). fseek(...)
- это стандартная функция ввода-вывода независимо от базовой системы ... однако ... и это большая однако ...
ОС, скорее всего, будет кэшировать файл в памяти своего ядра, то есть прямое смещение к месту на диске, где хранятся 1 и 0, это через уровни ядра ОС, более чем вероятно, самый верхний слой в ядре, который будет иметь моментальный снимок того, из чего состоит файл, то есть данные независимо от того, что он содержит (это не волнует в любом случае, пока «указатели» на структуру диска для это смещение относительно расположения на диске действительно!) ...
Когда происходит fseek(..)
, косвенно возникает много перегрузок, ядро делегировало задачу чтения с диска, в зависимости от того, насколько фрагментирован файл, теоретически это может быть "повсеместно". «Это может быть значительным накладным расходом с точки зрения необходимости, с точки зрения пользовательской земли, то есть кода C, выполняющего fseek(...)
, он может разбросать себя повсеместно, чтобы собрать данные в единое целое». непрерывное представление данных "и впредь, вставка в середину файла (помните, что на этом этапе ядру придется корректировать расположение / смещения в фактическом дисковом массиве для данных) будет считаться медленнее, чем добавление к конец файла.
Причина довольно проста, ядро «знает», каким было последнее смещение, и просто стереть маркер EOF и вставить дополнительные данные, за кадром ядру приходится выделять еще один блок памяти для диска. -буфер с откорректированным смещением к месту на диске после маркера EOF после завершения добавления данных.