Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Разделяемая память, как средство взаимодействия процессов 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);

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

 


Поделиться:

Дата добавления: 2015-01-14; просмотров: 120; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты