- •Министерство образования и науки Украины
- •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.3. Диспетчеризация потоков
QNX — многозадачная ОС. Это значит, что в системе может существовать достаточно много процессов (и потоков). Причем несколько из них могут одновременно оказаться в состоянии готовности к исполнению. Для диспетчеризации микроядро использует приоритет, назначенный каждому потоку. Всего в QNX Neutrino версии 6,3 имеется 256 уровней приоритета (в Neutrino версий до 6.2.1 было 64 уровня приоритета). Самый низкий приоритет— 0, самый высокий— 255. Нулевой приоритет имеет специальный поток Администратора процессов под названием idle (что в переводе с английского означает "ленивец"), на русском техническом жаргоне его называют "холодильником". Этот поток всегда находится в состоянии готовности к исполнению READY. He вздумайте задать своему потоку нулевой приоритет — он никогда не получит процессор!
Диспетчеризация выполняется микроядром в трех случаях:
исполняющийся на процессоре поток перешел в блокированное состояние;
поток с более высоким, чем у исполняющегося потока, приоритетом перешел в состояние готовности, т. е. происходит вытеснение потока (это свойство ОС называют вытесняющей многозадачностью);
исполняющийся поток сам передает право исполнения на процессоре другому потоку (вызывает функцию sched_yield{)).
Если несколько готовых к исполнению потоков имеют равные приоритеты, то повлиять на их взаимоотношения можно с помощью такого параметра потока, как дисциплина диспетчеризации (Scheduling Policy). Neutrino позволяет задавать для каждого потока одну из следующих дисциплин диспетчеризации:
FIFO (First In First Out— "первый вошел— первый вышел"). Если потоку назначена дисциплина диспетчеризации FIFO, то другой поток с таким же приоритетом получит управление, только если исполняющийся поток за блокируется или сам уступит право исполнения;
"карусельная" (Round Robin) диспетчеризация — поток исполняется в течение кванта времени и передает управление следующему потоку с таким же приоритетом. В QNX 6.3 квант времени (timeslice) по умолчанию равен 4 мс (для процессоров с частотой выше 40 МГц);
спорадическая диспетчеризация — предназначена для установления лимита использования потоком процессора в течение определенного периода времени. Этот механизм заменил имевшуюся в прежних версиях QNX адаптивную диспетчеризацию и введен в порядке эксперимента — пользуйтесь им осторожно.
В дополнение к дисциплинам диспетчеризации Neutrino поддерживает механизм клиент-управляемых приоритетов. Идея его заключается в том, что приоритет потока-сервера устанавливается равным максимальному из приоритетов потоков-клиентов, заблокированных в ожидании освобождения этого потока-сервера. Действительно, было бы не очень здорово, если бы поток с приоритетом 100 ждал, пока закончит работу поток с приоритетом 20 и поток-сервер, наконец, получит управление, чтобы закончить обработку предыдущего запроса от потока с приоритетом, например, 5.
Существует такое понятие, как масштаб диспетчеризации. POSIX определяет два масштаба — процесса и системы. При диспетчеризации в масштабе процесса ресурсы процессора делятся между процессами, а уже внутри процесса "разыгрываются" между потоками. Предположим, есть 2 процесса — А и Б, А с одним потоком, а Б с пятью потоками, все шесть потоков готовы к исполнению. При диспетчеризации в масштабе процесса процессорное время было бы поровну поделено между процессами, а далее выделенное процессу время делилось бы между потоками процесса. То есть поток процесса А по .лучил бы 50% процессорного времени, а каждый поток процесса Б — 10% процессорного времени. При диспетчеризации в масштабе системы каждый поток получит 1/6 часть процессорного времени. В QNX Neutrino реализован и единственно возможен только масштаб системы.