Тема OS13асу. Идентификатор и дескриптор процесса Идентификатор процесса Каждый процесс имеет уникальный целочисленный номер, который называется идентификатором процесса. Он позволяет однозначно указать нужный процесс в командах пользователя или системных вызовах. Идентификаторы процессов сохраняют свою уникальность от момента образования процесса до очередной перезагрузки OS UNIX. Уникальность идентификаторов гарантируется ядром. Идентификаторы процессов динамически назначаются ядром из диапазона от 1 до 30000 в порядке образования процессов. Идентификатор процесса никак не связан с именем файла программы его выполнения. Процессы не именют предопределенных идентификаторов. Исключение составляют диспетчерский процесс (swapper) с идентификатором 0 и процесс инициализации (init) с идентификатором 1, которые образуются первыми при загрузке OS UNIX. Процесс имеет возможность узнать свой идентификатор системным вызовом getpid и идентификатор процесса-предка - системным вызовом getppid. Кроме индивидуальной идентификации процессов в OS UNIX предусмотрена идентификация групп процессов. Группу процессов образует множество процессов, запущенных с одного терминала в течении одного сеанса. Все процессы группы имеют одинаковый идентификатор, который совпадает с идентификатором лидера группы. Лидером группы обычно является процесс интепретатора команд, который открывает сеанс работы с терминалом - так называемый login shell. Идентификатор группы процесса позволяет узнать системный вызов getpgrp. Личные и групповые идентификаторы процессов могут быть использованы для персонифицированной и распределенной посылки сигналов системным вызовом kill или для порождения уникальных имен временных файлов. Эффективные и реальные идентификаторы процесса. С каждым процессом связано три идентификатора процесса. Первый - идентификатор самого процесса, который был получен при формировании. Второй - это т.н. эффективный идентификатор (ЭИ). ЭИ - это идентификатор, связанный с пользователем, запустившим этот процесс. Реальный идентификатор (РИ) - это идентификатор, связанный с запущенным в виде процесса файлом (если я запускаю свой файл, то ЭИ и РИ будут одинаковы, если я запускаю чужой файл, и у этого файла есть s-бит, то в этом случае РИ будет идентификатором владельца файла и это означает, что запущенному процессу будут делегированы права этого владельца). Образ, дескриптор, контекст процесса В основе UNIX лежит концепция процесса - единицы управления и единицы потребления ресурсов. Процесс представляет собой программу в состоянии выполнения, причем в UNIX в рамках одного процесса не могут выполняться никакие параллельные действия. Каждый процесс работает в своем виртуальном адресном пространстве. Совокупность участков физической памяти, отображаемых на виртуальные адреса процесса, называется образом процесса. При управлении процессами операционная система использует два основных типа информационных структур: дескриптор процесса (структура proc) и контекст процесса (структура user). Дескриптор процесса содержит такую информацию о процессе, которая необходима ядру в течение всего жизненного цикла процесса, независимо от того, находится ли он в активном или пассивном состоянии, находится ли образ процесса в оперативной памяти или выгружен на диск. Дескрипторы отдельных процессов объединены в список, образующий таблицу процессов. Память для таблицы процессов отводится динамически в области ядра. На основании информации, содержащейся в таблице процессов, операционная система осуществляет планирование и синхронизацию процессов. В дескрипторе прямо или косвенно (через указатели на связанные с ним структуры) содержится информация о состоянии процесса, расположении образа процесса в оперативной памяти и на диске, о значении отдельных составляющих приоритета, а также его итоговое значение - глобальный приоритет, идентификатор пользователя, создавшего процесс, информация о родственных процессах, о событиях, осуществления которых ожидает данный процесс и некоторая другая информация. Контекст процесса содержит менее оперативную, но более объемную часть информации о процессе, необходимую для возобновления выполнения процесса с прерванного места: содержимое регистров процессора, коды ошибок выполняемых процессором системных вызовов, информацию о всех открытых данным процессом файлов и незавершенных операциях ввода-вывода (указатели на структуры file) и другие данные, характеризующие состояние вычислительной среды в момент прерывания. Контекст, так же как и дескриптор процесса, доступен только программам ядра, то есть находится в виртуальном адресном пространстве операционной системы, однако он хранится не в области ядра, а непосредственно примыкает к образу процесса и перемещается вместе с ним, если это необходимо, из оперативной памяти на диск. В UNIX для процессов предусмотрены два режима выполнения: привилегированный режим - "система" и обычный режим - "пользователь". В режиме "пользователь" запрещено выполнение действий, связанных с управлением ресурсами системы, в частности, корректировка системных таблиц, управление внешними устройствами, маскирование прерываний, обработка прерываний. В режиме "система" выполняются программы ядра, а в режиме "пользователь" - оболочка и прикладные программы. При необходимости выполнить привилегированные действия пользовательский процесс обращается с запросом к ядру в форме так называемого системного вызова. В результате системного вызова управление передается соответствующей программе ядра. С момента начала выполнения системного вызова процесс считается системным. Таким образом, один и тот же процесс может находиться в пользовательской и системной фазах. Эти фазы никогда не выполняются одновременно. В данных версиях UNIX процесс, работающий в режиме системы, не мог быть вытеснен другим процессом. Из-за этого организация ядра, которое составляет привилегированную общую часть всех процессов, упрощалась, т.к. все функции ядра не были реентерабельными. Однако, при этом реактивность системы страдала - любой процесс, даже низкоприоритетный, войдя в системную фазу, мог оставаться в ней сколь угодно долго. Из-за этого свойства UNIX не мог использоваться в качестве ОС реального времени. В более поздних версиях, и в SVR4 в том числе, организация ядра усложнилась и процесс можно вытеснить и в системной фазе, но не в произвольный момент времени, а только в определенные периоды его работы, когда процесс сам разрешает это сделать установкой специального сигнала. В SVR4 имеется несколько процессов, которые не имеют пользовательской фазы, например, процесс pageout, организующий выталкивание страниц на диск.