А. Робачевский - Операционная система UNIX (1114671), страница 51
Текст из файла (страница 51)
Сервер получает доступ к разделяемой памяти, используя семафор.2. Сервер производит запись данных в разделяемую память.После завершения записи сервер освобождает разделяемую память спомощью семафора.4. Клиент получает доступ к разделяемой памяти, запирая ресурс с по!мощью семафора.5. Клиент производит чтение данных из разделяемой памяти и освобож!дает ее, используя семафор.Для каждой области разделяемой памяти, ядро поддерживает структуруданныхосновными полями которой являются:structshm_permПрава доступа, владельца и создателя области (см.описаниевыше)shm_segsz Размер выделяемой памятиwww.books-shop.comВзаимодействиепроцессамиushort259Числоиспользующих разделяемую па%мятьВремя последнего присоединения к разделяемойпамятиВремя последнего отключения от разделяемойпамятиВремя последнего измененияДля создания или для доступа к уже существующей разделяемой памятииспользуется системный вызов<sys/ipc.h>intkey,size, intФункция возвращает дескриптор разделяемой памяти в случае успеха, и !1 вслучае неудачи.
Аргумент s i z e определяет размер создаваемой области па!мяти в байтах.аргумента s h m f l a g задают права доступа к объектуи специальные флагииЗаметим, что вызовлишь создает или обеспечивает доступ к разделяемой памяти, но не позво!ляет работать с ней.
Для работы с разделяемой памятью (чтение и запись)необходимо сначала присоединить (attach) область вызовомttinclude <sys/ipc.h>ttinclude <sys/shm.h>charshmid, charintВызоввозвращает адрес начала области впространствепроцесса размеромзаданным предшествующем вызовомВэтом адресном пространстве взаимодействующие процессы могут разме!щать требуемые структуры данных для обмена информацией.
Правила по!лучения этого адреса следующие:1. Если аргументнулевой, то система самостоятельно выбираетадрес.2. Если аргумент shmaddr отличен от нуля, значение возвращаемого ад!реса зависит от наличия флажка SHM RND в аргументе• Если флажок SHM RND не установлен, система присоединяетразделяемуюк указанному shmaddr адресу.• Если флажок SHM_RND установлен, система присоединяет разде!ляемую память к адресу, полученному округлением в меньшуюсторону shmaddr до некоторой определенной величины SHMLBA.По умолчанию разделяемая память присоединяется с правами на чтение изапись.
Эти права можно изменить, указав флажокв аргумен!те s h m f l a g .Ⱦɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com260Глава 3.управления процессамиТаким образом, несколько процессов могут отображать область разделяе!мой памяти в различные участки собственного виртуального адресногопространства, как это показано на рис.
3.20.3.20. Совместное использование разделяемой памятиОкончив работу с разделяемой памятью, процесс отключает (detach) об!ласть вызовом<sys/ipc.h>intПри работе с разделяемой памятью необходимо синхронизировать выпол!нение взаимодействующих процессов: когда один из процессов записываетданные в разделяемую память, остальные процессы ожидают завершенияоперации. Обычно синхронизация обеспечивается с помощью семафоров,назначение и число которых определяется конкретным использованиемразделяемой памяти.Можно привести примерную схему обмена данными между двумя процес!сами (клиентом и сервером) с использованием разделяемой памяти.
Длясинхронизации процессов использована группа из двух семафоров. Пер!вый семафор служит для блокирования доступа к разделяемой памяти, егоразрешающий сигнал — 0, а 1 является запрещающим сигналом. Второйсемафор служит для сигнализации серверу о том, что клиент начал работу.Необходимость применения второго семафора обусловлена следующимиобстоятельствами: начальное состояние семафора, синхронизирующегоработу с памятью, является открытым (0), и вызов сервером операциизаблокирует обращение к памяти для клиента. Таким образом,www.books-shop.comВзаимодействиесервер должен вызвать операциютолько после того, как разде!ляемую память заблокирует клиент.второго семафора заклю!чается в уведомлении сервера, что клиент начал работу, заблокировал раз!деляемую память и начал записывать данные в эту область.
Теперь, привызове сервером операции mem_lock его выполнение будет приостановле!но до освобождения памяти клиентом, который делает это после оконча!ния записи строки "Здравствуй,ttdefine80ttdefinePERM0666/*Структура данных в разделяемойtypedef structint segment;char} Message;/*0жидание начала выполненияstatic struct[1 ] = {1, 1, 0сервера о том, что клиент началstatic struct sembuf= {1, 1, 0/*Блокирование разделяемойstatic struct sembuf= {О, О, О,0 }/*0свобождениеstatic struct sembufО, 1, 0{Сервер:<sys/ipc.h><sys/sem.h><sys/shm.h>"shmem.h"{Messagekey_tkey;int shmid, semid;/*ПолучимОдин и тот же ключ можно использовать как длясемафора, так и для разделяемойwww.books-shop.com262Глава 3.if ( (key =printfпроцессами<получить}область разделяемойif (PERM |(Message.) ,< 0){создать областьif ( (msgptr(Message0,}<}группу из двухПервый семафор — для синхронизации работы сВторой семафор — для синхронизации выполненияif (=2, PERM |<создать}пока клиент начнет работу и заблокирует разделяемуюif1) <выполнить}/*Ждем, пока клиент закончит запись в разделяемую память иосвободит ее.
После этого заблокируемif2) <printf ( "Невозможносообщение на/*0свободим разделяемуюif/*0тключимся отif1) <выполнить}}<}остальную работу по удалению объектов сделаетexit (0)}Клиент:ttincludettinclude <sys/ipc.h>#include#include{Message*msgptr;www.books-shop.comkey_tkey;семафора,if (/*Получимif (semid;Один и тот же ключ можно использовать как длятак и для разделяемой(key<получить}доступ к разделяемой(shmid =<}if (= (Message *)0,<}доступ кif ( (semid =2,<}/*3аблокируем разделяемуюif (semop (semid,, 2) <выполнить}1) <выполнить}сервер о началеif/*3апишем в разделяемую память"Здравствуй,/*0свободим разделяемуюif1) <выполнить}/*Ждем, пока сервер в свою очередь не освободит разделяемуюпамятьif2) <выполнить}отif<}/*Удалим созданные объектыifIPC_RMID, 0) <удалитьif(semid, 0,< 0) {удалить)}www.books-shop.com264Глава 3.
Подсистема управления процессамиМежпроцессное взаимодействие в BSD UNIX.Разработчики системы межпроцессного взаимодействия BSD UNIX руко!водствовались рядом соображений:Во!первых, взаимодействие между процессами должно быть унифицирова!но, независимо от того, выполняются ли они на одном компьютере или наразных хостах сети. Наиболее оптимальная реализация межпроцессноговзаимодействия, удовлетворяющего этому требованию, должна иметь мо!дульную структуру и базироваться на общей подсистеме поддержки сетиUNIX.
При этом могут быть использованы различные схемы адресации объ!ектов, их расположение, протоколы передачи данных и т. д. В этой связибыло введено понятие коммуникационный домен (communication domain),описывающее набор обозначенных характеристик взаимодействия.Для обозначения коммуникационного узла, обеспечивающего прием ипередачу данных для объекта (процесса), был предложен специальныйобъект —(socket). Сокеты создаются в рамках определенного ком!муникационного домена, подобно тому как файлы создаются в рамкахфайловой системы. Сокеты имеют соответствующий интерфейс доступа вфайловой системе UNIX, и так же как обычные файлы, адресуются неко!торым целым числом — дескриптором.
Однако в отличие от обычныхфайлов,представляют собой виртуальный объект, который сущест!вует, пока на него ссылается хотя бы один из процессов.Во!вторых, коммуникационные характеристики взаимодействия должныбыть доступны процессам в некоторой унифицированной форме. Другимисловами, приложение должно иметь возможность затребовать определен!ный тип связи, например, основанный на виртуальном канале (virtualcircuit) или датаграммах (datagram), причем эти типы должны быть согла!сованы для всех коммуникационных доменов.
Все сокеты условно можноразделить на несколько типов, в зависимости от предоставляемых комму!никационных характеристик. Полный набор этих характеристик включает:Упорядоченную доставку данныхОтсутствие дублирования данныхО Надежную доставку данныхСохранение границ сообщенийО Поддержку передачи экстренных сообщенийустановление соединенияНапример, каналы, рассмотренные ранее, обеспечивают только первыетри характеристики. При этом данные имеют вид сплошного потока, вы!членение сообщений из которого должно при необходимости быть обеспе!чено взаимодействующими приложениями.Поддержка передачи экстренных сообщений предполагает возможностьдоставки данных вне нормального потока.
Как правило, это сообщения,www.books-shop.comпроцессами265связанные с некоторыми срочными событиями, требующими немедленнойреакции.Взаимодействие с предварительным установлением соединения предпола!гает создание виртуального канала между источником и получателем дан!ных. Это избавляет от необходимости идентифицировать передающуюсторону в каждом пакете данных. Идентификация происходит на началь!ном этапе установления связи и затем сохраняется для всех пакетов, при!надлежащих данному виртуальному каналу.В BSD UNIX реализованы следующие основные типы сокетов:(datagram socket), через который осуществляетсятеоретически ненадежная, несвязная передача пакетов.Сокет потока (stream socket), через который осуществляется надеж!ная передача потока байтов без сохранения границ сообщений.
Этоттип сокетов поддерживает передачу экстренных данных.Сокет пакетов (packet socket), через который осуществляется надеж!ная последовательная передача данных без дублирования с предвари!тельным установлением связи. При этом сохраняются границы со!общений.Сокет низкого уровня (raw socket), через который осуществляется не!посредственный доступ к коммуникационному протоколу.Наконец, для того чтобы независимые процессы имели возможность взаи!модействовать друг с другом, для сокетов должно быть определено про!странство имен. Имя сокета имеет смысл только в рамках коммуникаци!онного домена, в котором он создан.