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