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

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

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

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

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

Вопрос (

Procedure Создать_Процесс(Var P : Process; Данные);

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

Begin

ПРОЛОГ;

КОНТРОЛЬ;

<

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

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

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

>

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

End {Создать_Процесс};

)Вопрос

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

Создать_Процесс(P, Д);

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

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

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

Procedure Уничтожить_Процесс(P : Process);

Begin

ПРОЛОГ;

КОНТРОЛЬ;

<

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

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

>

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

End {Уничтожить_Процесс};

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

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

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

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

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

Вопрос (

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

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

Procedure Уничтожить_Процесс(P : Process);

Begin

ПРОЛОГ;

КОНТРОЛЬ;

<

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

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

>

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

End {Уничтожить_Процесс};

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

)Вопрос

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

Procedure Dispatcher; Interrupt;

Begin

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

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

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]