
ОС / 5. ОС - Управление процессами - 2
.pdf
21
Посылка сообщений
Асинхронная посылка (функция PostMessage): не оказывает влияния на дальнейшую работу отправителя.
Синхронная посылка (функция SendMessage): работа отправителя блокируется до того момента, когда получатель закончит обработку или вызовет функцию ReplyMessage. Отправитель может после этого проверить результат обработки.
В ранних (невытесняющих) версиях Windows функция SendMessage просто вызывала функцию обработки сообщений из программы адресата. В современных версиях используется более аккуратная схема синхронизации нитей отправителя и получателя.
Операционные системы. Управление процессами - 2

22
Обработка сообщений
Асинхронные сообщения ждут обработки в очереди сообщений нити-получателя.
Нить-получатель в цикле вызывает функцию GetMessage, которая выбирает очередное сообщение из очереди или блокирует нить, если очередь пуста.
Можно также использовать функцию PeekMessage, которая не блокирует нить.
Сообщения WM_PAINT и WM_TIMER не присутствуют в очереди, а генерируются при вызове GetMessage, если нет других сообщений в очереди и нужно перерисовать окно либо сработал таймер.
Синхронные сообщения образуют как бы «очередь внеочередников» и обрабатываются первыми при вызове GetMessage или PeekMessage.
При обработке синхронного сообщения нельзя до вызова ReplyMessage использовать функции, которые могут вызвать переключение нитей.
Операционные системы. Управление процессами - 2

23
Процессы в UNIX / Linux
Процесс – самостоятельная сущность, не связанная жестко с выполнением конкретной программы.
Процесс в ходе работы может переходить от одной программы (исполняемого файла) к другой.
Программу иногда рассматривают как специфический ресурс, используемый процессом.
Каждому процессу при создании присваивается числовой идентификатор (pid).
При загрузке UNIX процесс ядра (KERNEL, pid = 0) порождает процесс INIT (pid = 1). Все остальные процессы, системные и пользовательские, будут потомками INIT.
Операционные системы. Управление процессами - 2

24
Жизненный цикл процесса
Единственный способ создания процесса – вызов функции fork().
Эта функция создает точную копию вызвавшего ее процесса («клонирует» процесс-родитель).
Единственное отличие порожденного процесса от родителя – значение pid.
pid = fork(); |
// |
Создание нового процесса |
if (pid == -1) |
// |
Процесс не создан |
{обработка ошибки создания процесса} else if (pid == 0) // Это порожденный процесс
{операторы, выполняемые процессом-потомком }
else // Это процесс-родитель
{ операторы, выполняемые процессом-родителем }
Операционные системы. Управление процессами - 2

25
Жизненный цикл процесса
После создания процесс может (но не обязан) вызвать функцию execxxx(…), указав путь к новой программе, которую он будет исполнять. При этом перестраивается заново контекст процесса.
Нормальное завершение процесса – функция exit(status). В системной таблице процессов запоминается код завершения status.
Процесс-родитель может (но не обязан) вызвать функцию pid = wait(&status); она ожидает завершения любого из потомков, возвращает его pid и читает status.
Операционные системы. Управление процессами - 2

26
Жизненный цикл процесса
Особые случаи.
Если процесс-потомок завершает свое выполнение до того, как родитель вызвал функцию wait, то завершившийся процесс переходит в состояние, которое принято называть «зомби». Фактически от процесса остается лишь запись в таблице процессов, содержащая код завершения и информацию о затраченном процессорном времени.
Если процесс-родитель завершается до того, как завершен его потомок, то «осиротевший» потомок будет «усыновлен» системным процессом INIT.
Операционные системы. Управление процессами - 2

27
Группы процессов
При входе пользователя в систему создается процессоболочка – общий предок всех процессов этого пользователя. Этот процесс становится лидером группы порожденных им процессов.
Идентификатор группы = идентификатор (pid) ее лидера.
Терминал, с которого пользователь вошел в систему, становится управляющим терминалом группы.
Любой процесс может объявить себя лидером новой группы, к которой будут относиться его потомки.
Одна из групп является текущей (foreground), остальные группы – фоновыми (background). Процессы текущей группы могут получать ввод с управляющего терминала.
Процесс – лидер группы может открепиться от управляющего терминала. Такой процесс (демон) теряет возможность вести диалог с пользователем, но зато он не будет завершаться, когда пользователь закончит сеанс работы с системой. Демоны в UNIX выполняют обычно общесистемные задачи
Операционные системы. Управление процессами - 2

28
Взаимодействие процессов: pipes
Программный канал (pipe) – средство обмена данными между процессорами, имитирующее файловый ввод/вывод.
Безымянный канал служит для обмена между родственными процессами. Функция создания канала pipe возвращает два хэндла, для записи в канал и для чтения из него.
Именованный канал позволяет двум неродственным процессам общаться, зная только имя канала. Функция mknod создает канал и записывает его имя в один из каталогов файловой системы. Канал открывается обычной функцией open.
Операционные системы. Управление процессами - 2

29
Работа с каналами
Процесс, имеющий хэндл записи в канал, записывает туда данные, как в файл.
Процесс, имеющий хэндл чтения, читает данные из канала, как из файла.
На самом деле, файла там нет, данные хранятся в системном буфере.
Если в канале нету данных, процесс-читатель блокируется до их появления.
Если процесс-писатель закрыл хэндл записи, то при попытке чтения выдается признак «конец файла».
Если процесс-читатель закрыл хэндл чтения, то при попытке записи в канал будет выдана ошибка.
С каждого конца канала может быть более одного процесса, если они владеют соответствующими хэндлами.
Операционные системы. Управление процессами - 2

30
Взаимодействие процессов: сигналы
Сигнал – уведомление процесса о некотором событии, посылаемое системой или другим процессом.
Основные характеристики сигнала – номер (тип) и адресат сигнала.
Адресатом может быть:
конкретный процесс;
группа процессов;
все процессы данного пользователя;
все процессы в системе (кроме pid = 0 и 1).
Операционные системы. Управление процессами - 2