Является ли чтение с диска атомным в секторах? - PullRequest
0 голосов
/ 05 октября 2019

Насколько я понимаю, более или менее все системы выполняют запись на диск в виде атомарной записи сектора (обычно 512 или 4096 байт). Но как насчет чтения?

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

Давайте возьмем игрушечный пример;У меня есть продюсер, у которого есть mmap: ed файл. Задача этого производителя - написать букву «А» где-то в первом секторе, а затем переместить ее в другое место, все еще в первом секторе. Поскольку производитель не знает, в какое время записывается память на диск, он всегда записывает «A» в новом адресе, прежде чем удалит его из старого адреса. Таким образом, при просмотре файла на диске может существовать 2 «А», но никогда не меньше 1. Но рассмотрим случай, когда чтение одного сектора не является атомарным (например, при чтении с использованием другого mmap с MAP_SHARED?), тогда может случиться так, что, когда потребительский процесс начинает читать файл, «А» находится во второй половине сектора, но когда потребительский процесс получает во вторую часть сектора новую (атомарную) записьсектора происходит, когда буква «А» перемещается в первую половину сектора. Если потребитель продолжит читать вторую половину сектора, он не увидит ни одной буквы «А» в этом секторе. Это все еще риск при использовании read(2)? enter image description here

1 Ответ

1 голос
/ 06 октября 2019

Реально, флэш-диски NAND, жесткие диски и CD-ROM будут считывать секторы с атомарным чтением, потому что аппаратное обеспечение не может одновременно считывать и записывать из одного и того же блока. Кроме того, они хранят контрольные суммы для каждого сектора, поэтому любая разорванная запись будет отброшена как ошибка чтения.

Однако в вашем случае все это не имеет значения, поскольку read/write/mmap работает на VFS, а не непосредственно на устройстве. Когда вы делаете read со страницы mmap, вы получаете простую неатомарную копию этой страницы, и она может действительно не показывать буквы "A".

...