Языки программирования - концепции и принципы

выполняется атомарно без возможности прерывания


Точно так же Signal(S) выполняется атомарно без возможности прерывания другим процессом между загрузкой и сохранением S. Проблема взаимных исключений решается следующим образом:

Ada

procedure Main is

      S: Semaphore := 1 ;

      task T_i;                                                   -- Одна из многих

      task body T_i is

      begin



           loop

              Wait(S);

              Critical_Section;

              Signal(S);

              Non_Critical_Section;

          end loop;

     end T_i;

begin

     null;

end Main;

    Мы предлагаем читателю самостоятельно убедиться в том, что это реше­ние является правильным.

    Конечно, самое простое — это переложить бремя решения проблемы на разработчика системы поддержки этапа выполнения.

 

12.4. Мониторы и защищенные переменные

 

Проблема, связанная с семафорами и аналогичными средствами, обеспечи­ваемыми операционной системой, состоит в том, что они не структурны. Ес­ли нарушено соответствие между Wait и Signal, программа может утратить синхронизацию или блокировку. Для решения проблемы структурности была разработана концепция так называемых мониторов (monitors), и они реализованы в нескольких языках. Монитор — это совокупность данных и подпрограмм, которые обладают следующими свойствами:

• Данные доступны только подпрограммам монитора.

• В любой момент времени может выполняться не более одной подпро­граммы монитора. Попытка процесса вызвать процедуру монитора в то время, как другой процесс уже выполняется в мониторе, приведет к при­остановке нового процесса.

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

Содержание раздела