Системы реального времени Лекция 4: процессы
Понятие процесса Процесс - фундаментальное понятие любой операционной системы С помощью процессов происходит управление ресурсами компьютера, которые используются для выполнения программы
Процессы – взгляд изнутри В каждый момент времени может выполняться только одна (или более, если процессоров в системе несколько) команда Поддержка «параллельного» выполнения осуществляется с помощью метода «квантования времени», когда система через определенные промежутки времени меняет текущий выполняемый процесс
Процессы – реализация Процесс – это прежде всего данные! Каждый процесс состоит из адресного пространства и набора структур данных, содержащихся в ядре системы
Процесс: адресное пространство Адресное пространство может быть отдельным для каждого процесса (HardHat, BlueCat, LynxOS, eCOS), а может быть общим для всех процессов (VxWorks, uClinux, RTEMS). Общее адресное пространство упрощает реализацию системы и многих сервисов… …но потенциально уменьшает ее устойчивость
Важнейшие структуры данных процесса таблица распределения памяти процесса текущий статус процесса приоритет выполнения процесса информация о ресурсах системы, используемых процессом владелец процесса
Структуры данных процесса: важное примечание На самом деле выше описан «идеальный» случай В реальных системах те или иные структуры могут отсутствовать
Таблица распределения памяти процесса Содержит указатели на стек, кучу, статическую область и код процесса Эти указатели указывают в адресное пространство процесса или общее адресное пространство системы
Текущий статус процесса Running (работает) Stopped (остановлен) Waiting (ожидающий) Zombie (процесс-«зомби»: завершен, ждет завершения родительского процесса) Состояние zombie есть не во всех системах
Приоритет выполнения процесса Характеризует «важность» процесса для системы Математически представляется по-разному, в зависимости от системы Процессы с более высоким приоритетом БЛОКИРУЮТ процессы с более низким приоритетом (т. е. последние не получают управления, пока первые активны) Поэтому высокоприоритетные процессы должны иногда «засыпать»
Процессы: высокоприоритетные и низкоприоритетные Наиболее высокий приоритет обычно у системных процессов («демонов» - daemons), которые большую часть времени «спят», но должны моментально реагировать на адресованные им события Наиболее низкий – у «фоновых» процессов, типа системного журнала (syslogd) Пользовательские процессы занимают промежуточное положение
Информация о ресурсах системы, используемых процессом Содержит адреса занятых процессом портов, каналов DMA, прерываний и пр.
Владелец процесса Каждый процесс имеет UID - идентификационный номер пользователя, создавшего данный процесс В однопользовательских системах (VxWorks, RTEMS) этого параметра у процесса нет
Владелец процесса: многопользовательские системы Каждый процесс имеет UID - идентификационный номер пользователя, создавшего данный процесс Вносить изменения в процесс может только его создатель и привилегированный пользователь (root).
Идентификатор процесса Каждому новому процессу присваивается уникальный номер – PID Новый процесс в POSIX.1a системах создается путем клонирования одного из существующих процессов – функция fork() после чего текст (т.е. набор инструкций для процессора) нового процесса заменяется текстом программы, которую процесс должен выполнить – семейство функций exec()
Контекст процесса Контекст процесса - совокупность данных ОС о процессе (внешние данные процесса) Контекст определяет, где находятся связанные с процессом структуры (см. выше)
Переключение контекстов Система через определенные промежутки времени меняет текущий выполняемый процесс, т. е. начинает выполнять команды кода другого процесса При этом текущее состояние первого процесса сохраняется в его контексте, а он приостанавливается Т. о. контексты и переключение контекстов – основное средство поддержки многозадачности
Создание процессов в POSIX- системах #include pid_t fork(void); Создает полную копию вызывающего процесса, отличающуюся только PID Порожденному процессу возвращается значение 0 …Родительскому - PID порожденного
Что делать с дочерним процессом? Как правило, прежде всего закрывают все дескрипторы, относящиеся к родительскому процессу После этого часто вызывают команду семейства exec (см. ниже) Или делают что-то еще
Команды семейства exec #include extern char **environ; int execl(const char *path, const char *arg,...); int execlp(const char *file, const char *arg,...); int execle(const char *path, const char *arg,..., char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); Замещают данные и код текущего процесса данными и кодом исполнимого файла Новый процесс начинает немедленно выполняться