- •1 Ответ
- •2 Ответ Структура управляемой системы реального времени
- •3 Ответ
- •1) Принцип модульности
- •4) Принцип функциональной избыточности
- •6) Принцип совместимости
- •7) Принцип открытой и наращиваемой ос
- •4 Билет
- •5 И 6 билет
- •7 Билет
- •8 Билет Прерывание в защищённом режиме
- •9 Билет
- •10 Билет Страничная трансляция
- •11 Билет
- •12 Билет
- •13 Билет
- •14 Билет
- •15 Билет
- •16 Билет
- •17 Билет
- •18 Билет
- •30. 2.7. Семафоры
- •19 Билет
- •34. Синхронизация через диспетчеризующий механизм
- •20 Билет
- •21 Билет
- •22 Билет
- •23 Билет . Организация взаимодействия между процессами
- •Создание и удаление каналов Создание канала
- •Удаление канала
- •Установление и удаление соединений с каналом Установление соединения
- •Разрыв соединения
- •24 Билет
- •25 Билет
- •26 Билет
- •27 Билет
- •28 Билет
- •29 Билет
- •30 Билет
- •31 Билет
- •32 Билет
- •33 Билет
- •Int flags, // флаги, определяющие область действия тайм-аута
- •34 Билет
- •35 Билет
- •36 Билет
- •37 Билет
- •38 Билет
- •39 Билет
- •40 Билет
- •41 Билет
- •Именование в qnx
- •43 Билет
- •44 Билет
- •45 Билет
- •Устройства с последовательным интерфейсом
- •46 Билет
36 Билет
Для установления зависимости между множеством модулей друг от друга — наладить между ними информационную связь с помощью небольшого количества строго определенных интерфейсов. Поток наделен пониманием, что если у него есть доступ к памяти в пределах процесса, он может функционировать. Если он переступит границы адресного пространства процесса, он будет уничтожен. Это означает, что два потока, работающие в различных процессах, изолированы один от другого. Защита памяти. Адресные пространства процессов устанавливаются и поддерживаются модулем администратора процессов QNX/ Neutrino. При запуске процесса администратор процессов распределяет ему некоторый объем памяти и активирует его потоки. Отведенная данному процессу память помечается как принадлежащая ему.
Это означает, что если в данном процессе имеются есть несколько потоков, и ядру необходимо переключить контекст между ними, это можно сделать очень эффективно, поскольку не нужно изменять адресное пространство, достаточно просто сменить рабочий поток. Если, однако, мы должны переключиться на другой поток в другом процессе, тут уже включается в работу администратор процессов и переключает адресное пространство очень быстро.
Запуск процесса
Теперь обратим внимание на функции, предназначенные для работы с потоками и процессами. Любой поток может осуществить запуск процесса; единственные налагаемые здесь ограничения вытекают из основных принципов защиты (правила доступа к файлу, ограничения на привилегии и т.д.). По всей вероятности, вам уже доводилось запускать процессы — либо из системного сценария, либо из командного интерпретатора, или из программы от своего имени.
Запуск процесса из программы
Нас обычно не заботит тот факт, что командный интерпретатор создает процессы — это просто подразумевается. некоторых прикладных задачах можно положиться на сценарии командного интерпретатора (пакеты команд, записанные в файл), которые сделают эту работу за вас, но в ряде других случаев вы пожелаете создавать процессы самостоятельно. Например, в большой мультипроцессорной системе вы можете пожелать, чтобы одна главная программа выполнила запуск всех других процессов вашего приложения на основании некоторого конфигурационного файла. Другим примером может служить необходимость запуска процессов по некоторому событию. Обычно при всех запросах на создание нового процесса происходит следующее. Поток в первоначальном процессе вызывает одну из вышеприведенных функций. конечном итоге, функция заставит администратор процессов создать адресное пространство для нового процесса. Затем ядро выполнит запуск потока в новом процессе. Этот поток выполнит несколько инструкций и вызовет функцию main(). (Конечно, в случае вызова функции fork() или vfork() новый поток начнет выполнение в новом процессе с возврата из fork()
Существуют следующие примитивы процессов:
- spawnQ —POSIX; – JorkQ —POSIX; - vforkQ —UNIX BSD; - exec() —POSIX. • system() Семейство функций exec() подменяет текущий процесс другим. Я подразумеваю под этим то, что когда процесс вызывает функцию семейства exec(), этот процесс прекращает выполнение текущей программы и начинает выполнять другую. Идентификатор процесса (PID) при этом не меняется, просто процесс преобразуется в другую программу.
Вызов spawnQ был введен в стандарте POSIX. Эта функция создает дочерний процесс прямым заданием загрузки исполняемого модуля. Этот вызов аналогичен функции forkQ, за которой следует функция execQ. Однако вызов spawnQ намного более эффективен, так как он не требует дублирования адресных пространств, как это происходит, когда сначала вызывается функция forkQ, а затем дублированное адресное пространство уничтожается посредством вызова execQ.
Главное преимущество функций forkQ и execQ при создании дочерних процессов является гибкость изменения начального окружения, которое наследуется дочерним процессом. Это производится в ответвленном процессе сразу перед выполнением функции execQ. Например, при выполнении следующей простой команды командного интерпретатора стандартный поток вывода будет закрыт и повторно открыт до вызова функции execQ:
