Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Управление процессами (создание, выполнение, завершение) в UNIX SVR4.

Поиск

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

В операционной системе UNIX процессы создаются с помощью вызова системной функции ядра под названием fork (). При вызове этой функции процессом операционная система выполняет следующие действия [ВАСН86].

· Выделяет в таблице процессов место для нового процесса.

· Назначает этому процессу уникальный идентификатор.

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

· Увеличивает показания счетчиков всех файлов, принадлежащих родительскому процессу, что отражает тот факт, что новый процесс также владеет этими файлами.

· Назначает процессу состояние готовности к выполнению.

· Возвращает родительскому процессу идентификатор дочернего процесса, а дочернему процессу — значение 0.

 

Все перечисленные выше действия выполняются в рамках родительского процесса в режиме ядра. После того как ядро закончит выполнение этих функций, оно может перейти к выполнению одного из следующих действий как части программы диспетчера.

· Оставаясь в рамках родительского процесса, переключить процессор в пользовательский режим; процесс будет продолжен с той команды, которая следует после вызова функции fork().

· Передать управление дочернему процессу. Дочерний процесс начинает выполняться с того же места кода, что и родительский: с точки возврата после вызова функции fork ().

· Передать управление другому процессу. При этом и родительский и дочерний процессы переходят в состояние готовности к выполнению.

 

Возможно, такой метод создания процессов трудно изобразить наглядно, потому что и родительский и дочерний процессы в момент создания выполняют один и тот же проход по коду. Различаются они возвращаемым функцией fork () значением: если оно равно нулю, то это дочерний процесс. Таким образом, можно выполнить команду ветвления, которая приведет к выполнению дочерней программы или продолжению выполнения основной ветви.

 

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

· Порожденный процесс имеет свой уникальный идентификатор.

· Порожденный процесс имеет другой идентификатор родительского процесса, равный идентификатору породившего процесса.

· Порожденный процесс имеет свои собственные копии дескрипторов файлов (в частности, стандартных потоков), открытых родительским процессом. Каждый дескриптор файла порожденного процесса имеет первоначально такое же значение текущей позиции в файле, что и соответствующий родительский.

· У порожденного процесса обнуляются счетчики времени, потраченного системой для его обслуживания.

· Системный вызов fork завершается неудачей и новый процесс не порождается, если:

· Создать процесс запрещает системное ограничение на общее количество процессов.

· Создать процесс запрещает системное ограничение на количество процессов у одного пользователя.

· Общее количество системной памяти, предоставленной для физического ввода-вывода, временно оказалось недостаточным.

 

При успешном завершении порожденному процессу возвращается значение 0, а родительскому процессу возвращается идентификатор порожденного процесса. В случае ошибки родительскому процессу возвращается -1, новый процесс не создается и переменной errno присваивается код ошибки.

Обычно после порождения порожденный процесс выполняет системный вызов exec, перекрывающий сегменты текста и данных процесса новыми сегментами текста и данных, взятыми из указанного выполняемого файла. При этом аппаратный контекст процесса инициализируется заново.

Выполняемый файл состоит из заголовка, сегмента команд и сегмента данных. Данные (глобальные переменные) состоят из инициализированной и неинициализированной частей.

Если системный вызов exec закончился успешно, то он не может вернуть управление, так как вызвавший процесс уже заменен новым процессом. Возврат из системного вызова exec свидетельствует об ошибке. В таком случае результат равен -1, а переменной errno присваивается код ошибки.

Новый процесс наследует у процесса, вызвавшего exec, следующие основные характеристики:

· Значение поправки приоритета.

· Идентификатор процесса.

· Идентификатор родительского процесса.

· Идентификатор группы процессов.

· Терминальную линию.

· Текущий каталог.

Корневой каталог.

· Маску создания файлов.

· Ограничения ресурсов.

· Счетчики времени, потраченного системой на обслуживание этого процесса.

· Блокировки доступа к сегментам файлов.

Завершение выполнения процесса

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

При завершении процесса последовательно выполняются следующие действия:

Отключаются все сигналы.

В вызвавшем процессе закрываются все дескрипторы открытых файлов.

Если родительский процесс находится в состоянии вызова wait, то системный вызов wait завершается, выдавая родительскому процессу в качестве результата идентификатор завершившегося процесса, и младшие 8 бит его кода завершения.

Если родительский процесс не находится в состоянии вызова wait, то завершающийся процесс переходит в состояние зомби.

У всех существующих потомков завершенных процессов, а также у зомби-процессов идентификатор родительского процесса устанавливается равным 1. Таким образом, они становятся потомками процесса инициализации (init).

Если идентификатор процесса, терминальная линия и идентификатор группы процессов у завершающегося процесса совпадают, то всем процессам с тем же идентификатором группы процессов посылается сигнал SIGHUP. Тем самым, завершаются и все порожденные в приоритетном режиме процессы.

Родительскому процессу посылается сигнал SIGCHLD (завершение порожденного процесса). Этот сигнал пробуждает родительский процесс, если тот ожидает завершения порожденных процессов.

18 Понятие потока. Характеристики потоков. Многопоточность как свойство операционной системы (с конкретными примерами ОС).(см. бил№5 и 9)

Поток – независимый компонент, счётчик в рамках процессора, независимо планируемый контекст выполнения, разделяемый единое адресное пространство с другими адресными потоками

Многопото́чность — свойство платформы (например, операционной системы, JVM и т. д.) или приложения, состоящее в том, что процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно», то есть без предписанного порядка во времени. При выполнении некоторых задач такое разделение может достичь более эффективного использования ресурсов вычислительной машины.

Такие потоки называют также потоками выполнения (от англ. thread of execution); иногда называют «нитями» (буквальный перевод англ. thread) или неформально «тредами».

Сутью многопоточности является квазимногозадачность на уровне одного исполняемого процесса, то есть все потоки выполняются в адресном пространстве процесса. Кроме этого, все потоки процесса имеют не только общее адресное пространство, но и общие дескрипторы файлов. Выполняющийся процесс имеет как минимум один (главный) поток.

Достоинства многопоточности:

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

· Меньшие относительно процесса временны́е затраты на создание потока.

· Повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода/вывода.

Многопоточность реализуется примерно так же. Процессор быстро переключается между потоками, создавая впечатление параллельной работы потоков, хотя и на не столь быстром процессоре. В случае трех ограниченных производительностью процессора потоков в одном процессе все потоки будут работать параллельно, и каждому потоку будет соответствовать виртуальный процессор с быстродействием, равным одной трети быстродействия реального процессора.

Каждому процессу соответствует адресное пространство и одиночный поток исполняемых команд. В многопользовательских системах, при каждом обращении к одному и тому же сервису, приходится создавать новый процесс для обслуживания клиента. Это менее выгодно, чем создать квазипараллельный поток внутри этого процесса с одним адресным пространством.

 

Сравнение многопоточной системы с однопоточной

Модель потока

С каждым потоком связывается: 1. Счетчик выполнения команд, 2. Регистры для текущих переменных, 3. Стек, 4. Состояние, 5. Потоки делят между собой элементы своего процесса: адресное пространство, глобальные переменные, открытые файлы, таймеры, семафоры, статистическую информацию.

В остальном модель идентична модели процессов.

В POSIX и Windows есть поддержка потоков на уровне ядра.

В Linux есть новый системный вызов clone для создания потоков, отсутствующий во всех остальных версиях системы UNIX.

В POSIX есть новый системный вызов pthread_create для создания потоков.

В Windows есть новый системный вызов Createthread для создания потоков.



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 396; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.3.17 (0.007 с.)