- •Кафедра програмного забезпечення автоматизованих систем
- •Теоретичні відомості
- •1.Средства межпроцессной коммуникации (ipc)
- •Разделяемая память
- •Функции для работы с разделяемой памятью
- •3. Потоки
- •Лістинг програми а
- •Результат роботи програми б
- •Висновок
- •Результат виконання програми а
- •Лістинг програми б
Разделяемая память
Когда процесс А посылает данные другому процессу В через канал, происходят следующие действия: данные копируются из буфера процесса А в буфер ядра, затем эти же данные копируются из буфера ядра в буфер процесса В.Механизм разделяемой памяти позволяет исключить передачу данных через ядро, предоставляя нескольким процессам доступ к одной и той же области памяти – разделяемой памяти.
Необходимо заметить, что разделяемая память имеет и недостаток по сравнению с каналами. Так как работа с разделяемой памятью может осуществляться многими процессами, присутствует вероятность одновременного изменения содержимого памяти несколькими процессами, что может привести к ошибке. Для псевдопараллельных вычислений, вероятность такого события намного меньше, чем при действительных параллельных вычислениях. Но и в этом случае, нельзя не обращать внимания на эту отличительную особенность разделяемой памяти от остальных механизмов коммуникации процессов. Для предотвращения одновременного изменениянесколькими процессами разделяемой памяти используются семафоры, с которыми вы познакомитесь, выполняя следующую работу.
Для получения информации по механизмам ipc, используйте команду
$ipcs.
Для получения информации только по сегментам разделяемой памяти используйте команду $ipcs –m.
Функции для работы с разделяемой памятью
Для использования функций работы с разделяемой памятью необходимо подключить заголовочные файлы 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 от виртуальной памяти процесса, вызвавшего данную функцию.
