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/