что такое команда atomi c exchange (между регистром и ячейкой памяти)? - PullRequest
0 голосов
/ 02 мая 2020

Я изучаю ОС, и мне вдруг стало любопытно, что такое инструкция atomi c (между регистром и местом в памяти). И как это можно использовать для реализации блокировки?

1 Ответ

0 голосов
/ 02 мая 2020

Я не уверен, что вы подразумеваете под атомом c обменом, но, возможно, вы имеете в виду инструкцию сравнения и обмена.

  1. Инструкция сравнения и обмена проверяет ячейку памяти для заданного значения, и если значение в этой ячейке памяти равно заданному значению, она устанавливает ячейку памяти в новое значение. Это делается «атомарно», что означает, что пока эта инструкция выполняется, ничто другое не может выполняться в системе (давайте оставим это так), или выполнение этой инструкции не может быть прервано. Код для этого будет выглядеть примерно так -
function cas(p : pointer to int, old : int, new : int) returns bool {
    if *p ≠ old {
        return false
    }
    *p ← new
    return true
}

Почему это важно с точки зрения блокировки? Хорошо, предположим, что у вас есть мьютексная «блокировка» и два потока хотят получить доступ к блокировке, каждый поток должен проверить, равно ли значение мьютекса 1, и если оно равно 1, то поток должен установить его на 0. Если поток 1 и поток 2 оба попробуйте выполнить эту операцию одновременно, тогда для случая, когда инструкция не является атомом c, оба потока 1 могли бы видеть значение как 1. Поток 1 попытался бы установить значение 0, но прежде чем он достигнет этого оператора, он получает Затем поток 2 устанавливает значение 0, а затем поток 1 устанавливает его снова. Оба потока могут затем получить блокировку, думая, что они единственные, кто ее получил, что на самом деле является некорректным поведением.

Но если для сравнения и обмена используется атом c, это означает, что если поток находится внутри функции cas, изображенной выше, ни один другой поток не будет выполняться до тех пор, пока он не будет завершен с полным выполнением функции или выполнением гарантированно до sh за 1 цикл. Таким образом, thread1 обновит значение ячейки памяти до 0, а затем поток 2 вернет false.

...