Блок устройства пишет - PullRequest
       18

Блок устройства пишет

0 голосов
/ 06 декабря 2011

Я пытаюсь понять, как работает запись на блочном устройстве. Я понимаю, что все записи должны быть выровнены по секторам. Таким образом, если размер сектора 512 байт, тогда все записи имеют размер 512 байт. Теперь допустим, что я создаю файл и начинаю последовательно в него записывать (без буферизации на стороне приложения). Теперь предположим, что я начинаю с записи 16 байтов с нулевым смещением файла. Как это перевести в запись на уровне блока? Буферизируется ли он до тех пор, пока я не напишу объем данных "размера сектора" и не вытолкну на диск? Если вызывается fsync, заполняются ли оставшиеся байты, а затем записываются? Правильно ли понимание или я ухожу?

Следующий вопрос заключался в следующем. Если у меня есть файл, скажем, размером 64K. Допустим, я выполняю произвольную запись 16 байтов со смещением 64. Затем читается соответствующий сектор из 512 байтов, 16 байтов записываются в буфер со смещением 64 и затем 512 байтов записываются на диск. Правильно ли понимание?

1 Ответ

0 голосов
/ 06 декабря 2011

Это называется Read-Modify-Write: сначала вы должны прочитать сектор, изменить запрошенные байты и записать его обратно.
Вы можете игнорировать этот шаг только в случае записи с полным сектором.

Я не знаю о Linux, но в случае Windows он обычно выполняет буферизацию, как вы упоминали, до тех пор, пока буфер не будет заполнен (буфер, вероятно, кратен размеру сектора), или он полностью избегает буферизации и выбрасывает исключение, если запись не выровнена или не полный сектор, в зависимости от того, запрашивали ли вы буферизацию или нет.

...