В самом названии РВ заложена проблематика времени. Во многих функциях используется время.
Если какой-то процесс в системе "завис" в ожидании сообщения, то как его "вычислить"? Чтобы процесс не "висел" в бесконечном ожидании сообщения, оставлена только функция получения сообщения с ограничением на время ожидания.
Есть аппаратный таймер, который каждые 10 мс выдаёт прерывание. К нему очередь процессов, которые надо "разбудить". Очередь упорядочена по возрастанию.
Классическое решение (псевдопараллелизм):
Есть работающий процесс.
Его прервали.
Управление передаётся диспетчеру, который даёт поработать P1, P2 (они такие, что отработают быстро), потом поработают P3, P4, P5, потом снова P1, P2.
Что плохо:
редко какой процесс работает долго;
прерывание процесса (сворачивание) – занимает очень много команд (200-300).
Лучше процесс не прерывать (+600 команд), а дать ему доработать (20-30 команд).
Правильное решение (очередь временных событий):
пусть имеется три процесса. Пусть их надо будить через 10, 30, 100 мс соответственно. Образуется очередь:
Уменьшаем на единицу только первое значение (вычитание происходит аппаратно). Когда доходит до нуля, значит подаём сигнал этому процессу, смещаем указатель в очереди.