Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по ОС.doc
Скачиваний:
50
Добавлен:
24.09.2019
Размер:
202.24 Кб
Скачать

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

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

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

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

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

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

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

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

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

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

21)Параметры функции 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.

22)Параметры функции 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 многократно.