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