ВУЗ:
Составители:
Рубрика:
– загрузить контекст процесса k в системный стек;
– осуществить переключение контекста;
4) перед переключением контекста необходимо изменить значение указателя текуще-
го процесса.
procedure запустить (k : int);
var
p: связь;
i : int;
begin
p:= начало;
i := 1;
while i<>k do
begin
p:=p^.следующий;
i:=i+1;
end;
p^.состояние :=true;
if
p^.приоритет > текущий процесс^.приоритет
then
begin
передать контекст процесса (текущий процесс^.адрес стека);
загрузить контекст процесса (p^.адрес стека);
текущий процесс :=р;
end;
переключить контекст;
end.
Лекция 6. Управление процессами с тремя состояниями
В рассмотренных выше примерах выполняющийся процесс не может приостановить
себя, оставшись в состоянии готовности. Процесс, находящийся в состоянии ожидания, мо-
жет быть переведён в состояние готовности только другим процессом.
Рассмотрим ситуацию:
Pi – активный процесс. Pi должен активизировать некоторый драйвер Pk.
Pk – выполняет порцию вывода данных и активизирует Pi и т. д.
Это неудобно, так как к Pk могут обращаться разные процессы, и заранее не известно
какой процесс надо будет ему активизировать. Удобна следующая схема работы:
Pi переводит в состояние готовности Pk и и переводит себя в состояние ожидания, со-
храняя при этом состояние готовности. Таким образом, в списке процессов два готовых про-
цесса Pi и Pk. Допустим, что Pk имеет более высокий приоритет (расположен ближе к началу
списка). В этом случае диспетчер выбирает и активизирует Pk. Если Pk закончит работу с
помощью команды “Ждать”, которая переведёт Pk в состояние ожидания, то в качестве
следующего активного процесса будет выбран Pi.
Чтобы реализовать желаемые способы работы введём ещё одно состояние процесса.
Для обозначения трёх состояний одной булевской переменной недостаточно, поэтому, кроме
переменной “состояние” введём переменную “сигнал”.
Var
состояние, сигнал : boolean;
– загрузить контекст процесса k в системный стек; – осуществить переключение контекста; 4) перед переключением контекста необходимо изменить значение указателя текуще- го процесса. procedure запустить (k : int); var p: связь; i : int; begin p:= начало; i := 1; while i<>k do begin p:=p^.следующий; i:=i+1; end; p^.состояние :=true; if p^.приоритет > текущий процесс^.приоритет then begin передать контекст процесса (текущий процесс^.адрес стека); загрузить контекст процесса (p^.адрес стека); текущий процесс :=р; end; переключить контекст; end. Лекция 6. Управление процессами с тремя состояниями В рассмотренных выше примерах выполняющийся процесс не может приостановить себя, оставшись в состоянии готовности. Процесс, находящийся в состоянии ожидания, мо- жет быть переведён в состояние готовности только другим процессом. Рассмотрим ситуацию: Pi – активный процесс. Pi должен активизировать некоторый драйвер Pk. Pk – выполняет порцию вывода данных и активизирует Pi и т. д. Это неудобно, так как к Pk могут обращаться разные процессы, и заранее не известно какой процесс надо будет ему активизировать. Удобна следующая схема работы: Pi переводит в состояние готовности Pk и и переводит себя в состояние ожидания, со- храняя при этом состояние готовности. Таким образом, в списке процессов два готовых про- цесса Pi и Pk. Допустим, что Pk имеет более высокий приоритет (расположен ближе к началу списка). В этом случае диспетчер выбирает и активизирует Pk. Если Pk закончит работу с помощью команды “Ждать”, которая переведёт Pk в состояние ожидания, то в качестве следующего активного процесса будет выбран Pi. Чтобы реализовать желаемые способы работы введём ещё одно состояние процесса. Для обозначения трёх состояний одной булевской переменной недостаточно, поэтому, кроме переменной “состояние” введём переменную “сигнал”. Var состояние, сигнал : boolean;
Страницы
- « первая
- ‹ предыдущая
- …
- 11
- 12
- 13
- 14
- 15
- …
- следующая ›
- последняя »