Предварительные данные в файл - PullRequest
6 голосов
/ 06 апреля 2011

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

Итак, вопрос в том, почему операционные системы не реализуют эту (довольно тривиальную) операцию?

Ответы [ 2 ]

7 голосов
/ 06 апреля 2011

Не думаю, что это так просто, как вы предлагаете. Это правда, что файловая система может выделить новый блок, сохранить в нем предварительно добавленные данные, изменить указатель файла так, чтобы он указывал на этот блок, а затем связать остальную часть файла из этого блока. Так же, как добавление узла в начало связанного списка, верно?

Но что происходит, когда (как, вероятно, имеет место) предварительно добавленные данные не заполняют назначенный блок. Я не думаю, что многие файловые системы будут иметь механизм для объединения частичных блоков, но даже если они это сделают, это приведет к огромной неэффективности. В итоге вы получите файл, состоящий в основном из пустых блоков, и вам придется прочитать и записать весь файл для его дефрагментации. Можно также выполнить операцию чтения и записи заранее, когда вы делаете предварительный запрос.

0 голосов
/ 06 апреля 2011

При добавлении или добавлении данных в файл всегда возникает проблема выделения места. Добавление дополнительного места к файлу намного проще, чем добавление из-за файловых дескрипторов, указывающих на начало потока файла. Если вы хотите добавить файл, дескриптор файла не нужно изменять, просто размер файла и выделенная память. Если вы хотите добавить к файлу файл, необходимо немедленно создать новый дескриптор файла, чтобы сначала записать предварительно добавленные данные или сохранить местоположение данных, которые добавляются в процессе обновления оригинала.

Создание нового файлового дескриптора может быть сложным, так как вы также должны обновить любые ссылки, указывающие на него. Вот почему для ОС проще реализовать добавление данных и немного сложнее реализовать предварительное добавление.

...