Разделяемую память (англ. Shared memory) применяют для того, чтобы увеличить скорость прохождения данных между процессами. В обычной ситуации обмен информацией между процессами проходит через ядро. Техника разделяемой памяти позволяет осуществить обмен информацией не через ядро, а используя некоторую часть виртуального адресного пространства, куда помещаются и откуда считываются данные.
После создания разделяемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним, как с обычным сегментом памяти. Недостатком такого обмена информацией является отсутствие каких бы то ни было средств синхронизации, однако для преодоления этого недостатка можно использовать технику семафоров.
Хочу напомнить, что физическая память состоит из kernel memory (память ядра), shared memory и свободной памяти. Если же происходит нехватка памяти, начинается процесс свопинга. Вот простой пример для вычисления каждого компонента (позаимствован с сайте unixpin.com)
Физическая память:
$kstat -n system_pages | nawk 'BEGIN{ "/usr/bin/pagesize" | getline pgsize ; } /physmem/ { print "Physical memory = " $2 * pgsize/1073741824 "Gb"}'
Память ядра:
$kstat -n system_pages | nawk 'BEGIN{ "/usr/bin/pagesize" | getline pgsize ; } /pp_kernel/ { print "Kernel memory = " $2 * pgsize/1073741824 "Gb"}'
Разделяемая (shared) память:
$ipcs -mb | awk '/^m/ {sm=sm+$7}END{ print "Shared memory " sm/1073741824 "Gb"}'
Свободная память:
$kstat -n system_pages | nawk 'BEGIN{ "/usr/bin/pagesize" | getline pgsize ; } /freemem/ { print "Free memory = " $2 * pgsize/1073741824 "Gb"}'
Тестовый стенд: Solaris 11
Что бы посмотреть полностью статистику делаем так:
# ipcs -A IPC status from <running system> as of Mon Apr 16 09:49:40 EDT 2012 T ID KEY MODE OWNER GROUP CREATOR CGROUP CBYTES QNUM QBYTES LSPID LRPID STIME RTIME CTIME PROJECT Message Queues: T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME ISMATTCH PROJECT Shared Memory: m 16777241 0x172b2 --rw-r--r-- user5 other user5 other 0 4999610368 27961 4452 16:35:00 16:35:01 20:41:13 0 user.user5 m 16777240 0x172b3 --rw-r--r-- user5 other user5 other 0 4999610368 3341 27947 20:40:52 20:40:52 20:10:02 0 user.user5 m 16777228 0x1729e --rw-r--r-- user5 other user5 other 0 4999610368 12578 2829 17:04:51 17:04:54 16:25:00 0 user.user5 T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME PROJECT Semaphores:
Но часто достаточно посмотреть только об активных сегментах shared memory:
# ipcs -m IPC status from <running system> as of Mon Apr 16 09:52:16 EDT 2012 T ID KEY MODE OWNER GROUP Shared Memory: m 16777241 0x172b2 --rw-r--r-- user5 other m 16777240 0x172b3 --rw-r--r-- user5 other m 16777228 0x1729e --rw-r--r-- user5 other
Для удаления объекта из shared memory применяется команда ipcrm, которая в качестве параметра принимает ID SHM-объекта.
По умолчанию процесс может использовать под shared memory всю доступную память, без ограничений. Посмотрим, сколько доступно shared memory для обычного пользователя без ограничений:
# prctl -n project.max-shm-memory $$ process: 14290: /usr/bin/bash NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 382MB - deny - system 16.0EB max deny -
А вот пример ограниченний для зоны (зоне выделено 16Гб)
# prctl -n project.max-shm-memory $$ process: 12547: -bash NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT project.max-shm-memory privileged 15.6GB - deny - system 16.0EB max deny