Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
27
Добавлен:
17.04.2013
Размер:
60.93 Кб
Скачать

Диспетчеризация. Цикл планирования

Диспетчер (планировщик) ОС предоставляет процессор в распоряжение нити. Приостанавливает выполнение одной нити и активизацию другой, готовой к выполнению.

Как передается управление планировщику?

(1) Принцип «спящей красавицы» (Windows 3.1):ждать пока процесс сам отдаст управление в результате выполнения некоторого системного вызова.

(2) Использовать прерывания от таймера по истечению определенного кванта времени, вызывать планировщик и переключать контекст.

Диспетчер (планировщик) включается по прерыванию таймера и, если истек установленный квант времени, то выполнить следующие действия:

  • Сохранить состояние активной нити (регистры в области процесса)

  • Выбрать следующую нить из очереди готовых для выполнения

  • Восстановить состояние выбранной нити

  • Передать управление нити

Что если очередь готовых пуста?

Для этого существует фиктивная нить ядра ОС, которая ничего не делает. Зато всегда есть кому выделить процессор.

Что если происходит переключение с нити одного процесса на нить другого процесса?

Необходимо переключать активное адресное пространство (изменять регистр таблицы сегментов или страниц)

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

По какому принципу выбирать нить для выполнения из очереди готовых (RANDOM, LIFO, FIFO)?

Создание процесса и нити Создание нити в лабораторном практикуме (конструктор dosThread)

  • Создает дескриптор (DOSThreedManager)

  • Выделяет память для стека

  • Формирует начальное состояние стека, такое которое требуется планировщику для активизации нити. В частности, в стек должны быть занесены: адрес точки входа в процедуру нити, значения для регистров ЦП и регистра флагов.

  • Разместить в очереди готовых к выполнению

Создание процесса в unix

If (!fork())

{

execl(prog,…,0);

exit(1);

}

Создание процесса в Win32api

Объект процесс и его главная нить создаются следующим вызовом

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

);

lpApplicationName- полное путевое имя программы

lpCommandLine– командная строка (параметры)

lpProcessAttributes–атрибуты защиты и возможность наследования дескриптора процесса дочерними процессами

lpThreadAttributes-атрибуты защиты для главной нити

bInheritHandles- если TRUE то порождаемый процесс наследует объекты, которые разрешены для наследования

dwCreationFlags–режим создания процесса (CREATE_SUSPENDED не запускать сразу главную нить, класс приоритета процесса)

lpEnvironment– блок переменных окружения для создаваемого процесса (если задан)

lpCurrentDirectory–текущая директория для создаваемого процесса

lpStartupInfo– указатель на структуру STARTUPINFO, которая определяет как открывается окно для порождаемого процесса

lpProcessInformation– указатель на структуру PROCESS_INFORMATION, в которую записывается идентификационная информация о процессе

Примечание

Лучший способ завершить процесс – выполнить в нем ExitProcess, поскольку все подключенныеDLL уведомляются о завершении программы.

Объект процесс остается в системе до тех пор пока на него существуют ссылки (при запуске их две: собственная и от родителя)

Соседние файлы в папке вар1