176
Рисунок 6.10 — Используемые ОС сегменты разделяемой памяти
Как уже было отмечено ранее, основной недостаток взаимодействия процессов с помощью сигналов является их малая информативность и специфическая семантика, ориентированная в первую очередь на потребности ядра ОС.
Процессам, функционирующим в пользовательском режиме ОС, необходимы свои средства сигнализации, которые бы позволяли:
•увеличить информативность сигналов, наполнив их семантикой прикладного содержания;
•обеспечить асинхронное распространение сигналов, не требующее совмест-
ного существования взаимодействующих процессов.
Траким средством, входящим в System V IPC, являются очереди сообщений.
В стандарте POSIX-2001, очереди сообщений — набор типизированных объектов, которыми процессы могут асинхронно взаимодействовать между собой, не затрачивая свои прикладные ресурсы на организацию и сопровождение самих очередей. Очереди сообщений - это наиболее семантически нагруженный способ взаимодействия процессов через линии связи, в котором на передаваемую информацию накладывается определенная структура, так что процесс, принимающий данные, может четко определить, где заканчивается одна порция информации и начинается другая. Такая модель позволяет задействовать одну и ту же линию связи для передачи данных в двух направлениях между несколькими процессами.
177
Общая структура сообщения описана в файле <sys/msg.h> , как struct msgbuf:
struct msgbuf {
long mtype; # строго положительная величина, задающая тип сообщения char mtext[1]; # адрес начала самого сообщения
};
Следуя этому шаблону, разработчик приложений может формировать и использовать свою собственную семантику приложений, например:
struct mymsgbuf { long mtype;
char mtext[1024]; } mybuf;
или
struct mymsgbuf { long mtype; struct {
int iinfo; float finfo;
}info;
}mybuf;
Замечание
Максимальный размер сообщения ограничен по разному для разных ОС. Например, в ОС Linux, максимальный размер сообщения равен 4080 байт. Администратор ОС дополнительно может уменьшить это ограничение.
Следуя общим правилам System V IPC, создание и доступ к очередям сообщений осуществляется посредством ключа, который генерируется с использованием системного вызова ftok(...), рассмотренного в предыдущем подразделе.
Непосредственная работа с очередями сообщений обеспечивается с помощью четырех системных вызовов:
#include <types.h>
#include <ipc.h> #include <msg.h>
int msgget(key_t key, |
int msgflg); |
|
int msgsnd(int msqid, |
struct msgbuf *ptr, int length, int flag); |
|
int msgrcv(int |
msqid, |
struct msgbuf *ptr, int length, long type, int flag); |
int msgctl(int |
msqid, |
int cmd, |
struct msqid_ds *buf);
Не вдаваясь в детали практического использования этих системных вызовов, кратко опишем их основное семантическое назначение:
|
178 |
msgget |
Создает очередь сообщений или подключается к уже созданной |
|
очереди, используя сгенерированный функцией ftok(...) уникальный |
|
ключ. |
|
Возвращает целочисленный дескриптор очереди, который используется |
|
остальными тремя системными вызовами. |
msgsend |
Помещает в очередь сообщение заданного типа. |
msgrcv |
Читает из очереди сообщение заданного типа. |
msgctl |
Управляет очередью с использованием специальной структуры типа |
|
msgid_ds. В частности, удаляет очередь из системы. |
Замечание
Механизм очередей сообщений имеет достаточно развитый инструментарий их использования, который поддерживается ядром ОС в соответствии с общими правилами использования разделяемых ресурсов:
•поддерживается контроль прав доступа;
•блокирование читающего процесса, если в очереди отсутсвует сообщение с заданным типом;
•имеются различные варианты порядка чтения сообщений из очереди;
•имеются развитые средства выявления и обработки ошибочных ситуаций.
Вцелом, механизм очередей сообщений и другие средства System V IPC являются достаточно низкоуровневыми средствами взамодействия с ОС. Это требует от разработчиков системных и прикладных программ хорошей профессиональной подготовки, поэтому для прикладных целей используются более высокоуровневые средства, например, шина D-Bus и другие.
Вчастности, для анализа и администрирования очередей сообщений могут использоваться, уже уромянутые в предыдущем подразделе, утилиты: ipcs и ipcrm.
179
Цель лабораторной работы №6 — практическое закрепление учебного материала по теме «Управление процессами ОС».
Метод достижения указанной цели — закрепление учебного материала, изложенного в первом разделе пособия посредством утилит ОС, а также выполнение заданий, приведенных в данном разделе.
Чтобы успешно выполнить данную работу, студенту следует:
•запустить с flashUSB ОС УПК АСУ, подключить личный архив и переключиться в сеанс пользователя upk;
•запустить на чтение данное пособие и на редактирование личный отчет;
•открыть одно или несколько окон терминалов, причем хотя бы в одном окне терминала открыть Midnight Commander, для удобства работы с файловой системой ОС;
•приступить к выполнению работы, последовательно пользуясь рекомендациями представленных ниже подразделов.
Замечание
Многие команды ОС студенту еще не известны, поэтому следует:
•для вывода на консоль руководства по интересуемой команде, использовать: man имя_команды;
•для выяснения сущесвования команды, ее доступности и местоположения, использовать: command -v имя_команды;
•для уточнения правил запуска конкретной команды, можно попробовать один из вариантов: команда --help или команда -h или команда -?.
Впроцессе выполнения лабораторной работы студент заполняет личный отчет по каждому изученному вопросу!
Прочитайте и усвойте учебный материал подразделов 6.1 и 6.2.
Запустите Midnight Commander и бедитесь в наличии файлов: /bin/sh и /sbin/init. Запустите файловый менеджер thunar, перейдите в директорию /etc/upkasu и запустите на просмотр с помощью mousepad сценарий init, который по содержанию соответствует файлу init, размещенному в корне временной файловой системы ОС. Изучите и опишите содержимое этого файла.
Особое внимание обратите на:
•певоначальное создание устройств;
•чтение параметров, передаваемых ядру ОС с помощью ПО GRUB;
•монтирование и перенос файловых систем;
•запуск основного процесса init.
Вслучае затруднений, обращайтесь к преподавателю за консультацией!
180
Прочитайте и усвойте учебный материал подразделов 6.3 - 6.6.
Изучите назначение и работу утилит runlevel, telinit и initctl, а также содержимое директорий /etc/init и /etc/init.d.
Опишите основные отличия подходов SysVinit и upstart.
С помощью руководства man, изучите systemd и systemctl, а также изучите и опишите содержимое директорий /lib/systemd и /etc/systemd.
Прочитайте и усвойте учебный материал подразделов 6.7 - 6.12. Изучите и освойте работу с утилитами kill, ipcs и ipcrm.
Сделайте краткое заключение по всем лабораторным работам: отметьте какие вопросы изложены недостаточно полно и требуют более глубокого изучения.