русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Очереди сообщений


Дата добавления: 2014-11-28; просмотров: 650; Нарушение авторских прав


Для обмена данными между процессами используется механизм очередей сооб­щений, который поддерживается следующими системными вызовами:

- msgget — образование новой очереди сообщений или получение дескриптора существующей очереди;

- msgsnd — отправка сообщения (точнее, его постановка в указанную очередь со­общений);

- msgrcv — прием сообщения (точнее, выборка сообщения из очереди сообщений);

- msgctl — выполнение ряда управляющих действий.

Ядро хранит сообщения в виде связного списка (очереди), а дескриптор очереди сообщений является индексом в массиве заголовков очередей сообщений.

Системный вызов msgget имеет следующий синтаксис:

msgqid = msgget(key. flag):

Здесь параметры key и flag имеют то же значение, что и в вызове semget при запросе семафора.

При выполнении системного вызова msgget ядро UNIX-системы либо создает но­вую очередь сообщений, помещая ее заголовок в таблицу очередей сообщений и возвращая пользователю дескриптор вновь созданной очереди, либо находит эле­мент таблицы очередей сообщений, содержащий указанный ключ, и возвращает соответствующий дескриптор очереди.

Для отправки сообщения используется системный вызов msgsnd:

msgsnd(msgqid. msg. count, flag):

Здесь msg — указатель на структуру, содержащую определяемый пользователем целочисленный тип сообщения и символьный массив (собственно сообщение); count — размер сообщения в байтах; flag — значение, которое определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти.

Для приема сообщения используется системный вызов msgrcv:

count = msgrcv(id. msg. maxcount, type, flag);

Здесь msg — указатель на структуру данных в адресном пространстве пользовате­ля, предназначенную для размещения принятого сообщения; maxcount — размер области данных (массива байтов) в структуре msg; type — тип сообщения, которое требуется принять; flag — значение, которое указывает ядру, что следует предпри­нять, если в указанной очереди сообщений отсутствует сообщение с указанным типом. Возвращаемое значение системного вызова задает реальное число байтов, переданных пользователю.



Следующий системный вызов служит для опроса состояния описателя очереди сообщений, изменения его состояния (например, изменения прав доступа к очере­ди) и для уничтожения указанной очереди сообщений:

msgctl(id. and. mstatbuf):


334________________ Глава 10. Краткий обзор современных операционных систем

Разделяемая память

Для работы с разделяемой памятью используются четыре системных вызова:

- shmget — создает новый сегмент разделяемой памяти или находит существую­
щий сегмент с тем же ключом;

- shmat — подключает сегмент с указанным дескриптором к виртуальной памяти обращающегося процесса;

- shmdt — отключает от виртуальной памяти ранее подключенный к ней сегмент с указанным виртуальным адресом начала;

- shmctl — служит для управления разнообразными параметрами, связанными с
существующим сегментом.

После того как сегмент разделяемой памяти подключен к виртуальной памяти процесса, процесс может обращаться к соответствующим элементам памяти с ис­пользованием обычных машинных команд чтения и записи, не прибегая к допол­нительным системным вызовам. Синтаксис системного вызова shmget выглядит следующим образом:

shmid = shmget(key. size, flag);

Параметр size определяет желаемый размер сегмента в байтах. Далее работа про­исходит по общим правилам. Если в таблице разделяемой памяти находится эле­мент, содержащий заданный ключ, и права доступа не противоречат текущим ха­рактеристикам обращающегося процесса, то значением системного вызова является дескриптор существующего сегмента (и обратившийся процесс так и не узнает реального размера сегмента, хотя впоследствии его можно узнать с помощью сис­темного вызова shmctl). В противном случае создается новый сегмент, размер ко­торого не меньше, чем установленный в системе минимальный размер сегмента разделяемой памяти, и не больше, чем установленный максимальный размер. Со­здание сегмента не означает немедленного выделения для него основной памяти. Это действие откладывается до первого системного вызова подключения сегмента к виртуальной памяти некоторого процесса. Аналогично, при выполнении после­днего системного вызова отключения сегмента от виртуальной памяти соответ­ствующая основная память освобождается.

Подключение сегмента к виртуальной памяти выполняется путем обращения к системному вызову shmat:

virtaddr = shmatdd. addr, flags):

