Linux Syscall write: Гарантирует ли ядро ​​последовательность записи данных? - PullRequest
1 голос
/ 11 ноября 2011

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

Пока яМне было интересно, что если я запишу блок данных morea (скажем, «abc ... [x bytes] ... xyz») на устройство хранения, то в то время, когда ядро ​​выполняет действие, ядро ​​сначала запишет abcи xyz последний?

Если нет, то может произойти какой-то другой процесс, читающий «* ... [x bytes] ... xyz» до завершения действия записи.Я думаю, что для многих приложений это катастрофа.

Кто-нибудь знает реализацию или, где я могу найти ответ в исходном коде ядра?

С нетерпением ждем ваших ответов!Спасибо!

[обновление 2011.11.12]

Я изучил исходный код, но не могу понять его полностью.Я обнаружил вызывающую цепочку "write -> vfs_write -> do_sync_write [loops] -> generic_file_aio_write [inode_mutex] -> __generic_file_aio_write -> .. -> generic_perform_write -> .. -> __copy_from_user (>) для пользователя ()

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

Надежды на осветление Фуртура ~

Ответы [ 3 ]

3 голосов
/ 11 ноября 2011

Данные могут быть физически не записаны на диск в том порядке, в котором вы их записали, поэтому, если в процессе записи произойдет сбой машины, вы могли бы увидеть «xyz» без «abc» после загрузки системырезервное копирование.Но если предположить, что машина продолжает работать, ядро ​​обеспечит, чтобы все записи происходили в правильном порядке.

2 голосов
/ 11 ноября 2011

Правильный порядок всегда соблюдается.

Но при неатомарной записи в приемник, который имеет несколько авторов, может случиться так, что полученные данные содержат, скажем, "abc...[n bytes]...[data from other writer]...[m bytes]...xyz", где n+m=x.

Таким образом, данные вставляются в совершенно другой блок данных.

При атомарной записи таких вещей не бывает.

РЕДАКТИРОВАТЬ: Для ясности, речь идет только о трубах и FIFO. Что насчет файлов, я не знаю.

0 голосов
/ 12 ноября 2011

допустим, я пишу abc, который равен 4k, и def, который равен 4k.

Ядро не гарантирует, что если я напишу "abcdef" в блоке 8k, то другой процесс выиграетне вижу «abc», а затем видит «def» как две отдельные записи.

Но если я просто напишу 4k «abc», ядро ​​гарантирует, что любой другой процесс никогда не увидит «a», а затем «b»."then" c "

http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_14.html#SEC215

Вы на другой дорожке.Гарантия того, что вы хотите, заключается в том, что «xyz» никогда не будет читаться перед «abc».Это совершенно другая гарантия.На самом деле, это больше, чем гарантия.Это само собой разумеется.И это не имеет никакого отношения к сбросу блоков на диск.Это другой уровень системы.

...