ВУЗ:
Составители:
14
Для б):
Установить (S):
S:=S-1;
if S<0 then
begin
Перевести процесс, выполнить “Установить” в “блокированное” состояние;
Включить этот процесс в очередь S;
Выполнить процедуру “Переключить” для запуска очередного “готового” процесса.
End;
Освободить (S);
S:=S-1;
if
S=<0 then
Выбрать процесс из очереди S и перевести его из состояния “блокирован” в состояние “го-
тов”;
Числовой семафор с отрицательными значениями показывает число процессов, нахо-
дящихся в очереди S. С каждым S может быть связана как очередь, работающая по принципу
FIFO, так и некоторый список процессов, из которого выбор процессов может осуществлять-
ся, например, согласно их приоритету. Основной вопрос – обеспечение неделимости опера-
ций “Установить”, “Освободить”.
В однопроцессорной системе неделимость этих операций можно обеспечить путём запреще-
ния прерываний.
В многопроцессорном комплексе, работающем с общей памятью, этого недостаточно.
Рассмотрим случай однопроцессорной системы. Семафор предоставляется 2-мя полями:
type
семафор = record
счётчик : integer;
начало очереди : связь6; {переменная ссылочного типа}
end;
элемент очереди = record
следующий : связь6;
адрес дискриптора : связь
end;
Procedure Установить(S: семафор);
Var
P1: связь;
begin
Запретить прерывания;
if S.счётчик = 1 then S.счётчик := 0;
{Закрыть семафор}
else
begin
Перевести (текущий процесс, начало САП, начало СБП);
Счётчик
Начало очереди
Ссылка н
а
дискрип-
тор про-
цесса
Nil
Для б): Установить (S): S:=S-1; if S<0 then begin Перевести процесс, выполнить “Установить” в “блокированное” состояние; Включить этот процесс в очередь S; Выполнить процедуру “Переключить” для запуска очередного “готового” процесса. End; Освободить (S); S:=S-1; if S=<0 then Выбрать процесс из очереди S и перевести его из состояния “блокирован” в состояние “го- тов”; Числовой семафор с отрицательными значениями показывает число процессов, нахо- дящихся в очереди S. С каждым S может быть связана как очередь, работающая по принципу FIFO, так и некоторый список процессов, из которого выбор процессов может осуществлять- ся, например, согласно их приоритету. Основной вопрос – обеспечение неделимости опера- ций “Установить”, “Освободить”. В однопроцессорной системе неделимость этих операций можно обеспечить путём запреще- ния прерываний. В многопроцессорном комплексе, работающем с общей памятью, этого недостаточно. Рассмотрим случай однопроцессорной системы. Семафор предоставляется 2-мя полями: Счётчик Начало очереди Nil Ссылка на дискрип- тор про- цесса type семафор = record счётчик : integer; начало очереди : связь6; {переменная ссылочного типа} end; элемент очереди = record следующий : связь6; адрес дискриптора : связь end; Procedure Установить(S: семафор); Var P1: связь; begin Запретить прерывания; if S.счётчик = 1 then S.счётчик := 0; {Закрыть семафор} else begin Перевести (текущий процесс, начало САП, начало СБП); 14
Страницы
- « первая
- ‹ предыдущая
- …
- 12
- 13
- 14
- 15
- 16
- …
- следующая ›
- последняя »