Что означает атомарный системный вызов?

Я знаю, что atomic обычно используется в контексте условия гонки и означает что-то вроде непротиворечивости и детерминированности результата в соответствии с многопоточностью. /многопроцессорная среда. Это нормально. Но недавно я прочитал об атомарных системных вызовах в Linux и не понял, что здесь означает atomic, т.е. как эта атомарность >реализовано. Означает ли это, что эти системные вызовы просто используют блокировки ресурсов (например, open() на целевом индексном узле файла) или есть что-то еще, могут быть какие-то гарантии ядра? Я думаю об отключении прерываний, но не все прерывания можно отключить. Может быть, этого достаточно, потому что все прерывания, используемые ядром, могут быть отключены, а другие слишком важны и могут прервать наш системный вызов atomic?


person Evgeniy Kluchikov    schedule 21.03.2015    source источник


Ответы (1)


Это действительно зависит от системного вызова. Цитируя man 3 read, который цитирует руководство по программированию posix:

Ввод-вывод должен быть атомарным для обычных файлов, каналов и FIFO. Атомарность означает, что все байты одной операции, начавшейся вместе, заканчиваются вместе без чередования других операций ввода-вывода. Известным атрибутом терминалов является то, что это не соблюдается, и терминалы явно (и неявно постоянно) исключаются, что делает поведение неопределенным. Поведение для других типов устройств также остается неопределенным, но формулировка предназначена для того, чтобы подразумевать, что будущие стандарты могут указать атомарность (или нет).

Очевидно, это относится только к операциям ввода-вывода.

person Marcus Müller    schedule 21.03.2015
comment
Я знаю о FIFO и моем вопросе о том, как эта атомарность работает внутри. - person Evgeniy Kluchikov; 21.03.2015