Обычно программой называют совокупность файлов, будь то набор обычных файлов, будь то набор исходных текстов, объектных файлов или собственно выполняемый файл.
Мы будем понимать под программой именно выполняемый файл.
Компилятор и стандартные библиотеки Си и С++ входят в комплект поставки операционной системы. Пути к стандартным библиотечным функциям настраиваются автоматически при установке операционной системы. Исходные тексты программ готовятся с использованием встроенного редактора 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);
• номер приоритета;
• дисциплина диспетчеризации.
При создании потоков внутри процесса они наследуют основные атрибуты процесса. Некоторые атрибуты, такие, как, например, номер приоритета, дисциплина диспетчеризации для потока могут устанавливаться индивидуально.