Атомарные инструкции в семафорах

#multithreading #operating-system #synchronization #semaphore

Вопрос:

Я не понимаю, что значит, чтобы семафоры были атомарными. Определение ожидания и сигнала приведено ниже.

 wait(S){  while ( Slt;= 0)  ; // Busy wait  S--; }   signal(S) {  S  ; }  

В книге говорится

все изменения целочисленного значения второкурсника в операциях wait() и signal() должны выполняться атомарно. То есть, когда один процесс изменяет значение семафора, никакой другой процесс не может одновременно изменять то же значение семафора

Означает ли это, что никакие другие инструкции не могут выполняться между while(Slt;=0) и S-- ? и в какой момент выполняется процесс изменения значения семафора? это когда он, наконец, уменьшается С…?

Комментарии:

1. «Определение ожидания и сигнала приведено ниже» — обратите внимание, что, хотя это может быть какое-то определение на каком-то веб-сайте, оно не универсально. Объекты синхронизации ядра, такие как семафоры, не всегда заняты-подождите.

Ответ №1:

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

Нет. Это означает, что все изменения (такие как S-- ) должны выполняться атомарно, то есть никакой другой процесс не может одновременно пытаться изменить S , например, выполнив S in signal .

В какой момент выполняется процесс изменения значения семафора? это когда он, наконец, уменьшается С…?

Каждая модификация должна быть атомной, как говорится в объяснении. Таким образом, это делается для изменения значения в конце каждой модификации. Он может изменить его снова, но это будет отдельная модификация, которая также должна быть атомной.

Вы можете думать об «атомной модификации» как о такой, которая не перекрывает никакой другой атомарный доступ или модификацию. Были S и S-- не были атомарными, операция может быть потеряна, если, например, выполняются два процесса S и их операции перекрываются. Они могли оба читать S , оба увеличивать S , а затем оба записывать S , в результате S чего увеличивались только один раз.

Ответ №2:

Что означает, что любая операция должна быть атомарной, так это то, что она либо происходит, либо нет. Если какой-либо поток A выполняет атомарную операцию над некоторой коллекцией данных или над каким-либо объектом, а поток B проверяет объект/данные, то поток B должен либо видеть объект/данные такими, какими они были до начала операции, либо такими, какими они были после завершения операции. «Атомарный» означает, что поток B не может видеть объект/данные в состоянии «наполовину готово».

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


* За исключением, может быть, особых случаев, указанных в документации объекта.