Повреждение файла в режиме добавления

Главный вопрос: можно ли повредить данные, добавив новые данные в конец файла (имея в виду размер сектора жесткого диска, например 512)?

Что, если, например, у меня есть файл размером 1023 байта, добавлен 1 байт, и у меня возник сбой (потеря питания, проблемы с дисковым буфером и т. Д.)?

В каком состоянии будет второй сектор в этом сценарии?


person 2epeat    schedule 26.08.2011    source источник
comment
Это зависит от вашей файловой системы. Например, журналируемая файловая система с большей вероятностью вернет ваши данные.   -  person arunkumar    schedule 26.08.2011


Ответы (1)


Невозможно сказать. Необходимо учитывать несколько уровней абстракции, кеширования и даже простых электрических задержек распространения.

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

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

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

person Marc B    schedule 26.08.2011
comment
Думаю, вопрос в том, в каком состоянии будет целый сектор, если жесткий диск записывает данные PER сектора. что будет с 511 байтами второго сектора? - person excanoe; 26.08.2011
comment
Опять же, это зависит от того, как далеко продвинулась операция записи до потери мощности. Если байт записан на диск, но системные метаданные (размер файла) не обновлены, то ОС все равно увидит файл размером 1023 байта после повторной загрузки машины. Даже файловая система с журналированием не защитит от потери питания, потому что вы все еще записываете данные в файл на диске, когда питание прекращается. журналы делают запись немного быстрее, потому что метаданные + данные записываются одновременно, но НИЧЕГО не могут сделать с исчезновением мощности на полпути (или до) операции записи. - person Marc B; 26.08.2011
comment
Но что, если мы пропустим программный уровень ОС, что будет с данными ДО того, как будет произведена запись? Могу ли я потерять данные, которые уже находятся на диске? Насколько я понимаю, если минимальный блок io диска является секторным, то я предполагаю, что запись начинается с 513 байт, начиная с начала размера второго сектора. Я прав? - person excanoe; 26.08.2011
comment
Да, накопитель должен будет прочитать весь сектор, ввести измененные данные, а затем записать весь сектор. он не выполняет ввод-вывод на уровне байтов. После того, как измененные байты окажутся на физическом диске, они не могут быть потеряны. но если связанные метаданные также обновляются, они фактически теряются, потому что записи об их присутствии там нет. - person Marc B; 26.08.2011
comment
только если он находится на диске и там есть метаданные, ГОВОРЯЩИЕ, что он на диске, тогда да. это безопасно. Но это все равно, что пытаться пройти через большую закрывающуюся дверь. вы либо полностью прошли, либо попадаете в ловушку, либо разрезаете пополам. это ситуация по принципу «все или ничего». - person Marc B; 26.08.2011