Как fwite / putc записывает на диск?

Предположим, у нас есть уже существующий файл, скажем <File>. Этот файл был открыт для обновления программой C (r+b). Мы используем fseek для перехода к точке внутри <File>, кроме ее конца. Теперь мы начинаем записывать данные с помощью fwrite/fputc. Обратите внимание, что мы не удаляем данные, ранее существовавшие в _6 _...

Как система обрабатывает эти записи? Будет ли он перезаписан весь файл в другое место на диске, теперь содержащий новые данные? Он фрагментирует файл и записывает только новые данные в другую позицию (и просто помните, что посередине есть свободное место)? Действительно ли он перезаписывает на месте только ту часть, которая была изменена?

Есть веская причина спросить: в первом случае, если вы постоянно обновляете файл, система может замедлиться. Во втором случае это может быть быстрее, но испортит файловую систему, если будет выполнено с большим количеством файлов. В третьем случае, особенно если у вас есть твердотельный диск, обновление одного и того же участка файла снова и снова может сделать эту часть диска бесполезной.

Собственно, отсюда и мой вопрос. Я читал, что, чтобы спасти дисковые сектора от чрезмерного использования, твердотельные диски перемещают данные в менее используемые секторы, используя различные методы. Но как именно stdio функции справляются с такими ситуациями?

Спасибо заранее за ваше время! : D


person someone    schedule 08.08.2013    source источник
comment
стандартные библиотеки, такие как stdio, не заботятся о секторах диска. Вот для чего нужен драйвер. Кроме того, это больше, чем просто запись на диск, потому что стандартные библиотеки просто направляют запрос в операционную систему, которая проверяет права доступа (при необходимости), а затем пересылает запросы драйверу. stdio находится как можно дальше от диска. stdio даже не знает, записаны ли данные на диск вообще. Он просто записывает его в стандартизованный поток, который может быть диском, сетью, оперативной памятью или чем-то еще. Также это может быть мусорный бак (он же / dev / null) :)   -  person Devolus    schedule 08.08.2013
comment
Также фрагментация обычно возникает, когда вы много удаляете и пишете. В этом случае файл может растекаться по всему диску, что замедляет доступ, потому что драйвер должен ждать, пока будет прочитано больше секторов. Когда файл записывается в виде непрерывного блока, драйвер может обрабатывать его так, чтобы вращение (если он вращается) диска было оптимизировано для доступа к определенному файлу.   -  person Devolus    schedule 08.08.2013
comment
Спасибо! Это было полезно !!! : D Между прочим, есть ли какой-нибудь из известных вам способов (кроме написания операционной системы на сборке), что у нас может быть прямой доступ к диску?   -  person someone    schedule 08.08.2013
comment
Как написать драйвер зависит от ОС. Однако большинство драйверов больше не пишутся на ассемблере. Вам нужны только небольшие части ассемблера для инструкций, которые иначе недоступны, но большая часть кода написана на C или даже C ++. Для Windows вы можете взглянуть на DDK, который можно бесплатно загрузить. Для Linux исходный код в любом случае доступен. :) Я бы поискал в Google некоторые драйверы с открытым исходным кодом (если вы выберете путь Windows) и взглянул бы на них. Вы можете взглянуть на ReactOS, которая является заменой Windows OSS и имеет двоичную совместимость, так что вы наверняка что-то найдете в их коде.   -  person Devolus    schedule 08.08.2013
comment
Теперь, когда я думаю об этом, у вас должна быть возможность напрямую обращаться к диску через пути UNC (в Windows) и, конечно же, в Unix, открыв / dev. Если у вас есть соответствующие разрешения, вы можете написать приложение пользовательского пространства, которое обеспечивает прямой доступ к устройству, чтобы вы могли написать свою локальную файловую систему без написания полного драйвера.   -  person Devolus    schedule 08.08.2013
comment
Вау, спасибо! Я лучше пойду по этому пути ... Но нужно много учиться! :)   -  person someone    schedule 08.08.2013
comment
Что ж, если ответ вам поможет, можете принять его. ;)   -  person Devolus    schedule 09.08.2013
comment
Ты прав. Я забыл это... :)   -  person someone    schedule 09.08.2013


Ответы (2)


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

Это краткая версия.

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

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

Но детали могут отличаться в зависимости от оборудования. AFAIK, если вы перезаписываете данные на компакт-диске, тогда данные записываются заново (пока сеанс не завершен), потому что вы не можете обновить данные на компакт-диске после того, как он будет записан.

person Devolus    schedule 08.08.2013
comment
Это значит, что он пишет поверх старых данных? Но верно ли это и для SSD-накопителей? - person someone; 08.08.2013
comment
Как записываются данные, в основном зависит от драйвера файловой системы. AFAIK, использующий FAT на SSD, не так уж и хорош, потому что он имеет тенденцию часто перезаписывать одни и те же сектора. Так что файловая система, которая распределяет ее лучше, - лучший выбор, но я не знаю наверняка. - person Devolus; 08.08.2013

Ваше понимание неверно: «Обратите внимание, что мы не удаляем данные, ранее существовавшие в файле»

Если вы перейдете в середину файла и начнете писать, он перезапишет все, что было в этой позиции раньше.

Как это делается под прикрытием, вероятно, зависит от того, как компьютер на жестком диске реализует это. Он должен быть невидимым за пределами жесткого диска и не имеет значения.

person Jay    schedule 08.08.2013
comment
Да, это то, что мы хотим сделать. В своем комментарии я просто пытался упомянуть, что мы не обрезаем файл до нулевой длины, удаляя все данные (скажем, используя wb). - person someone; 08.08.2013
comment
Есть случай, когда это имеет значение: когда вы хотите специально перезаписать данные !!! : D - person someone; 08.08.2013
comment
Вы не можете сократить файл с помощью метода write (). Вы можете только изменить существующие данные или добавить в конец файла. - person Jay; 09.08.2013