У меня микроядро. Вполне нормальной ситуацией является, когда все нити чего то ждут. Например, сообщений. Мой планировщик задач крайне прост - обычный циклический переключатель. Без приоритетов и прочего. Сейчас он настроен на то, чтобы пропускать нити, которые ждут сообщения, если их очередь сообщений пуста. Однако если активных нитей не останется, то он будет бесконечно перебирать все дескрипторы нитей, а поскольку IRQ0 (ну или IRQ2, если тестировать не в Bochs) достаточно приоритетное, то будут заблокированы прочие прерывания и система скорее всего никогда уже не выйдет из зависания (потому что в такой ситуации как правило активизируется один из серверов по IRQ и посылает сообщения кому надо). Сейчас от такого трагического исхода событий спасает то, что есть нить ядра, которая помогает программам завершаться (программа не может завершить сама себя. её должна завершить другая). Она обрабатывает запросы программ на завершения. И делает это не через сообщения, а через переменные (ждёт пока переменная станет не 0, а указателем на информацию о нити/процессе) и соответсвенно никогда не будет пропущена планировщиком то есть всегда будет как минимум одна активная нить. Как лучше это реализовать (чтобы система не зависала, когда все нити ждут сообщения)?
|