/* с этого места процесс возобновляет выполнение, когда «пробуждается» */
if (к процессу не имеет отношения ни один из сигналов)
{
восстановить приоритет работы процессора таким, каким он был в момент приостанова процесса;
return (0);
}
}
удалить процесс из хеш-очереди приостановленных процессов, если он все еще находится там;
восстановить приоритет работы процессора таким, каким он был в момент приостанова процесса;
if (приоритет приостановленного процесса позволяет принимать сигналы)
return (1);
запустить алгоритм longjump;
}
Рисунок 6.31. Алгоритм приостанова процесса
На Рисунке 6.31 приведен алгоритм приостанова процесса. Сначала ядро повышает приоритет работы процессора так, чтобы заблокировать все прерывания, которые могли бы (путем создания конкуренции) помешать работе с очередями приостановленных процессов, и запоминает старый приоритет, чтобы восстановить его, когда выполнение процесса будет возобновлено. Процесс получает пометку «приостановленного», адрес приостанова и приоритет запоминаются в таблице процессов, а процесс помещается в хеш-очередь приостановленных процессов. В простейшем случае (когда приостанов не допускает прерываний) процесс выполняет переключение контекста и благополучно «засыпает». Когда приостановленный процесс «пробуждается», ядро начинает планировать его запуск: процесс возвращает сохраненный в алгоритме sleep контекст, восстанавливает старый приоритет работы процессора (который был у него до начала выполнения алгоритма) и возвращает управление ядру.
алгоритм wakeup /* возобновление приостановленного процесса */
входная информация: адрес приостанова
выходная информация: отсутствует
{
повысить приоритет работы процессора таким образом, чтобы заблокировать все прерывания;
найти хеш-очередь приостановленных процессов с указанным адресом приостанова;
for (каждого процесса, приостановленного по указанному адресу)
{
удалить процесс из хеш-очереди;
сделать пометку о том, что процесс находится в состоянии «готовности к запуску»;
включить процесс в список процессов, готовых к запуску (для планировщика процессов);
очистить поле, содержащее адрес приостанова, в записи таблицы процессов;
if (процесс не загружен в память)
возобновить выполнение программы подкачки (нулевой процесс);
else
if (возобновляемый процесс более подходит для исполнения, чем ныне выполняющийся)
установить соответствующий флаг для планировщика;
}
восстановить первоначальный приоритет работы процессора;
}
Рисунок 6.32. Алгоритм возобновления приостановленного процесса
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии