> man operating_systems
Bossa, framework для разработки планировщиков
Среда для разработки планировщиков, рассмотрение работы планировщиков
на Пятница, 23 Июль 2004, 00:25
добавил: Кристоф Ожие (Christophe Augier) список авторов печатать элемент контента создать pdf-файл  элемент контента
категория Статьи
комментарии: 0
просмотров: 2161


Политика Bossa разделена на пять основных частей:
1.Определение структуры процесса
2.Объявление различных состояний
3.Критерии, по которым выбирается следующий процесс для запуска
4.Обработка событий планировщика
5.Интерфейс, позволяющий пользовательски программам управлять некоторыми аспектами политики
Каждая из этих частей подробно рассмотрена ниже.
Определение структуры процесса
Поскольку наша политика кругового обслуживания представляет собой планировщик процессов, мы должны объявить атрибуты процесса, которые будут использоваться политикой.

process = {
    int time_slice;
}

Это объявление означает, что каждый процесс имеет атрибут time_slice, который будет использоваться для хранения времени, в течении которого обрабатывается процесс. Управляя процессом p мы можем получить доступ к времени его выполнения, используя p.time_slice.

Состояния

<img src='files/images/articles/diagram3.png' />

Состояния жизни процесса

Состояния процесса за период его жизни могут упрощено быть охарактеризован, как: запущен, готов, блокирован и остановлен. В Bossa присутствует два типа состояний:
1.Классы состояний: Запущен, Готов, Блокирован, Остановлен. Это основные состояния жизни процесса с точки зрения ядра.
2.Состояния: это состояния, объявленные разработчиком, и используемые в политике планировщика. Состояние всегда ассоциируется с классом состояния.
Давайте посмотрим, как в Bossa объявляются состояния:

states = {
    RUNNING running : process;
    READY active : sorted fifo queue;
    BLOCKED blocked : queue;
    TERMINATED terminated;
}


Выше, мы объявили четыре состояния: запущен(running), активен(active), блокирован(blocked), и остановлен(terminated). Состояние запущен(running) оссоциируется с классом состояния RUNNING и ссылается на уникальный процесс. Состояние активен(active) оссоциируется с классом состояния READY(готов) и ссылается на очередь процессов, которая обслуживается в режиме fifo (first-in first-out - "первым пришел - первым "). (sorted будет обсуждаться в следующем разделе).
running ссылается на процесс, запущенный в данный момент, в то время как active ссылается на очередь, содержащую все процессы, готовые быть выполненными, blocked ссылается на блокированные процессы, а terminated не ссылается ни на один процесс, т.е. похоже на /dev/null, так как изменение состояния процесса на terminated уничтожает все ссылки на него.

Выбор

Выбор - вероятно главная часть всех планировщиков, поскольку поведение (правильное выделение времени процессу, комплексность, и т.д.) политики планирования зависит, от способа выбора следующего запущенного процесса. Язык Босса обеспечивает возможность упростить спецификацию выбора процесса. Он позволяет пользователю определять критерии, по которым будет выбран следующий процесс из ряда. Разработчик использует аннотацию, sorted, чтобы указать состояние (и структуру данных), к которому должны быть применены критерии выбора. В предыдущем разделе, мы объявляли очередь, содержащую процессы c состоянием active как sorted. Выбор, соответственно, будет произведен только из процессов с этим состоянием.
Критерии определяются при помощи ключевого слово ordering_criteria. Например, если следующим запущенным процессом должен быть процессом с самым высоким приоритетом, это должно быть определено как:
ordering_criteria = { highest priority }
В случае, если существует несколько процессов с самым высоким приоритетом, следующий процесс будет выбран в соответствии с положением этих процессов в очереди.
Вернемся к нашему примеру. Планировщик при осуществлении алгоритма кругового обслуживания всего лишь получает следующий процесс из очереди процессов, так что нет необходимости объявлять какие бы то ни было критерии.

ordering_criteria = { }


Обработка событий

Bossa, как уже было сказано выше, заменяет разбросанный по по всему ядру код фиксированным интерфейсом событий планировщика. В этой секции мы рассмотрим, какие события доступны и как с ними работать. Поскольку эта статья - лишь краткий обзор возможностей Bossa, мы рассмотрим только основные события: new, block, unblock, clocktick, schedule и end .
Сначала давайте посмотрим, как объявляется набор обработчиков событий:

handler(event e) {

    On event_name_1 {
        /* какие-то действия */
    }

    On event_name_2 {
        e.target.attribute = X;
         //e.target – процесс, на который нацелено событие e
        e.source.attribute = Y;
         //e.source – процесс, сгенерировавшийсобытие e
    }
}


new

Событие new - первый шаг в жизни процесса. Ядро Linux выполняет всю работу по размещению процесса и других ресурсов в памяти. Политика должна всего лишь инициализроватьданные для планировщика и состояние процесса.


On process.new  {
    e.target.time_slice = 30;
    e.target => active;
}


Данный код присваивает свойству time_slice 30 единиц и помечает процесс как active, соответственно, теперь он может быть запущен.

block

Это событие весьма часто во время жизни процессов, основаных на вводе/выводе. Оно происходит, когда процесс блокируется, например, для ожидания ввода пользователя.

 On block.* { // для обработки всех событий блокирования можно использовать маску * 
    e.target => blocked;
}

Все заблокированныепроцессы мы помечаем, как blocked, в результате чего они не могут быть запущены.

unblock

Как противовес событию block.*, событие unblock.* происходит, когда процесс разблокируется, к примеру, если пользователь что-то напечатал.

On unblock.* {
    if (e.target in blocked) {  // если e.target блокирован
        e.target => active;
    }
}

Данный обработчик проверяет, находится ли процесс в состоянии blocked. Если да, мы изменяем его состояние с blocked на active. Оператор => автоматически удаляет процесс из структуры данных (очередь, переменная процесса, список, дерево...), ассоциируемой с его текущим состоянием.

индекс статьи
страница 1 : страница без заголовка
страница 2 - текущая : страница без заголовка
страница 3 : страница без заголовка


© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.