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

Когда процесс А посылает данные другому процессу В через канал, происходят следующие действия: данные копируются из буфера процесса А в буфер ядра, затем эти же данные копируются из буфера ядра в буфер процесса В.Механизм разделяемой памяти позволяет исключить передачу данных через ядро, предоставляя нескольким процессам доступ к одной и той же области памяти – разделяемой памяти.

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

Для получения информации по механизмам ipc, используйте команду

$ipcs.

Для получения информации только по сегментам разделяемой памяти используйте команду $ipcs –m.

    1. Функции для работы с разделяемой памятью

Для использования функций работы с разделяемой памятью необходимо подключить заголовочные файлы sys/shm.h и sys/ipc.h.

intshmget (key_t key, int size, intshmflag)

Функциясоздаетновыйсегментразделяемойпамятисключом key размером size байт, еслиshmflagравен IPC_CREAT, илинаходитсуществующийсегментсключом key, еслиshmflagравен IPC_EXCL. Если же shmflag равен IPC_CREAT | IPC_EXCL, функция создаст новый сегмент разделяемой памяти с ключом key, только когда не существует другого сегмента разделяемой памяти с тем же ключом. В случае успеха функция возвращает дескриптор разделяемой памяти или отрицательное значение, в случае неудачи. Параметр key может быть равен IPC_PRIVATE, в этом случае, система сама определяет незанятый ключ для разделяемой памяти.

Параметр shmflag также может включать флаги доступа.

Флаг доступа Значение флага доступа

0600 Разрешить чтение и запись для владельца

0400 Разрешить чтение для владельца

0200 Разрешить запись для владельца

0060 Разрешить чтение и запись для группы

0040 Разрешить чтение для группы

0020 Разрешить запись для группы

0006 Разрешить чтение и запись для всех остальных

0004 Разрешить чтение для всех остальных

0002 Разрешить запись всех остальных

void *shmat (intshmid, void *shmaddr, intshmflag)

Функция подключает сегмент разделяемой памяти с указанным дескриптором shmid к виртуальной памяти процесса, вызвавшего данную функцию. Все дочерние процессы, созданные процессом-родителем после вызова функции, также будут иметь доступ к разделяемой памяти. Если shmaddr равен NULL, адрес выделяемого сегмента определяется системой, в противном случае shmaddr задает адрес для выделяемого функцией сегмента. Если shmflag равен нулю, разделяемая память будет доступна как для чтения, так и для записи.Если shmflag равен SHM_RDONLY, разделяемая память будет доступна только для чтения.

intshmdt (void *shmaddr)

Функция отключает сегмент разделяемой памяти с адресом shmaddr от виртуальной памяти процесса, вызвавшего данную функцию.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]