OSDev
http://osdev.su/

Что делать если все процессы ждут?
http://osdev.su/viewtopic.php?f=5&t=329
Страница 1 из 1

Автор:  KIV [ 03 авг 2010, 15:52 ]
Заголовок сообщения:  Что делать если все процессы ждут?

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

Автор:  phantom-84 [ 03 авг 2010, 16:29 ]
Заголовок сообщения:  Re: Что делать если все процессы ждут?

Делать HLT в контексте этого самого системного потока. У меня "system idle" поток занимается обнулением страниц, а когда нет работы, отдает управление другому потоку или делает HLT, если он единственный рабочий поток. Уничтожением потоков занимается другой системный поток.

Автор:  KIV [ 03 авг 2010, 21:31 ]
Заголовок сообщения:  Re: Что делать если все процессы ждут?

У меня системная нить, прибивающая процессы, тоже делает HLT, если никто из процессов не просит, чтобы его завершили. Однако с другой стороны вне зависимости от наличия работы этой нити дают управление. То есть даже если у меня несколько потоков активны и ни один не завершился, то всё равно 1 мс будет затрачена на системную нить, которая в данном случае просто сделает HTL.

Автор:  phantom-84 [ 04 авг 2010, 07:01 ]
Заголовок сообщения:  Re: Что делать если все процессы ждут?

Это криво. HLT нужно делать по условию, когда нет вообще никакой работы. А то, что поток получает управление, это нормально. Просто сделай так, чтобы в случае отсутствия работы он не ждал истечения своего кванта времени, а добровольно отдавал управление другому потоку, если таковой имеется. Можно использовать поток, делающий только HLT, который бы автоматически вымещался любым другим потоком.

Автор:  KIV [ 08 авг 2010, 16:31 ]
Заголовок сообщения:  Re: Что делать если все процессы ждут?

Сделал. Теперь есть процедура switch_to_next_thread. При ожидании сообщения или в главном потоке ядра при отсутствии работы вызывается эта процедура. Также я добавил системный вызов. Таким образом приложения пользователя, если посчитают, что им больше делать не чего, могут отдать свой оставшийся квант времени тому, кому он действительно нужен (а если таковых нет, то происходит HLT).

Автор:  pushkoff [ 24 авг 2010, 01:30 ]
Заголовок сообщения:  Re: Что делать если все процессы ждут?

создай поток который будет в цикле вызывать HLT и назови его Idle. он должен быть всегда активен, но получать управление должен только если нет других потоков... поставь ему самый маленький приоритет, так что любой другой проснувшийся поток вытеснит этот...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/