Здесь id — ранее полученный дескриптор сегмента; addr— требуемый процессу виртуальный адрес, который должен соответствовать началу сегмента в виртуаль­ной памяти. Значением системного вызова является реальный виртуальный адрес начала сегмента (его значение не обязательно совпадает со значением параметра addr). Если значением addr является нуль, ядро выбирает подходящий виртуаль­ный адрес начала сегмента.

Для отключения сегмента от виртуальной памяти используется системный вызов shmdt:

shmdt(addr):


Семейство операционных систем UNIX___________________________________ 335

Здесь addr — виртуальный адрес начала сегмента в виртуальной памяти, ранее по­лученный с помощью системного вызова shmat. При этом система гарантирует (опи­раясь на данные таблицы сегментов процесса), что указанный виртуальный адрес действительно является адресом начала разделяемого сегмента в виртуальной па­мяти данного процесса.

Для управления памятью служит системный вызов shmctl:

shmctKid. cmd, shsstatbuf);

Параметр cmd идентифицирует требуемое конкретное действие, то есть ту или иную функцию. Наиболее важной является функция уничтожения сегмента разделяемой памяти, которое производится следующим образом. Если к моменту выполнения системного вызова ни один процесс не подключил сегмент к своей виртуальной памяти, то основная память, занимаемая сегментом, освобождается, а соответству­ющий элемент таблицы разделяемых сегментов объявляется свободным. В про­тивном случае в элементе таблицы сегментов выставляется флаг, запрещающий выполнение системного вызова shmget по отношению к этому сегменту, но про­цессам, успевшим получить дескриптор сегмента, по-прежнему разрешается под­ключать сегмент к своей виртуальной памяти. При выполнении последнего систем­ного вызова отключения сегмента от виртуальной памяти операция уничтожения сегмента завершается.

Вызовы удаленных процедур

Во многих случаях взаимодействие процессов соответствует отношениям клиент-сервер. Один из процессов (клиент) запрашивает у другого процесса (сервера) некоторую услугу (сервис) и не продолжает свое выполнение до тех пор, пока эта услуга не будет выполнена (то есть пока процесс-клиент не получит соответству­ющие результаты). Видно, что семантически такой режим взаимодействия экви­валентен вызову процедуры. Отсюда и соответствующее название — вызов уда­ленной процедуры (Remote Procedure Call, RPC). Другими словами, процесс обращается к процедуре, которая не принадлежит данному процессу. Она может находиться даже на другом компьютере. Операционная система UNIX по своей «идеологии» идеально подходит для того, чтобц быть сетевой операционной сис­темой, на основе которой можно создавать распределенные системы и организо­вывать распределенные вычисления. Свойства переносимости позволяют созда­вать «операционно-однородные» сети, включающие разнородные компьютеры. Однако остается проблема разного представления данных в компьютерах разной архитектуры. Поэтому одной из основных идей RPC является автоматическое обес­печение преобразования форматов данных при взаимодействии процессов, выпол­няющихся на разнородных компьютерах.

Реализация механизма вызовов удаленных процедур (RPC) достаточно сложна, поскольку этот механизм должен обеспечить работу взаимодействующих процес­сов, находящихся на разных компьютерах. Если в случае обращения к процедуре, расположенной на том же компьютере, процесс общается с пей через стек или об­щие области памяти, то в случае удаленного вызова передача параметров процеду­ре превращается в передачу запроса по сети. Соответственно, и получение резуль­тата также осуществляется с помощью сетевых механизмов.


336________________ Глава 10, Краткий обзор современных операционных систем

Вызов удаленных процедур включает следующие шаги [39].

1. Процесс-клиент осуществляет вызов локальной процедуры, которую называ­
ют заглушкой (stub). Задача этого модуля-заглушки — принять аргументы, пре­
образовать их в стандартную форму и сформировать сетевой запрос. Упаковка
аргументов и создание сетевого запроса называется сборкой (marshalling).

2. Сетевой запрос пересылается на удаленную систему, где соответствующий мо­
дуль ожидает такой запрос и при его получении извлекает параметры вызова
процедуры, то есть выполняет разборку (unmarshalling), а затем передает их
серверу удаленной процедуры. После выполнения осуществляется обратная
передача.



<== предыдущая лекция | следующая лекция ==>
Семафоры | Операционная система Linux


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.929 сек.