Лекция 4. Программы процессы и потогки в ОС РВ QNX 6

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

Мы будем понимать под программой именно выполняемый файл.

Компилятор и стандартные библиотеки Си и С++ входят в комплект поставки операционной системы. Пути к стандартным библиотечным функциям настраиваются автоматически при установке операционной системы. Исходные тексты программ готовятся с использованием встроенного редактора vi, или штатного редактора графической среды Photon. Объектные и исполнимые файлы получают с использованием утилит gcc и (QCC). Параметры компиляции либо описываются с помощью файла makefile, либо указываются в командной строке компилятора. Для достаточно простых задач используют утилиту make.

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

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

Окружение (среда выполнения) программы вместе с ее выполняемым кодом получили название процесса.

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

Непрерывная последовательность команд, которые выполняются непосредственно процессором (CPU), называется потоком. Таким образом, запущенная программа становится потоком в составе процесса.

Процесс всегда включает в себя как минимум один поток.

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

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

Адресные пространства процессов устанавливаются и поддерживаются модулем администратора процессов QNX6. При запуске процесса администратор процессов распределяет ему некоторый объем памяти и активирует его потоки. Отведенная данному процессу память помечается как принадлежащая ему.

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

Таким образом, переключение между потоками в одном процессе происходит быстрее, но сбои в каком либо потоке процесса могут привести к нарушению выполнения других потоков этого процесса.

Жизненный цикл процесса включает четыре этапа.

1. Создание.

2. Загрузка кода и данных процесса в ОЗУ.

3. Выполнение потоков

4. Завершение.

Процесс может быть создан только другим (родительским) процессом. При этом администратор процессов создает у себя необходимые структуры данных.

Завершение процесса протекает в две стадии. Первую стадию выполняет поток завершитель (termination thread) администратора процессов. При этом происходит освобождение ресурсов, связанных с процессом (страницы ОЗУ, открытые файловые дескрипторы и т. п). Поток завершитель выполняется с идентификатором уничтожаемого процесса.

Вторая стадия завершения процесса протекает внутри администратора процессов, при этом код возврата завершаемого процесса передается процессу-родителю. Возможны следующие варианты:

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

б. процесс-родитель отказался от получения кода завершения дочернего процесса, т. е. завершающийся процесс имел флаг SPAWN_NOZOMBIE. В этом случае дочерний процесс будет немедленно завершен;

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

При создании процесс (главный поток) имеет ряд атрибутов:

• идентификатор процесса (process ID – pid);

• идентификатор родительского процесса (parent process ID – ppid);

• реальные идентификаторы владельца и группы (uid и gid);

• эффективные идентификаторы владельца и группы (euid и egid);

• текущий рабочий каталог;

• управляющий терминал;

• маска создания файлов (umask);

• номер приоритета;

• дисциплина диспетчеризации.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: