Скачиваний:
85
Добавлен:
12.05.2015
Размер:
913.92 Кб
Скачать

20.6. Выводы по главе 20

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

В этой главе мы подробно рассмотрели свойства функции mmapи отображение обычных файлов в память, потому что это один из способов организации взаимодействия между родственными процессами. После отображения файла в память для обращения к нему больше не нужно использовать системные вызовыread,writeиlseek– вместо этого можно напрямую работать с ячейками памяти, относящимися к той области, указатель на которую возвращает функцияmmap. Замена явных операций с файлом на обращение к ячейкам памяти может упростить программу и в некоторых случаях увеличить быстродействие.

Если необходимо совместное использование области памяти после вызова fork, можно упростить решение этой задачи, используя один из способов неименованного отображения в память.

20.7. Упражнения по главе 20

20.1. Что произойдет с программой из листинга 19.4, если добавить еще один повтор циклаfor?

20.2. Измените программу влистинге 19.2, указавMAP_PRIVATEвместоMAP_SHARED. Проверьте, что результаты будут такими же, как и при выполнении программы излистинга 19.1. Что будет содержаться в файле, отображенном в память, по завершении работы программы?

Глава 21. Разделяемая память System V

21.1. Введение

Для каждого сегмента разделяемой памяти ядро хранит нижеследующую структуру, определенную в заголовочном файле <sys/shm.h>, основные поля которой суть следующие:

struct shmid_ds

{

struct ipc_perm shm_perm; /* разрешения чтения-записи */

size_t shm_segsz; /* размер сегмента в байтах */

pid_t shm_lpid; /* идентификатор последнего процесса, вызвавшего

функцию shmat() или shmdt() */

pid_t shm_cpid; /* идентификатор процесса-создателя */

shmatt_t shm_nattch; /* текущее количество подключений */

time_t shm_atime; /* время последнего подключения shmat() */

time_t shm_dtime; /* время последнего отключения shmdt() */

time_t shm_ctime; /* время последнего вызова shmctl(), изменившего

значение хотя бы одного из полей структуры */

};

Структура ipc_permбыла описана в разделе 16.3; она содержит разрешения доступа к сегменту разделяемой памяти.

21.2. Функция shmget

С помощью функции shmgetможно создать новый сегмент разделяемой памяти или открыть существующий сегмент:

#include <sys/shm.h>

int shmget (key_t key, size_t size, int oflag);

/* возвращает идентификатор сегмента разделяемой памяти в случае успешного завершения, -1 – в случае ошибки */

Возвращаемое целочисленное значение называется идентификатором сегмента разделяемой памяти. Оно используется тремя другими функциями shmXXX.

Аргумент keyможет содержать значение, возвращаемое функциейftok, или константуIPC_PRIVATE, как обсуждалось в разделе 16.2.

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

Флаг oflagпредставляет собой комбинацию флагов доступа на чтение и запись из табл. 16.3. К ним могут быть добавлены с помощью логического сложения флагиIPC_CREATилиIPC_CREAT | IPC_EXCL, как уже говорилось в связи с рис. 16.2.

Новый сегмент инициализируется нулями.

Обратите внимание, что функция shmgetсоздает или открывает сегмент разделяемой памяти, но не дает вызвавшему процессу доступа к нему. Для подключения сегмента памяти предназначена функцияshmat, описанная в следующем разделе.

Соседние файлы в папке Chapter.4