Mario
А когда это она стала традиционной? Мы имеем так много микроядер, что хоть седалищем кушай?
Здесь два десятка микроядер. А вообще их больше чем монолитных.
Схема Send->Recieve->Replay наверняка старше чем Minix. И в QNX крутится с модификациями с самого начала т.е с 80-х годов.
А как ты себе представляешь? Вот идешь ты по улице, идешь с закрытыми глазами, заткнутыми ушами - рядом идет поводырь, который тебе сообщает когда надо остановиться и когда надо повернуть?
Ну тогда небольшая лекция. Как это сделано у Таненбаума / QNX. Без описания передачи данных - в данном случае это не принципиально.
Есть очередь планировщика. В ней находятся процессы (потоки) готовые к исполнению. У каждого процесса есть набор флагов которые определяют состояние процесса.
"Ready" процесс выполняется или готов к исполнению и находится в очереди планировщика.
"Send blocked" - процесс ожидает отправки сообщения.
"Recieve blocked" - процесс ожидает получения сообщения.
"Replay blocked" - процесс ожидает ответа на сообщение.
В любом из этих состояний процесс исключается из очереди планировщика и
никогда не получит управление.
Каждый процесс хранит список процессов обратившихся с запросами.
Как работает IPC.
Клиент вызывает Send();
Если адресат (сервер) готов к приёму IPC (т.е. находится в состоянии "Recieve blocked") то клиент переходит к ожиданию ответа "Replay blocked" и исключается из очереди планировщика. У сервера сбрасывается "Recieve blocked" и если другие блокирующие флаги не установлены то он переходит в состояние "Ready" и помещается в очередь планировщика.
Если адресат не готов к приёму IPC клиент переходит в состояние "Send blocked", исключается из очереди планировщика и помещается в список запросов адресата.
Со стороны сервера:
Сервер вызывает Recieve().
Если в его списке есть процесс ожидаещий отправки IPC ("Send blocked") то этот процесс переходит в состояние "Replay blocked" и исключается из списка.
Если список пуст (нет ожидающих процессов) то сервер переходит в состояние "Recieve blocked"
Сервер вызывает Replay().
Если адресат находится в состоянии "Replay blocked" то состояние сбрасывается и и если другие блокирующие флаги не установлены то он переходит в состояние "Ready" и помещается в очередь планировщика.
В микроядре L4 v2 все эти функции Send() Recieve() Replay() ReplyWait() очень оригинально сделаны на базе одного системного вызова Ipc()