linux c 共享内存,linux查看共享内存
大家好,感谢邀请,今天来为大家分享一下linux c 共享内存的问题,以及和linux查看共享内存的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
linux共享内存分配
在Linux系统中,进程通过调用 shmget(共享内存获取)函数来申请一块可以供多个进程共享的内存区域。这个函数的使用需要三个关键参数。
首先,第一个参数是一个唯一的键值,用于标识共享内存。为了创建一个独占的内存块,进程可以使用IPC_PRIVATE常量作为键值。然而,如果其他进程也选择相同的键值,可能会导致冲突。通过指定一个已存在的键值,进程可以访问已存在的共享内存块,前提是权限允许。
第二个参数是所请求内存的大小。系统会以页面大小为单位进行分配,所以实际分配的内存大小会是页面大小的整数倍。这意味着,即使请求的大小不是页面的整数倍,也会向上取整分配。
第三个参数是一组标志,通过按位或操作来控制共享内存的行为。IPC_CREAT标志用于创建新的共享内存块,如果键值已被占用,只有当同时使用IPC_EXCL标志时,函数才会失败并拒绝创建。IPC_EXCL可以确保进程获得的是一个独占的内存块,而非共享现有资源。
权限控制由模式标志(通常由S_IRUSR, S_IWUSR, S_IROTH, S_IWOTH等常量组合)完成,这些标志决定了属主、属组和其他用户对内存块的访问权限。例如,S_IRUSR和S_IWUSR允许属主读写,S_IROTH和S_IWOTH则允许其他用户只读或只写。在创建共享内存时,可以设置这些标志来限制访问权限。
如果shmget调用成功,它会返回一个标识符,用于后续对共享内存的操作。如果内存块已存在,系统会检查权限和销毁标记。这样,进程就能有效地管理和共享内存资源。
linux查看共享内存命令
共享内存查看
使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:
[root@localhost~]# ipcs-m
------ Shared Memory Segments--------
key shmid owner perms bytes nattch status
0x00000000 1867776 root 600 393216 2 dest
0x00000000 1900545 root 600 393216 2 dest
0x00030021 1703938 zc 666 131104 1
0x0003802e 1736707 zc 666 131104 1
0x00030004 1769476 zc 666 131104 1
0x00038002 1802245 zc 666 131104 1
0x00000000 1933318 root 600 393216 2 dest
0x00000000 1966087 root 600 393216 2 dest
0x00000000 1998856 root 600 393216 2 dest
0x00000000 2031625 root 600 393216 2 dest
0x00000000 2064394 root 600 393216 2 dest
0x0014350c 2261003 cs 666 33554432 2
0x00000000 2129932 root 600 393216 2 dest
0x00000000 2162701 root 600 393216 2 dest
0x00143511 395837454 root 666 1048576 1
其中:
第一列就是共享内存的key;
第二列是共享内存的编号shmid;
第三列就是创建的用户owner;
第四列就是权限perms;
第五列为创建的大小bytes;
第六列为连接到共享内存的进程数nattach;
第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。
如何设置LINUX的共享内存
我们可以修改shmmax内核参数,使SGA存在于一个共享内存段中。
通过修改/proc/sys/kernel/shmmax参数可以达到此目的。
[root@neirong root]# echo 1073741824>/proc/sys/kernel/shmmax
[root@neirong root]# more/proc/sys/kernel/shmmax
1073741824这里设为1G。
对于shmmax文件的修改,系统重新启动后会复位。可以通过修改/etc/sysctl.conf使更改永久化。
在该文件内添加以下一行 kernel.shmmax= 1073741824这个更改在系统重新启动后生效.
1、设置 SHMMAX
SHMMAX
参数定义共享内存段的最大尺寸(以字节为单位)。在设置 SHMMAX时,切记 SGA的大小应该适合于一个共享内存段。 SHMMAX设置不足可能会导致以下问题:
ORA-27123:unable to attach to shared memory segment
您可以通过执行以下命令来确定 SHMMAX的值:
# cat/proc/sys/kernel/shmmax
33554432
SHMMAX的默认值是 32MB。我一般使用下列方法之一种将 SHMMAX参数设为 2GB:
通过直接更改/proc文件系统,你不需重新启动机器就可以改变 SHMMAX的默认设置。我使用的方法是将以下命令放入/etc/rc.local启动文件中:
#>echo"2147483648">/proc/sys/kernel/shmmax
您还可以使用 sysctl命令来更改 SHMMAX的值:
# sysctl-w kernel.shmmax=2147483648
最后,通过将该内核参数插入到/etc/sysctl.conf启动文件中,您可以使这种更改永久有效:
# echo"kernel.shmmax=2147483648">>/etc/sysctl.conf
2、设置 SHMMNI
我们现在来看 SHMMNI参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096。这一数值已经足够,通常不需要更改。
您可以通过执行以下命令来确定 SHMMNI的值:
# cat/proc/sys/kernel/shmmni
4096
3、设置 SHMALL
最后,我们来看 SHMALL共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:
ceil(SHMMAX/PAGE_SIZE)
SHMALL的默认大小为 2097152,可以使用以下命令进行查询:
# cat/proc/sys/kernel/shmall
2097152
SHMALL的默认设置对于我们的 Oracle9 i RAC安装来说应该足够使用。
注意:在 i386平台上 Red Hat Linux的页面大小为 4096字节。但是,您可以使用 bigpages,它支持配置更大的内存页面尺寸。