То (разрешить одному из этих процессов продолжить работу)
иначе S:= S + 1
Мы будем предполагать, что очередь процессов, ожидающих на S, обслуживается в соответствии с дисциплиной "первый пришедший обслуживается первым" (FIFO). Подобно операции проверки и установки testandset, операции Р и V являются неделимыми. Участки взаимоисключения по семафору S в процессах обрамляются операциями P(S) и V(S). Если одновременно несколько процессов попытаются выполнить операцию P(S), это будет разрешено только одному из них, а остальным придется ждать. Семафоры и операции над ними могут быть реализованы как программно, так и аппаратно. Как правило, они реализуются в ядре операционной системы, где осуществляется управлениесменой состояния процессов. На рис. 4.9 приводится пример того, каким образом можно обеспечить взаимоисключение при помощи семафоров. Здесь примитив Р (активный) – эквивалент для "входвзаимоисключения", примитив V (активный) – для "выходвзаимоисключения". program примерсемафораодин; var активный: семафор; procedure процессодин; Begin while истина do Begin предшествующиеоператорыодин; Р(активный); критическийучастокодин; V (активный); прочиеоператорыодин End End; procedure процессдва; Begin while истина do Begin предшествующиеоператорндва; Р(активный); критическийучастокдва; V (активный); прочиеоператорыдва End End; Begin инициализациясемафора(активный,1),
процессодин; процессдва Parend Ends
|