共享内存是可以被多个进程访问的内存;即可以在不同进程之间共享的内存区域以及在两个进程之间传递数据的更好方式。共享内存是目前可用的最快的进程间通信形式。
假设程序将创建一个内存部分,另一个进程可以访问(如果允许)。同一进程可以多次附加共享段。每当内存映射到进程的地址空间,即共享公共内存区域时,内核在进程之间传递数据时将不参与。许多应用程序(例如 Oracle SGA 需要共享内存设置)都使用此功能。
让我们通过一些例子来检查一些 IPCS 命令。
-m使用选项打印活动共享内存段。
“dest”状态意味着内存段被标记为销毁
“nattach”字段显示有多少应用程序 pid 仍然附加到共享内存
# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 root 600 393216 2 dest
0x00000000 98305 root 600 393216 2 dest
以下命令打印有关活动共享内存段的信息:
# ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
打印有关活动共享内存队列的信息:
# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
打印有关可访问信号量的信号量的信息。ipcs -l 显示共享内存、信号量和消息的限制。
# ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
------ Messages: Limits --------
max queues system wide = 16
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536
下面的命令显示了 Linux 进程可以在其虚拟地址空间中分配的单个内存段的最大大小。您可以通过执行以下命令来限制单个内存段的最大大小。
# cat /proc/sys/kernel/shmmax
4294967295
您可以通过回显到相关的/proc 文件来设置 shmmax 值,如下所示。以下命令将单个内存段的最大大小(以字节计)设置为 8388698:
# echo 8388608 > /proc/sys/kernel/shmmax
以类似的方式,您可以设置 System V IPC 消息队列中任何单个消息的最大允许大小(以字节为单位)。
# echo 8192 > /proc/sys/kernel/msgmax
您可以使用以下命令检查信号量的当前内核参数。
# cat /proc/sys/kernel/sem
250 32000 32 128
where
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767