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

3.5. Примитивы создания и уничтожения процессов

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

Конкретная реализация примитива зависит от реализации ядра.

Условная запись примитива создания процесса может выглядеть следующим образом:

TProcess * Создать_Процесс(void * procname, int priority, int stacksize)

//Данные - точка входа, приоритет, размер стека и др.

{

ПРОЛОГ;

КОНТРОЛЬ;

<

Создать дескриптор;

Заполнить поля дескриптора;

Ввести процесс в очередь готовых процессов;

>

ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;

}

Активный процесс создает новый процесс вызовом:

TProcess * P = Создать_Процесс(procname,priority,stacksize);

Могут быть синтаксические различия в вызовах примитивов в различных средах.

Уничтожение процесса

Для уничтожения процесса логично выполнить действия, обратные созданию процесса:

void Уничтожить_Процесс(TProcess * P)

{

ПРОЛОГ;

КОНТРОЛЬ;

<

Вывести процесс из очереди, в которой он находится;

Разрушить дескриптор процесса;

>

ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;

}

Такой вид примитива Уничтожить_Процесс допустим, если некоторый выполняющийся процесс Р, хочет уничтожить некоторый процесс Q.

Хотя и здесь есть проблемы, а именно:

  1. Если процесс будет уничтожен в критическом участке, то это может вызвать блокировку, т.к. он никогда не сможет освободить занятый ресурс. Поэтому уничтожение процесса должно сопровождаться освобождением ресурсов, выделенных ему. Может быть, по протоколу ядра должны быть уничтожены и процессы-наследники. Для этого в дескриптор процесса включаются указатели на списки выделенных ресурсов и процессов-наследников. Т.е. реальный примитив Уничтожить_Процесс может оказаться гораздо сложнее.

  1. Такой вариант примитива не может быть использован для уничтожения процессом самого себя. Предположим, что выполняющийся процесс вызывает примитив Уничтожить_Процесс(Self). В соответствие с кодом примитива сначала разрушается дескриптор, а затем вызывается примитив ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР. Т.к. примитиву ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР передаются указатели на дескрипторы процессов: «от кого» и «кому» , а дескриптор «от кого» уже разрушен, то вызов примитива ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР окажется некорректным. Т. е. разрушен дескриптор процесса, который еще выполняется.

Поэтому уничтожение процессов выполняется несколько иначе.

  1. Создается специальная очередь уничтожаемых процессов;

  1. Примитив Уничтожить_Процесс в действительности не уничтожает процесс, а переводит его в эту очередь уничтожаемых процессов. Т. е. примитив Уничтожить_Процесс имеет следующий вид:

void Уничтожить_Процесс(TProcess * P)

{

ПРОЛОГ;

КОНТРОЛЬ;

<

Вывести процесс из очереди, в которой он находится;

Ввести процесс в очередь уничтожаемых процессов;

>

ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;

}

При каждом вызове процедуры Диспетчера осуществляется очистка очереди уничтожаемых процессов с фактическим их уничтожением.

Таким образом, диспетчер модифицируется следующим образом:

void interrupt Диспетчер()

{

ОЧИСТИТЬ_ОЧЕРЕДЬ_УНИЧТОЖАЕМЫХ_ПРОЦЕССОВ;

ПЕРЕНАЗНАЧИТЬ_ПРОЦЕССОР;

}

21

Соседние файлы в предмете Операционные системы