КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Разделяемая память, как средство взаимодействия процессов System VIPC.Интенсивный обмен данными между процессами с использованием рассмотренных механизмов межпроцессного взаимодействия (каналы, FIFO, очереди сообщений) может вызвать падение производительности системы. Это, в первую очередь, связано с тем, что данные, передаваемые с помощью этих объектов, копируются из буфера передающего процесса в буфер ядра и затем в буфер принимающего процесса. Механизм разделяемой памяти позволяет избавиться от накладных расходов передачи данных через ядро, предоставляя двум или более процессам возможность непосредственного получения доступа к одной области памяти для обмена данными. Безусловно, процессы должны предварительно "договориться" о правилах использования разделяемой памяти. Например, пока один из процессов производит запись данных в разделяемую память, другие процессы должны воздержаться от работы с ней. К счастью, задача кооперативного использования разделяемой памяти, заключающаяся в синхронизации выполнения процессов, легко решается с помощью семафоров. Примерный сценарий работы с разделяемой памятью выглядит следующим образом: 1. Сервер получает доступ к разделяемой памяти, используя семафор. 2. Сервер производит запись данных в разделяемую память. 3. После завершения записи сервер освобождает разделяемую память с помощью семафора. 4. Клиент получает доступ к разделяемой памяти, запирая ресурс с помощью семафора. 5. Клиент производит чтение данных из разделяемой памяти и освобождает ее, используя семафор. Для создания или для доступа к уже существующей разделяемой памяти используется системный вызов shmget: #include <machine/param.h> int shmget(key_t key, int size, int flag) ; Функция возвращает дескриптор разделяемой памяти в случае успеха, и -1 в случае неудачи. Аргумент size определяет размер создаваемой области памяти в байтах. Значения аргумента flag задают права доступа к объекту и специальные флаги IPC__CREAT и IPC_EXCL. Заметим, что вызов shmget лишь создает или обеспечивает доступ к разделяемой памяти, но не позволяет работать с ней. Для работы с разделяемой памятью (чтение и запись) необходимо сначала присоединить (attach) область вызовом shmat: #include <sys/types.h > #include <sys/ipc.h> #include <sys/shm.h> void *shmat(int shmid, void *addr , int flag) ; Вызов shmat возвращает адрес начала области в адресном пространстве процесса размером size , заданным предшествующем вызовом shmget. В этом адресном пространстве взаимодействующие процессы могут размещать требуемые структуры данных для обмена информацией. Правила получения этого адреса следующие: 1. Если аргумент addr нулевой, то система самостоятельно выбирает адрес. 2. Если аргумент addr отличен от нуля, значение возвращаемого адреса зависит от наличия флажка SHM_RND в аргументе flag: Если флажок SHM_RND не установлен, система присоединяет разделяемую память к указанному addr адресу. Если флажок SHM_RND установлен, система присоединяет разделяемую память к адресу, полученному округлением в меньшую сторону addr до начала страницы, т.о. несколько процессов могут отображать область памяти в область собственного адресного рпостранства. По умолчанию разделяемая память присоединяется с правами на чтение и запись. Эти права можно изменить, указав флажок SHM_RDONLY в аргументе flag. Окончив работу с разделяемой памятью, процесс отключает (detach) область вызовом shmdt: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmdt(void *addr); При работе с разделяемой памятью необходимо синхронизировать выполнение взаимодействующих процессов: когда один из процессов записывает данные в разделяемую память, остальные процессы ожидают завершения операции. Обычно синхронизация обеспечивается с помощью семафоров, назначение и число которых определяется конкретным использованием разделяемой памяти.
|