Архитектура операционной системы UNIX


         

События, вызывающие приостанов выполнения, и их адреса - часть 2


алгоритм sleep входная информация: (1) адрес приостанова (2) приоритет выходная информация: 1, если процесс возобновляется по сиг- налу, который ему удалось уловить; вызов алгоритма longjump, если процесс возобновляется по сигналу, который ему не удалось уловить; 0 - во всех остальных случаях; { поднять приоритет работы процессора таким образом, чтобы заблокировать все прерывания; перевести процесс в состояние приостанова; включить процесс в хеш-очередь приостановленных процес- сов, базирующуюся на адресах приостанова; сохранить адрес приостанова в таблице процессов; сделать ввод для процесса приоритетным; если (приостанов процесса НЕ допускает прерываний) { выполнить переключение контекста; /* с этого места процесс возобновляет выполнение, когда "пробуждается" */ снизить приоритет работы процессора так, чтобы вновь разрешить прерывания (как было до приостанова про- цесса); возвратить (0); }

/* приостанов процесса принимает прерывания, вызванные сигналами */ если (к процессу не имеет отношения ни один из сигналов) { выполнить переключение контекста; /* с этого места процесс возобновляет выполнение, когда "пробуждается" */ если (к процессу не имеет отношения ни один из сигна- лов) { восстановить приоритет работы процессора таким, каким он был в момент приостанова процесса; возвратить (0); } } удалить процесс из хеш-очереди приостановленных процес- сов, если он все еще находится там;

восстановить приоритет работы процессора таким, каким он был в момент приостанова процесса; если (приоритет приостановленного процесса позволяет принимать сигналы) возвратить (1); запустить алгоритм longjump; }

Рисунок 6.31. Алгоритм приостанова процесса




Содержание  Назад  Вперед