OSDev

для всех
Текущее время: 21 авг 2018, 22:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 03 авг 2010, 15:52 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 авг 2010, 16:29 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1197
Делать HLT в контексте этого самого системного потока. У меня "system idle" поток занимается обнулением страниц, а когда нет работы, отдает управление другому потоку или делает HLT, если он единственный рабочий поток. Уничтожением потоков занимается другой системный поток.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 авг 2010, 21:31 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 авг 2010, 07:01 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 авг 2010, 16:31 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 авг 2010, 01:30 

Зарегистрирован: 27 апр 2007, 22:51
Сообщения: 84
создай поток который будет в цикле вызывать HLT и назови его Idle. он должен быть всегда активен, но получать управление должен только если нет других потоков... поставь ему самый маленький приоритет, так что любой другой проснувшийся поток вытеснит этот...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB