Итак, начну. Только не смейтесь. Я задумал ось…
Она обладает модульной структурой, т. е. в режиме ядра исполняется только ядро и несколько жизненно важных процессов. Все драйверы и пользовательские программы работают в режиме пользователя с минимальными аппаратными привилегиями (защищенный режим x86).
Для общения между собой процессы используют передачу сообщений. Сообщение может передаваться только по специальным шинам, которые обслуживаются ядром.
Шины бывают четырех типов:
1. Адресная, она же системная. При передаче сообщений используется PID процесса-потомка, так как разрешено посылать их можно только в одну сторону.
2. Коллекторная. Все сообщения, передаваемые по этой шине, получает только процесс, создавший шину.
3. Распределенная. Сообщение получают все, кто подключен к шине – одновременно.
4. Конкурентная. Сообщение посылается первому попавшемуся свободному процессу, подключенному к шине.
Сообщения бывают двух типов:
а) блокирующее, когда отправитель блокируется в ожидании ответа и
б) уведомление – неблокирующее сообщение.
Если послать уведомление занятому процессу, оно просто проигнорируется и пропадет.
Любой процесс должен ответить на сообщение. Если этого не произойдет, система сама сформирует стандартный ответ.
Я считаю, что все эти ограничения могут защитить от взаимного блокирования процессов и, следовательно, снижают риск зависания.
А саму передачу можно организовать так:
а) методом "рандеву" (я думаю, все знают, что это);
б) или создать вытесняемое ядро, как в QNX. Т. е. ядро вызывает предварительно зарегистрированную процессом функцию-обработчик, при этом разрешив все прерывания. Выход из функции передает управление прерванному вызову ядра и все прерывания тут же запрещаются.