Лекция 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);

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

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

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




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