Атомарная инструкция

Много людей (включая мою компанию), кажется, использует MaxMind GeoIP.

у Них есть бесплатная версия GeoLite, который не так точен как заплаченная версия, но если Вы сразу после чего-то простого, это может быть достаточно хорошо.

6
задан skaffman 19 November 2009 в 09:56
поделиться

4 ответа

Некоторые машинные инструкции по сути являются атомарными - например, чтение и запись правильно выровненных значений размера слова собственного процессора является атомарным на многих архитектурах .

Это означает, что аппаратные прерывания, другие процессоры и гиперпотоки не могут прервать чтение или сохранение и чтение или запись частичного значения в одно и то же место.

Более сложные вещи, такие как чтение и запись вместе атомарно, могут быть достигнуты явными атомарными машинными инструкциями, например LOCK CMPXCHG на x86.

Блокировка и другие высокоуровневые конструкции построены на этих атомарных примитивах, которые обычно охраняют только одно слово процессора.

Некоторые умные параллельные алгоритмы могут быть построены с использованием только чтения и записи указателей, например, в связанные списки, общие для одного читателя и писателя,или с усилием, несколько читателей и писателей.

8
ответ дан 9 December 2019 в 22:36
поделиться

Атомар происходит от греческого ἄτομος (атомос), что означает «неделимый». (Предостережение: я не говорю по-гречески, так что, возможно, это действительно что-то другое, но большинство англоговорящих людей, ссылающихся на этимологию, интерпретируют это так.: -)

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

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

if (foo == 0)
{
   foo = some_function();
}

Но что, если это будет выполняться параллельно? Может случиться так, что программа получит foo , увидит его как ноль, в то время как поток 2 сделает то же самое и установит какое-то значение. Вернувшись в исходный поток, код по-прежнему считает foo равным нулю, и переменная назначается дважды.

Для подобных случаев ЦП предоставляет некоторые инструкции, которые могут выполнять сравнение и условное присвоение как атомарная сущность. Следовательно, test-and-set, compare-and-swap и load-connected / store-conditional. Вы можете использовать их для реализации блокировок (ваша ОС и ваша библиотека C сделали это). Или вы можете написать разовые алгоритмы, которые полагаются на примитивы, чтобы что-то делать. (Здесь есть кое-что интересное, но большинство простых смертных избегают этого, опасаясь ошибиться.)

увидеть его как ноль, тем временем поток 2 делает то же самое и устанавливает значение для чего-то. Вернувшись в исходный поток, код по-прежнему считает foo равным нулю, и переменная назначается дважды.

Для подобных случаев ЦП предоставляет некоторые инструкции, которые могут выполнять сравнение и условное присвоение как атомарная сущность. Следовательно, test-and-set, compare-and-swap и load-connected / store-conditional. Вы можете использовать их для реализации блокировок (ваша ОС и ваша библиотека C сделали это). Или вы можете написать разовые алгоритмы, которые полагаются на примитивы, чтобы что-то делать. (Здесь есть кое-что интересное, но большинство простых смертных избегают этого, опасаясь ошибиться.)

увидеть его как ноль, тем временем поток 2 делает то же самое и устанавливает значение для чего-то. Вернувшись в исходный поток, код по-прежнему считает foo равным нулю, и переменная назначается дважды.

Для подобных случаев ЦП предоставляет некоторые инструкции, которые могут выполнять сравнение и условное присвоение как атомарная сущность. Следовательно, test-and-set, compare-and-swap и load-connected / store-conditional. Вы можете использовать их для реализации блокировок (ваша ОС и ваша библиотека C сделали это). Или вы можете написать разовые алгоритмы, которые полагаются на примитивы, чтобы что-то делать. (Здесь есть кое-что интересное, но большинство простых смертных избегают этого, опасаясь ошибиться.)

код по-прежнему считает foo равным нулю, и переменная присваивается дважды.

Для подобных случаев ЦП предоставляет некоторые инструкции, которые могут выполнять сравнение и условное присвоение как атомарную сущность. Следовательно, test-and-set, compare-and-swap и load-connected / store-conditional. Вы можете использовать их для реализации блокировок (ваша ОС и ваша библиотека C сделали это). Или вы можете написать разовые алгоритмы, которые полагаются на примитивы, чтобы что-то делать. (Здесь есть кое-что интересное, но большинство простых смертных избегают этого, опасаясь ошибиться.)

код по-прежнему считает foo равным нулю, и переменная присваивается дважды.

Для подобных случаев ЦП предоставляет некоторые инструкции, которые могут выполнять сравнение и условное присвоение как атомарную сущность. Следовательно, test-and-set, compare-and-swap и load-connected / store-conditional. Вы можете использовать их для реализации блокировок (ваша ОС и ваша библиотека C сделали это). Или вы можете написать разовые алгоритмы, которые полагаются на примитивы, чтобы что-то делать. (Здесь есть кое-что интересное, но большинство простых смертных избегают этого, опасаясь ошибиться.)

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

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

4
ответ дан 9 December 2019 в 22:36
поделиться

Атомарность может быть гарантирована только ОС. Для этого ОС использует базовые функции процессора.

Таким образом, создание вашей собственной функции testandset невозможно. (Хотя я не уверен, можно ли использовать встроенный фрагмент asm и использовать мнемонику testandset напрямую (может быть, этот оператор может быть выполнен только с привилегиями ОС))

EDIT: Согласно комментариям под этим сообщением, возможно создание вашей собственной функции bittestandset напрямую с использованием директивы ASM (на Intel x86). Однако не ясно, работают ли эти уловки и на других процессорах.

Я придерживаюсь своей точки зрения: если вы хотите делать неприятные вещи, используйте функции ОС и не делайте этого самостоятельно

-4
ответ дан 9 December 2019 в 22:36
поделиться

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

Проблема хорошо проиллюстрирована на примере пример. Позволять' s скажем, у вас есть две программы, которые хотят создать файл, но только если файл еще не существует. Любая из двух программ может создать файл в любой момент времени.

Если вы это сделаете (я буду использовать C, так как это то, что в вашем примере):

 ...
 f = fopen ("SYNCFILE","r");
 if (f == NULL) {
   f = fopen ("SYNCFILE","w");
 }
 ...

вы не можете быть уверены, что другая программа не t создал файл между вашим открытым для чтения и вашим открытым для записи.

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

1
ответ дан 9 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: