
- •Министерство образования и науки Украины
- •1. Определение системам реального времени
- •1.1. Основные понятия
- •1.2. Срв
- •1.3. Классификация срв
- •1.4. Структура срв
- •Основные требования к срв и их особенности
- •1.4.1. Ос
- •1.4.2. Основные архитектурные решения ос
- •1.4.3. Основные концепции ос
- •Прерывания
- •Системные вызовы
- •Файловая система
- •Процессы
- •Нити (потоки)
- •Понятие ресурса
- •1.5. Аппаратные среды срв
- •1.5.1. Мультипрограммная среда
- •Состояния процесса (см. Рисунок 4.).
- •1.5.2. Симметричная мультипроцессорная среда (рис. 5)
- •1.5.3. Распределенная среда (рис. 6)
- •1.6. Конфигурации клиент-серверных систем (рис.7.)
- •1.7. Средства ввода-вывода срв
- •2.1. Версии qnx
- •2.2. Posix-совместимость
- •2.3. Архитектура микроядра qnx
- •2.3.1. Микроядро
- •2.3.2. Системные процессы
- •2.3.3. Системные и пользовательские процессы
- •2.3.4. Драйверы устройств
- •2.3.5. Межпроцессное взаимодействие
- •2.3.6. Сеть qnx
- •2.4. Файлы и файловая система
- •2.4.1. Типы файлов
- •2.4.2. Жесткие ссылки
- •2.4.3. Символические ссылки
- •2.4.4. Named Special Device — именованные специальные устройства
- •2.4.5. Именованные программные каналы (fifo) (Именованный канал)
- •2.5. Структура файловой системы qnx
- •2.6. Концепция прав доступа
- •3. Начало работы
- •3.1. Интерфейс командной строки
- •3.2. Консоль командной строки
- •3.3. Соглашения по работе с командной строкой
- •3.4. Знакомство с shell
- •3.5. Обращение к домашнему каталогу
- •3.6. Базовые команды
- •3.6.1. Изменение текущего каталога
- •3.6.2. Просмотр содержимого каталогов
- •Жесткая ссылка обозначает ся так же, как файл, на который она ссылается, счетчик ссылок при этом будет иметь значение больше 1.
- •3.6.3. Создание новых каталогов
- •3.6.4. Копирование файлов
- •3.6.5. Перемещение файлов
- •3.6.6. Удаление файлов
- •3.6.7. Удаление каталогов
- •3.6.8. Просмотр содержимого файлов
- •3.6.9. Конкатенация (слияние) и просмотр файлов
- •3.6.10. Получение оперативной помощи
- •4. Объектно-ориентированное программирование
- •4.1. Системы программирования
- •4.2. Создание приложения
- •4.3. Средства отладки программ
- •5. Архитектура ос qnx
- •5.1. Типы процессов
- •5.2. Механизмы микроядра
- •5.3. Диспетчеризация потоков
- •5.4. Администратор процессов
- •5.5. Управление памятью
- •5.6. Управление пространством путевых имен
- •5.7. Пространство путевых имен
- •5.7.1. Файловая система qnx
- •5.7.2. Виртуальные устройства
- •Устройство /dev/null
- •Устройство /dev/zero
- •Устройство /dev/full
- •Устройства генерирования случайных чисел
- •5.8. Программы, процессы, нити
- •5.9. Свойства процессно-нитиевой структуры прв
- •5.10. Программный интерфейс qnx
- •5.10.1. Системные вызовы и функции стандартных библиотек
- •5.10.2. Обработка ошибок
- •5.11. Формальные параметры функции main
- •5.12. Разграничение доступа к файлам
- •5.13. Функции базового ввода/вывода
- •5.13.1. Открытие файла
- •5.13.2. Дублирование дескриптора файла
- •5.13.3. Доступ к файлу
- •6. Функции управления файловой системой
- •6.1. Смена корневого каталога
- •6.2. Смена текущего каталога
- •6.3. Создание каталога
- •6.4. Удаление каталога
- •6.5. Создание жесткой связи
- •6.6. Создание символической связи
- •6.7. Чтение символической связи
- •6.8. Переименование файла
- •6.9. Удаление файла
- •7. Микроядро
- •7.1. Запуск процессов
- •7.2. Запуск процесса из shell
- •7.3. Программный запуск процессов
- •7.3.1. Функция system()
- •7.3.2. Функции семейства exec*()
- •7.3.3. Функции семейства spawn*()
- •7.3.4. Функция fork()
- •7.3.5. Функция vfork()
- •7.4. Организация взаимодействия между процессами
- •7.5. Создание и удаление каналов Создание канала.
- •Удаление канала
- •7.6. Установление и удаление соединений с каналом Установление соединения
- •Int ConnectAttach(uint32_t nd, pid_t pid, int chid, unsigned index, int flags);
- •Разрыв соединения
- •Int ConnectDetach(int coid);
- •7.7. Передача сообщений
- •7.7.1. Посылка сообщения
- •IntMsgSend(int coid, constvoid* smsg, int sbytes, void* rmsg, int rbytes);
- •7.7.2. Прием сообщения
- •Int MsgReceive(int chid, void *msg, int bytes, struct _msg_info *info);
- •7.7.3. Посылка ответа
- •Int MsgReply(int rcvid,int status,const void* msg, int size);
- •7.7.4. Сценарии ответов
- •7.7.5. Управление сообщениями
- •7.7.6. Управление приемом сообщений
- •7.7.7. Управление передачей ответа
- •Int MsgSendv(int coid, const iov_t* siov, //Массив iov сообщения int sparts, //Количество iov сообщения const iov_t* riov, //Массив iov ответа int rbytes); //Количество iov ответа
- •Int MsgReceivev(int chid, const iov_t* riov, //Массив iov буфера int sparts, //Количество iov буфера struct_msg_info* riov);
5.4. Администратор процессов
Итак, микроядру известны только потоки и то, как с ними обращаться, а поддержку процессов в QNX Neutrino обеспечивает Администратор процессов, скомпонованный с микроядром в единый программный модуль procnto.
Администратор процессов выполняет важные функции:
управление процессами;
управление памятью;
управление пространством путевых имен.
Жизненный цикл процесса включает четыре этапа.
1. Создание. Процесс может быть создан только другим (родительским) процессом. При этом администратор процессов создает у себя необходимые управляющие структуры данных.
2. Загрузка кода и данных процесса в ОЗУ.
3. Выполнение нитей.
4. Завершение. Завершение процесса проходит две стадии. На первой стадии происходит освобождение ресурсов, связанных с процессом (страницы ОЗУ, открытые файловые дескрипторы и т.п.). На второй стадии код возврата завершаемого процесса передается процессу-родителю. При этом возможны следующие варианты поведения процесса-родителя:
процесс-родитель заблокирован в ожидании кода завершения дочернего процесса. В этом случае код завершения сразу доставляется родителю, родитель разблокируется и дочерний процесс завершается;
при запуске дочернего процесса процесс-родитель установил для него флаг SPAWN_NOZOMBIE, т.е. отказался от получения кода завершения дочернего процесса. В этом случае дочерний процесс будет немедленно завершен;
процесс-родитель не установил флаг SPAWN_NOZOMBIE при запуске дочернего процесса, но и не заблокирован в ожидании кода завершения дочернего процесса. В этом случае завершающийся дочерний процесс становится DEAD-блокированным процессом или "зомби". Для такого процесса администратор процессов сохраняет минимум управляющей информации, необходимой только для того, чтобы доставить код завершения родительскому процессу, когда он выполнит вызов ожидания кода завершения дочернего процесса.
Созданный процесс имеет ряд атрибутов, определяющих свойства процесса, которые операционная система учитывает при управлении процессом. К первоочередным свойствам относятся:
идентификатор процесса (Process ID - PID);
идентификатор родительского процесса (Parent Process ID - PPID);
реальные идентификаторы владельца и группы (UID и GID);
эффективные идентификаторы владельца и группы (EUID и EGID);
идентификаторы дополнительных групп;
текущий каталог;
корневой каталог;
управляющий терминал (TTY);
номер приоритета;
дисциплина диспетчеризации.
Всю реальную работу делают именно потоки, поэтому любой процесс состоит не меньше чем из одного потока.
5.5. Управление памятью
Управление памятью заключается в:
управлении защитой памяти;
управлении разделяемой памятью (об этом механизме мы говорили в главе 2).
Администратор процессов QNX обеспечивает поддержку полной защиты памяти (так называемую "виртуальную память") процессов.
Каждому процессу предоставляется 4 гигабайта адресного пространства, из них код и данные процесса могут занимать пространство от 0 до 3,5 Гбайт. Диапазон адресов от 3,5 до 4 Гбайт принадлежит модулю procnto (эти значения относятся к ЭВМ на базе процессора х86, в реализациях QNX Neutrino для других аппаратных платформ они могут отличаться).
Для отображения виртуальных адресов на физическую память используются аппаратные блока управления памятью (MMU, Memory Management Unit).