OSDev http://osdev.su/ |
|
Планировщик http://osdev.su/viewtopic.php?f=6&t=429 |
Страница 11 из 11 |
Автор: | phantom-84 [ 17 авг 2011, 16:37 ] |
Заголовок сообщения: | Re: Планировщик |
418ImATeapot писал(а): Да, смешивает. Приоритет в данном случае указывает на шансы данного потока попасть в очередь. Плохо поддающаяся анализу схема. В очередь могут попасть далеко не все высокоприоритетные потоки и наоборот менее приоритетные потоки могут начать серьезную конкуренцию с более приоритетными, особенно если первых много, а последних мало.Цитата: (время простоя << приоритет) Не понял.Цитата: Пусть "пустое место" будет "бездействие системы". В смысле "бездействие"? Потоки в очереди есть, но они не всегда располагаются в смежных элементах статической очереди. Чтобы найти действительно поток, а не "пустое место" ("держатель места"), ты должен циклически выполнять обход очереди в поисках элемента, у которого установлен флаг готовности, ну или делать что-то типа этого. Это чисто рабочий момент, показывающий, что статическая структура для очереди выполнения не слишком-то подходит.
Соответственно, чтобы удалить поток из очереди свитчера, достаточно заменить его "дескриптор" на "дескриптор" "бездействие системы". |
Автор: | 418ImATeapot [ 05 сен 2011, 16:43 ] |
Заголовок сообщения: | Re: Планировщик |
******************************************************************* Пока есть время, сел переделывать. На бумажке все расписал. Получилось как-то так: Основные компоненты системы планирования: GenerateEvent, планировщик, переключатель. Объекты системы планирования: событие, работа и поток. Событие - это вызов системной функции GenerateEvent (возможно, имеет смысл "спрятать" эту функцию внутрь ядра). Работа - это обработчик события. Работы могут быть четырех приоритетов: Real Time, Interactive, Normal, Blocker. При вызове GenerateEvent просматривает списки работ, ищет нужные и запускает их. Если запускаемая работа - Normal, GenerateEvent просто создает дескриптор потока, соответствующий этой работе. Если запускаемая работа - Interactive, GenerateEven создает дескриптор потока и запускает этот поток. Если запускаемая работа - Real Time, GenerateEvent останавливает квантовый таймер и запускает поток. Если запускаемая работа - Blocker, GenerateEvent создает дескриптор потока, соответствующий этой работе и блокирует все остальные потоки и работы процесса. Планировщик запускается после выполнения GenerateEvent, системных функций создающих или уничножающих потоки и работы и по сигналу переключателя. Он просматривает списки потоков и наполняет ими очередь переключателя. При этом учитывается приоритет потоков. Переключатель запускает потоки из очереди по сигналу таймера и переодически вызывает планировщик. Фуф... Пожалуйста, ткните носом! |
Страница 11 из 11 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |