Что такое атомные операции для новичков? - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в операционных системах, и каждый ответ, который я нашел в Stackoverflow, настолько сложен, что я не могу понять. Может ли кто-нибудь объяснить, что такое

атомная операция

Для новичка?

Мое понимание: Мое понимание состоит в том, что atomic operation означает, что он полностью выполняется с без прерывания ? То есть, это блокирующая операция без возможности прерывания?

1 Ответ

0 голосов
/ 06 сентября 2018

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

Пример: веб-опрос, открытые вопросы, но мы хотим подвести итог, сколько людей дают один и тот же ответ. У вас есть таблица базы данных, в которую вы вставляете ответы и их количество. Код прост:

get the row for the given answer
if the row didn't exist:
  create the row with answer and count 1
else:
  increment count
  update the row with new count

Или это? Посмотрите, что происходит, когда несколько человек делают это одновременно:

user A answers "ham and eggs"       user B answers "ham and eggs"
get the row: count is 1             get the row: count is 1
okay, we're updating!               okay, we're updating!
count is now 2                      count is now 2
store 2 for "ham and eggs"          store 2 for "ham and eggs"

«Ветчина и яйца» подскочили только на 1, хотя за него проголосовали 2 человека! Это явно не то, что мы хотели. Если бы существовала только атомарная операция «увеличить, если она существует, или создать новую запись» ... для краткости давайте назовем ее «upsert» (для «update или insert»)

user A answers "ham and eggs"       user B answers "ham and eggs"
upsert by incrementing count        upsert by incrementing count

Здесь каждый восходящий атом является атомным: первый слева равен 2, второй - 3. Все работает.

Обратите внимание, что "атомарный" является контекстным: в этом случае операция upsert должна быть только атомарной по отношению к операциям над таблицей ответов в базе данных; компьютер может свободно делать другие вещи, если они не влияют (или не зависят) на результат того, что пытается сделать upsert.

...