Семафоры для синхронизации процессов - PullRequest
1 голос
/ 13 июня 2011

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

Вот мой вопрос на данный момент:

Я прочитал в «Концепции операционной системы», что: "* Семафор S - это целочисленная переменная, к которой, кроме инициализации, обращаются только через две стандартные атомарные операции: wait () и signal (). " *

Что здесь означает атомное?Означает ли это, что эта операция будет выполнена за один раз?

Но затем в книге дается один пример реализации wait ():

wait(S) {
while S <= 0
; // no-op
S--;
}

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

Пожалуйста, объясните,

Ответы [ 2 ]

1 голос
/ 13 июня 2011

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

Однако, технически пример можно заставить работать.Если S был помечен как изменчивый, то wait () увидит изменение любого другого процесса или потока.wait () будет вращаться в тесной петле, пока условие не будет выполнено, и будет жевать процессор, но это будет работать.Обратите внимание, что это жевание процессора - вот почему ОС приостанавливает вызывающий поток, если условие не может быть выполнено.Вам нужно было бы выполнить тестирование и декрементарно атомарно, и обычно это выполняется с помощью атомарной функции ОС, такой как InterlockedCompareExchange в Windows.

0 голосов
/ 13 июня 2011

Означает ли это, что эта операция будет выполнена за один раз?

По сути, да.

Пример не является реальной реализацией (я надеюсь!), А просто представляет функциональность в стиле C.Фактические реализации зависят от ОС / ЦП, так как требуется поддержка ядра / аппаратного обеспечения, чтобы исключить ожидание занятости и обеспечить правильную работу на многоядерных процессорах.

Rgds, Martin

...