Современные операционные системы UNIX Linux QNX Основные понятия ОС UNIX Виртуальная машина Пользователь Интерфейс пользователя Привилегированный пользователь Команды и командный интерпретатор Процессы Процессы Процесс в ОС UNIX - это программа, выполняемая в собственном виртуальном адресном пространстве. Когда пользователь входит в систему, автоматически создается процесс, в котором выполняется программа командного интерпретатора. Если командному интерпретатору встречается команда, соответствующая выполняемому файлу, то он создает новый процесс и запускает в нем соответствующую программу. Процессы Эта запущенная программа, в свою очередь, может создать процесс и запустить в нем другую программу и т. д. Для образования нового процесса и запуска в нем программы используются два системных вызова API — fork() и ехес (). Системный вызов fork приводит к созданию нового адресного пространства, состояние которого абсолютно идентично состоянию адресного пространства основного процесса. Для дочернего процесса заводятся копии всех сегментов данных. Процессы Сразу после выполнения системного вызова fork основной и порожденный процессы являются близнецами: управление и в том и в другом находится в точке, непосредственно следующей за вызовом fork. Чтобы программа могла разобраться, в каком процессе она теперь работает — в основном или порожденном, функция fork возвращает разные значения: 0 в порожденном процессе и целое положительное число (идентификатор порожденного процесса —PID) в основном процессе. Процессы Для запуска новой программы в порожденном процессе, нужно обратиться к системному вызову exec, указав в качестве аргументов имя файла, содержащего новую выполняемую программу, и текстовые строки, которые будут переданы в качестве аргументов новой программы. Выполнение exec приводит к тому, что в адресное пространство порожденного процесса загружается новая выполняемая программа и запускается с адреса, соответствующего входу в функцию main. Процессы Другими словами, это приводит к замене текущего программного сегмента и текущего сегмента данных, которые были унаследованы при выполнении вызова fork, на новые соответствующие сегменты, заданные в файле. Прежние сегменты теряются. Это эффективный метод смены выполняемой процессом программы, но не самого процесса. Файлы, уже открытые до выполнения exec, остаются открытыми после его выполнения. Процессы В примере пользовательская программа, вызываемая как команда shell, выполняет в отдельном процессе стандартную команду shell ls, которая выдает на экран содержимое текущего каталога файлов. #include <unistd.h> #include <sys/wait.h> main() {if(fork()==0) wait(0); /* родительский процесс */ else execl("/bin/ls", "", NULL): /* порожденный процесс */ Процессы Каждый процесс, за исключением начального, порождается в результате запуска другим процессом операции fork(). Каждый процесс имеет одного родителя, но может породить много процессов. Начальный процесс создается в результате загрузки системы. После порождения процесса с идентификатором 1 (init) начальный процесс становится процессом подкачки и реализует механизм виртуальной памяти. Процесс init, является предком любого другого процесса в системе и связан с каждым процессом особым образом. Функционирование ОС UNIX Выполнение процессов Подсистема ввода/вывода Перенаправление ввода/вывода Файловая система Структура файловой системы Защита файлов Межпроцессные коммуникации в UNIX Выполнение процессов Процесс может выполняться в одном из двух состояний: пользовательском и системном. В пользовательском состоянии процесс выполняет пользовательскую программу и имеет доступ к пользовательскому сегменту данных. В системном состоянии процесс выполняет программы ядра и имеет доступ к системному сегменту данных. Когда пользовательскому процессу требуется выполнить системную функцию, он создает системный вызов. Фактически происходит вызов ядра системы как Выполнение процессов С момента появления системного вызова процесс считается системным. Таким образом, пользовательский и системный процессы являются двумя фазами одного и того же процесса, но они никогда не пересекаются между собой. Каждая фаза пользуется своим собственным стеком. Стек задачи содержит аргументы, локальные переменные и другую информацию относительно функций, выполняемых в режиме задачи. Диспетчерский процесс не имеет Выполнение процессов В UNIX-системах используется разделение времени: каждому процессу выделяется квант времени. Либо процесс завершается сам до истечения отведенного ему кванта времени, либо он откладывается по истечении кванта. Механизм диспетчеризации характеризуется достаточно справедливым распределением процессорного времени между всеми процессами. Пользовательским процессам приписываются приоритеты в зависимости от количества получаемого ими Выполнение процессов Процессам, которые получили большое количество процессорного времени, назначают более низкие приоритеты, а процессам, которые получили лишь небольшое количество процессорного времени — повышают приоритет. Такой метод диспетчеризации обеспечивает хорошее время реакции для всех пользователей системы. Все системные процессы имеют более высокие приоритеты по сравнению с пользовательскими и поэтому всегда обслуживаются в первую очередь. Межпроцессные коммуникации в UNIX Сигналы Программные каналы Семафоры Очереди сообщений Разделяемая память Вызовы удаленных процедур (RPC) Сигналы Если рассматривать выполнение процесса в виртуальном компьютере, который предоставляется каждому пользователю, то в такой системе должна существовать система прерываний, отвечающая стандартным требованиям: обработка исключительных ситуаций; средства обработки внешних и внутренних прерываний; средства управления системой прерываний (маскирование и демаскирование). Всем этим требованиям в UNIX отвечает техника сигналов, которая может не только воспринимать и обрабатывать сигналы, но и порождать их и посылать на другие машины (процессы). Сигналы Сигналы могут быть синхронными, когда инициатор сигнала — сам процесс, и асинхронными, когда инициатор возникновения сигнала — интерактивный пользователь за терминалом. Источником асинхронных сигналов может быть также ядро, когда оно контролирует определенные состояния аппаратуры, рассматриваемые как ошибочные. Сигналы можно рассматривать как простейшую форму межпроцессного взаимодействия, которое используется для передачи от одного процесса другому или от ядра ОС какому-либо процессу уведомления о возникновении определенного события. Совместное использование информации процессами В традиционной модели программирования Unix в системе могут одновременно выполняться несколько процессов, каждому из которых выделяется собственное адресное пространство. Это иллюстрирует рис. 1. Два процесса в левой части совместно используют информацию, хранящуюся в одном из объектов файловой системы. Для доступа к этим данным каждый процесс должен обратиться к ядру (используя функции read, write, lseek и аналогичные). Совместное использование информации процессами Совместное использование информации процессами Некоторая форма синхронизации требуется при изменении файла, для исключения помех при одновременной записи в файл несколькими процессами и для защиты процессов, читающих из файла, от тех, которые пишут в него. Два процесса в середине рисунка совместно используют информацию, хранящуюся в ядре. Примерами являются канал, очередь сообщений или семафор. Для доступа к совместно используемой информации в этом случае будут использоваться системные вызовы. Совместное использование информации процессами Два процесса в правой части используют общую область памяти, к которой может обращаться каждый из процессов. После того как будет получен доступ к этой области памяти, процессы смогут обращаться к данным вообще без помощи ядра. В этом случае, как и в первом, процессам, использующим общую память, также требуется синхронизация. Такое взаимодействие процессов часто называют аббревиатурой IPC (InterProcess Communication). Совместное использование информации процессами Существует два подхода к организации IPC: System V IPC (стандарт UNIX 98); POSIX IPC (стандарт POSIX); Первый является «родным» для UNIX и с его помощью реализовано большое количество существующих приложений; Второй призван обеспечить переносимость ПО. System V IPC Из имеющихся типов IPC следующие три могут быть отнесены к System V IPC: очереди сообщений System V; семафоры System V; общая память System V. У них много общего: схожи функции, с помощью которых организуется доступ к объектам; также схожи формы хранения информации в ядре. Информация о функциях сведена в табл. 1. System V IPC Очереди сообщений Заголовочны й файл Создание или открытие Операции управления Операции IPC Семафоры Общая память <sys/ msg.h> msgget <sys/ sem.h> semget <sys/ shm.h> shmget msgctl semctl shmctl msgsnd, msgrcv semop shmat, shmdt POSIX IPC Из имеющихся типов IPC следующие три могут быть отнесены к POSIX IPC: очереди сообщений POSIX; семафоры POSIX; общая память POSIX. У них много общего: схожи функции, с помощью которых организуется доступ к объектам; также схожи формы хранения информации в ядре. Информация о функциях сведена в табл. 2. POSIX IPC Очереди Семафор сообщений ы Заголовочны й файл Создание или открытие Операции управления Операции IPC <mqueue. h> mq_open Общая память <semapho- <sys/ re.h> mman.h> sem_open shm_open mq_getattr, mq_setattr mq_send, sem_wait, mq_receive sem_post fstat mmap, munmap Совместное использование информации процессами Основное отличие этих подходов заключается в способах создания идентификаторов: в System V используются ключи типа key_t и функция ftok; в POSIX используются имена, аналогичные именам файлов в файловой системе, но не обязанные соответствовать реальным файлам. Далее, в основном, рассматриваются объекты SYS V. Вызовы удаленных процедур (RPC) Во многих случаях взаимодействие процессов носит характер «клиент— сервер». Один из процессов («клиент») запрашивает у другого процесса («сервера») некоторую услугу (сервис) и не продолжает свое выполнение до тех пор, пока эта услуга не будет выполнена (и пока процесс-клиент не получит соответствующие результаты). Видно, что семантически такой режим взаимодействия эквивалентен вызову процедуры. Отсюда и соответствующее название. Вызовы удаленных процедур (RPC) ОС UNIX по своей идеологии идеально подходит для того, чтобы быть сетевой операционной системой. И на ее основе можно создавать распределенные системы и организовывать распределенные вычисления. Свойства переносимости позволяют создавать «операционно однородные» сети, включающие разнородные компьютеры. Однако остается проблема разного представления данных в компьютерах разной архитектуры. Поэтому одной из основных идей RPC является автоматическое обеспечение преобразования форматов данных при взаимодействии процессов, выполняющихся на разнородных компьютерах. Вызовы удаленных процедур (RPC) Реализация технологии вызовов удаленных процедур (remote procedure call — RPC) достаточно сложна, поскольку этот механизм должен обеспечить работу взаимодействующих процессов, которые находятся на разных компьютерах. Если в случае обращения к процедуре, расположенной на том же компьютере, процесс общается с ней через стек или общие области памяти, то в случае удаленного вызова передача параметров процедуре превращается в передачу запроса по сети. Соответственно, и получение результата так же осуществляется посредством использования сетевых механизмов. Вызовы удаленных процедур (RPC) Удаленный вызов следующие шаги: процедур включает процесс-клиент осуществляет локальный вызов процедуры, которую называют «заглушкой» (stub). Задача этого модуля-заглушки — принять аргументы, преобразовать их в стандартную форму и сформировать сетевой запрос. Упаковка аргументов и создание сетевого запроса называется сборкой (marshalling); сетевой запрос пересылается на удаленную систему, где соответствующий модуль ожидает такой запрос и при его получении извлекает параметры вызова процедуры (unmarshalling), а затем передает их серверу удаленной процедуры. После выполнения осуществляется обратная передача.