Разделяемая память. Последовательность системных вызовов. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Разделяемая память. Последовательность системных вызовов.



Разделяемая память может быть наилучшим образом описана как

отображение участка (сегмента) памяти, которая будет разделена между

более чем одним процессом. Это гораздо более быстрая форма IPC, потому

что здесь нет никакого посредничества (т.е. каналов, очередей

сообщений и т.п.). Вместо этого, информация отображается

непосредственно из сегмента памяти в адресное пространство вызывающего

процесса. Сегмент может быть создан одним процессом и впоследствии

использован для чтения/записи любым количеством процессов.

Для работы с разделяемой памятью определены следующие функции: shmget, shmat, shmdt, shmctl.

 

Параметры функции shmget.

Прототип функции shmget имеет следующий вид:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget (key_t key, int size, int flag);

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

Если значение аргумента key —■ положительное целое, данный вызов пробует открыть разделяемую область памяти, ключевой идентификатор которой с этим значением. Если же значением key является макрос IPC_PRIVATE, вызов выделяет новую разделяемую область памяти, которая будет использоваться исключительно выбивающим процессом. Такая "частная" разделяемая область памяти обычно выделяется родительским процессом, который затем создает один или несколько порожденных процессов. Родительский и порожденные процессы пользуются этой разделяемой памятью для обмена данными.

Аргумент size задает размер области разделяемой памяти, которая может быть подсоединена к вызывающему процессу с помощью вызова shmat. Если в результате этого вызова создается новая область разделяемой памяти, ее размер

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

Если аргумент flag равен нулю и нет области разделяемой памяти, идентификатор которой совпадал бы с заданным значением key, то этот вызов завершается неудачно. В противном случае он возвращает дескриптор этой

области. Если процессу необходимо создать разделяемую область памяти с заданным key (и области с таким идентификатором нету, то значение аргумента flag и должно представлять собой результат побитового логического сложения константы IPC_CREAT и прав доступа к новой области памяти дня чтения и записи.

В случае успешного выполнения эта функция возвращает положительный дескриптор, а в случае неудачи -1.

 

Параметры функции shmat.

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

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

void* shmat (int shmid, void* addr, int flag);

Эта функция подсоединяет область разделяемой памяти, указанную

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

Аргумент addr задает начальный виртуальный адрес адресного.

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

Если значение аргумента addr не равно нулю, аргумент flag может содержать флаг SHM_RND. Этот флаг указывает ядру на то, что виртуальный адрес, заданный в аргументе addr, можно округлить до границы страницы памяти. Если флаг SHM_RND отсутствует В значение аргумента addr не равно нулю, соответствующий вызов завершается неудачно.

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

Этот вызов возвращает виртуальный адрес области отображения

разделяемой памяти, а в случае неудачи -1. Следует отметить, что любой

процесс, с целью подсоединения одной разделяемой, области памяти к

виртуальным адресным пространствам многих процессов, может вызывать функцию shmat многократно.

 

Параметры функции shmdt.

Прототип функции shmdt имеет следующий вид:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmdt (void* addr);

Эта функция отсоединяет разделяемую память от заданного аргументом addr виртуального адреса вызывающего процесса.

Прежде чем вызывать данную функцию, необходимо получить посредством вызова shmat значение addr.

В случае успешного выполнения рассматриваемая функция возвращает 0, а в случае неудачи -1.

 

Параметры функции shmctl.

Прототип функции shmctl имеет следующий вид.

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmctl (int shmid, int and, struct shmid_ds* buf);

С помощью этой функции можно запрашивать управляющие параметры. разделяемой области памяти, указанной аргументом shmid, изменять эти параметры и удалять данную область памяти.

Значение shmid — это дескриптор' разделяемой области памяти, полученный посредством вызова функции shmget.

Аргумент buf — это адрес объекта типа struct shmid_ds, который можно использовать для задания и выборки управляющих параметров разделяемой памяти, указанных аргументом cmd. Ниже перечислены возможные значения аргумента cmd и вызываемые ими действия:

Значение cmd Что должен сделать процесс копировать управляющие параметры разделяемой области памяти в объект, указанный аргументом bnf

IPC SET Заменить управляющие параметры разделяемой области памяти параметрами, определенными в объекте, на который указывает аргумент buf. Чтобы выполнить эту операцию, вызывающий процесс должен иметь права привилегированного пользователя, создателя или назначенного владельца разделяемой памяти.

IPC_STAT Рассматриваемый вызов может устанавливать только UID владельца области и идентификатор его группы, а также права доступа

IPC_RMID Удалить разделяемую область памяти из системы. Чтобы выполнить эту операцию, вызывающий процесс должен иметь права привилегированного пользователя, создателя или назначенного владельца области. Если к разделяемой области памяти, подлежащей удалению, подсоединены один или несколько процессов, то операция удаления будет отложена до тех пор, пока эти процессы не отсоединятся от нее

SHM_LOCK Блокировать разделяемую, область памяти. Для выполнения этой операции вызывающий процесс должен обладать правами привилегированного пользователя

SHM_UNLOCK Разблокировать разделяемую область памяти. Для выполнения этой операции вызывающий процесс должен обладать правами привилегированного пользователя

В случае успешного выполнения рассматриваемый вызов возвращает 0, а в случае неудачи -1.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 144; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.19.56.45 (0.049 с.)