Вопрос 17(4). Работы с временными интервалами

В самом названии РВ заложена проблематика времени. Во многих функциях используется время.

Если какой-то процесс в системе "завис" в ожидании сообщения, то как его "вычислить"? Чтобы процесс не "висел" в бесконечном ожидании сообщения, оставлена только функция получения сообщения с ограничением на время ожидания.

Есть аппаратный таймер, который каждые 10 мс выдаёт прерывание. К нему очередь процессов, которые надо "разбудить". Очередь упорядочена по возрастанию.

Классическое решение (псевдопараллелизм):

Есть работающий процесс.

Его прервали.

Управление передаётся диспетчеру, который даёт поработать P1, P2 (они такие, что отработают быстро), потом поработают P3, P4, P5, потом снова P1, P2.

Что плохо:

редко какой процесс работает долго;

прерывание процесса (сворачивание) – занимает очень много команд (200-300).

Лучше процесс не прерывать (+600 команд), а дать ему доработать (20-30 команд).

Правильное решение (очередь временных событий):

 
 

пусть имеется три процесса. Пусть их надо будить через 10, 30, 100 мс соответственно. Образуется очередь:

Уменьшаем на единицу только первое значение (вычитание происходит аппаратно). Когда доходит до нуля, значит подаём сигнал этому процессу, смещаем указатель в очереди.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: