Порождение процессов UNIX. Запуск программ на выполнение.
Создание процессов и потоков.
Создать процесс это, прежде всего, означает создать описатель процесса, в качестве которого выступает одна или несколько информационных структур, содержащих все сведения о процессе, необходимые операционной системе для управления им. В число таких сведений могут входить например идентификатор процесса, данные о расположении в памяти исполняемого модуля, степень привилегированности. В Unix-e это называется дескриптором процесса, в NT – объект-процесс (object-process).
В Unix процесс имеет следующие атрибуты:
программный код
внутренние данные(переменные , массивы, объекты и т.д.)
индентификаторы процесса - идентификатор процесса предка - идентификатор группы процесса
реальный и эффективный идентификаторы пользователя и гр. Пользователя.
список групп доступа
информация об открытых файлах
текущий каталог
При управлении процессами операционная система использует два основных типа информационных структур: дескриптор процесса и контекст процесса.
Дескрипторы отдельных процессов объединены в список образующий таблицу процессов. Контекст, так же как и дескриптор процесса, доступен только программам ядра, то есть находится в виртуальном адресном пространстве операционной системы, однако он хранится не в области ядра, а непосредственно примыкает к образу процесса и перемещается вместе с ним, если это необходимо из оперативной памяти на диск.
Новые процессы UNIX создаются только путем создания дубликата текущего процесса с помощью системного вызова FORK.
Схема создания нового процесса:
shell
|
fork – системный вызов предназначен для порождения нового процесса
/ \
процесс-потомок родитель(shell)
| |
exec wait
| /|\
exit -> ------/
после того как к wait поступает сигнал от exit, shell корректно удаляет процесс-потомок.
В случае сбоя о потомке будет заботиться init
Новый процесс получает от исходного всю информацию, в том числе информацию об открытых файлах.
Однако три файла вновь открываются автоматически: Stdin – стандартный ввод, Stdout – стандартный вывод, Stderr – файл диагностических сообщений.
У каждого процесса есть есть 4-х гигабайтное адресное пространство(32 разряда) в котором пользователь занимает 2 гигабайта (однако это может быть до 3-х ГБ увеличено настройкой) а операционная система занимает оставшуюся часть. Т.о. операционная система присутствует в адресном пространстве каждого процесса, хотя она защищена от изменений с помощью аппаратного блока управления памятью MMU. У процесса есть идентификатор процесса, один или несколько потоков, список дескрипторов и маркер доступа, хранящий информацию защиты. Процессы создаются с помощью вызова Win32, который принимает на входе имя исполняемого файла, определяющего начальное содержимое адресного пространства, и создает первый поток. Потоки могут создаваться динамически в процессе работы. Когда поток завершает свою работу, он может прекратить свое существование, процесс же завершается с завершением последнего активного потока.
Т.к. переключение потоков в Win2k занимает много времени (переключение в режим ядра а затем возврат в режим пользователя), то есть более простой механизм но обеспечивающий псевдопараллелизм – волокна, подобны потокам но планируемые в пространстве пользователя создавшей их программой. У каждого потока может быть несколько волокон, так же как у процесса может быть несколько потоков, с той разницей, что когда волокно логически блокируется, оно помещается в очередь блокированных волокон, после чего для работы выбирается другое волокно в контексте того же потока. ОС не знает о смене волокон, так как все тот же поток продолжает работу.
Необходимые параметры для системного вызова CreateProcess
указатель на имя исполняемого файла
сама командная строка (неразобранная на составные части)
указатель на описатель защиты процесса
указатель на описатель защиты для начального потока
бит, управляющий наследованием дескрипторов
разнообразные флаги (режим отладки, консоли и т.д.)
указатель на строки окружения
указатель на имя текущего каталога нового процесса
указатель на структуру, описывающую начальное окно на экране
указатель на структуру, возвращающему процесу 18 значений