Создание объектов разделяемой памяти

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

Таблица 2.17. Функции создания и управления областями разделяемой памяти

Функция Описание
shm_open() Открыть (или создать) область разделяемой памяти
сlose() Закрыть область разделяемой памяти
mmap() Отобразить область разделяемой памяти в адресное пространство процесса
munmap() Отсоединить область разделяемой памяти от адресного пространства процесса
mprotect() Изменить атрибуты защиты для заданной области разделяемой памяти
msync() Синхронизировать содержимое памяти с физической памятью
shm_ctl() Назначить специальные атрибуты для объекта разделяемой памяти
shm_unlink() Удалить область разделяемой памяти

 

Функция shm_open() принимает те же аргументы, что и функция ореn(), и возвращает объекту дескриптор файла. Эта функция позволяет создавать новые и открывать существующие объекты разделяемой памяти, как обычные файлы.

При создании нового объекта разделяемой памяти его размер устанавливается равным нулю. Для установки размера используется функция ftruncate() или функция shm_ctl(). Отметим, что это те же самые функции, которые используются для установки размеров файлов.

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

Функция ттар() определяется следующим образом:

void * mmap(void *where_I_want_it,

size_t length,

int memory_protections,

int mapping_flags,

int fd,

off_t offset_within_shared_memory) ;

"Отобразить в адресное пространство текущего процесса length байтов по смещению offset_within_shared_memory из объекта разделяемой памяти, связанного с дескриптором файла fd".

Функция mmap() отображает содержимое памяти по адресу where_i_want_it в адресном пространстве. Эта область памяти получит атрибуты защиты, заданные как memory_protections, а отображение памяти будет выполнено с учетом флагов mapping_flags.

Аргументы fd, offset_within_shared_memory и length определяют параметры части объекта разделяемой памяти, которая должна быть отображена в адресное пространство. Часто отображается весь объект целиком; в этом случае смещение (offset_within_shared_memory) задается равным нулю, а размер (length) — равным размеру объекта в байтах.

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

В качестве атрибута защиты memory protections могут быть заданы следующие типы

Таблица 2.18. Типы атрибута защиты

Декларация Описание
PROT_EXEC Содержимое памяти может быть исполнено
PROT_NOCACHE Отключить кеширование памяти
PROT_NONE Доступ запрещен
PROT_READ Доступ на чтение
PROT_WRITE Доступ на запись

 

Флаги, задаваемые в mapping_flags, определяют способ отображения памяти. Эти флаги разбиваются на две части. Первая часть означает тип флага (табл. 2.19).

 

Таблица 2.19. Типы отображения памяти

Тип отображения памяти Описание
MAP_SHARED Отображение совместно используется вызывающими процессами
MAP_PRIVATE Отображение используется только вызывающим процессом. Этот тип выделяет системную память и создает копию объекта
MAP_ANON Аналогичен типу MAP_PRIVATE, за исключением того, что параметр fd не используется (должен быть установлен в значение NOFD), а выделяемая память заполняется нулями

 

Таблица 2.20, Модификатор типа отображения памяти

Модификатор типа отображения памяти Описание
MAP_FIXED Отобразить объект по адресу, заданному параметром where_i_want_it. Если область разделяемой памяти содержит указатели, тогда эту область, возможно, потребуется расположить по одному и тому же адресу в адресных пространствах всех процессов, отображающих ее. Этого можно избежать, используя смещение внутри области разделяемой памяти вместо прямых указателей
MAP_PHYS Данный флаг задает работу с физической памятью. Параметр fd должен быть установлен в значение NOFD. В сочетании с MAP_SHARED параметр offset_within_shared_memory задает точный адрес (например, для буфера видеокадров), В сочетании с MAP_ANON происходит выделение физически сплошной области памяти (например, для DMA-буфера). Флаги MAP_NOX64K и MAP_BELOW16M служат для дальнейшего определения метода выделения памяти типа MAP_ANON и ограничений адресов, которые существуют в некоторых формах DMA
MAP_NOX64K (Только для семейства процессоров х86.) Используется вместе с MAP_PHYS I MAP_ANON. Выделенная область памяти не может превышать 64 Кбайт. Этот флаг необходим для старых 16-битных контроллеров DMA
MAP_BELOW16M (Только для семейства процессоров х86.) Используется вместе с MAP_PHYS MAP_ANON. Выделенная область памяти не может занимать в физической памяти более 16 Мбайт. Это требуется для работы DMA вместе с устрой­ствами на шине ISA

 

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

/* Отобразить область разделяемой памяти. */

fd = shm_open("datapoints", O_RDWR);

addr = mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

Или совместным с оборудованием использованием памяти, например, видеопамятью:

/* Отобразить видеопамять VGA. */

addr = mmap(0, 65536, PROT_READ | PRQT_WRITE, MAP_PHYS | MAP_SHARED, NOFD, 0xa0000);

Или выделять буфер DMA-памяти для сетевой карты PCI:

/* Выделить физически сплошной буфер. */

addr = mmap(0, 262144, PROT_READ | PROT_WRITE | PROT_NOCACHE, map_phys | map_anon, nofd, 0);

С помощью функции munmap() объект разделяемой памяти можно полностью или частично отсоединить (unmap) от адресного пространства. Применение этого примитива не ограничивается отсоединением разделяемой памяти. Он также может использоваться для отсоединения любой области памяти, занятой в каком-либо процессе. В сочетании с флагом MAP_ANON функция munmap() позволяет реализовать индивидуальный механизм постраничного выделения/отсоединения памяти (private page-level allocator/deallocator).

С помощью функции mprotect() можно изменить атрибуты защиты отображенной области памяти. Так же, как и функция munmap(), функция mprotect() не ограничивается областями разделяемой памяти и может применяться для изменения атрибутов защиты любой области памяти, занятой в каком-либо процессе.

Неименованные и именованные каналы

Неименованный канал (pipe) — это неименованный файл, который служит в качестве канала ввода/вывода между двумя и более взаимодействующими процессами. Один процесс записывает данные в канал, другой процесс читает эти данные из канала. Администратор программных каналов pipe предназначен действовать в роли буфера данных. Размер буфера определяется как PIPEBUF в файле <limits.h>. Канал уничтожается после закрытия его сторон. Функция pathconf() возвращает значение размера буфера.

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

Чтобы Используйте
создать канал из командного интерпретатора символ канала (" | ")
создать канал из программы функцию pipe() или рореn()

Именованные каналы (FIFOs)по сути то же самое, что и неименованные каналы, но они представляют собой именованные постоянные файлы, которые хранятся в каталогах файловой системы.

Чтобы Используйте
создать именованный канал из командного интерпретатора утилиту mkfifо
создать именованный канал из программы функцию mkfifo()
создать именованный канал из командного интерпретатора утилиту rm
удалить именованный канал из программы функцию remove() или unlink()







Дата добавления: 2017-01-29; просмотров: 1271;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.