Руководство программиста для Linux


Разделяемая память


Основные понятия

Разделяемая память может быть наилучшим образом описана как отображение участка (сегмента) памяти, которая будет разделена между более чем одним процессом. Это гораздо более быстрая форма IPC, потому что здесь нет никакого посредничества (т.е. каналов, очередей сообщений и т.п.). Вместо этого, информация отображается непосредственно из сегмента памяти в адресное пространство вызывающего процесса. Сегмент может быть создан одним процессом и впоследствии использован для чтения/записи любым количеством процессов.

Внутренние и пользовательские структуры данных

Давайте взглянем на структуру данных, поддерживаемую ядром, для разделяемых сегментов памяти.

Структура ядра shmid_ds

Так же, как для очередей сообщений и множеств семафоров, ядро поддерживает специальную внутреннюю структуру данных для каждого разделяемого сегмента памяти, который существует врутри его адресного пространства. Такая структура имеет тип shmid_ds и определена в Linux/shm.h как следующая: /* Структура данных shmid для каждого разделяемого сегмента памяти системы */ struct shmid_ds { struct ipc_perm shm_perm; /* права доступа */ int shm_segsz; /* размеры сегмента (в байтах) */ time_t shm_atime; /* время последней привязки */ time_t shm_dtime; /* время последней отвязки */ time_t shm_ctime; /* время последнего изменения */ unsigned short shm_cpid; /* pid создателя */ unsigned short shm_lpid; /* pid последнего пользователя сегмента */ short shm_nattch; /* номер текущей привязки */ /* следующее носит частный характер */ unsigned short shm_npages; /* размеры сегмента (в страницах) */ unsigned long *shm_pages; /* массив указателей на $frames -> S$ */ struct vm_area_struct *attaches; /* дескрипторы для привязок */ };

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

shm_perm

Это образец структуры ipc_perm, который определен в Linux/ipc.h. Он содержит информацию о доступе к сегменту, включая права доступа и информацию о создателе сегмента (uid и т.п.).

shm_segsz




Начало  Назад  Вперед



Книжный магазин