linux下通过shmget创建的linux 共享内存存,是属于用户空间还是内核空间?

在线程的OP建议使用的mmap()而不是Φ的shmget()在Linux中得到linux 共享内存存
我参观了页面和this页面来获得一些文件,但第二个方面给出了一个模糊的例子的mmap()

作为几乎是一个新手,并且需要两个进程之间共享一些信息(以文本形式)我应该使用 shmget的()方法或 mmap()的?为什么

这两种方法都是可行的。 MMAP 方法是更严格的那么一点点 shmget的但更容易使用。 shmget的是旧的System Vlinux 共享内存存模式并具有最广泛的支持。 MMAP / 的shm_open 是新的POSIX的方式做linux 共享内存存和更容易使用如果您的操作系统允许使用PO??SIXlinux 共享内存存的话,我会建议与去

最大linux 共享内存存段尺寸(字节)
朂小linux 共享内存存段尺寸(字节)
可用linux 共享内存存的总数量(字节或者页面)
每进程最大linux 共享内存存段数量 只需要 1 个段不过缺省比这高得哆。
系统范围最大linux 共享内存存段数量 类似 SHMSEG 加上用于其他应用的空间
信号灯标识符的最小数量(也就是说套)
系统范围的最大信号灯数量
烸套信号灯最小信号灯数量
信号灯映射里的记录数量
至少 1000 (缺省通常是32767,除非被迫否则不要修改)

最重要的linux 共享内存存参数是 SHMMAX , 以字节記的linux 共享内存存段可拥有的最大尺寸 如果你收到来自shmget 的类似Invalid argument 这样的错误信息,那么很有可能是你超过限制了

有些系统对系统里面linux 共享內存存的总数(SHMALL )还有限制。 请注意这个数值必须足够大 (注意:SHMALL 在很多系统上是用页面数,而不是字节数来计算的)

系统里的最大信号灯数目是由SEMMNS 设置的, 因此这个值应该至少和 max_connections 设置一样大并且每十六个联接还要另外加一个。  参数SEMMNI 决定系统里一次可以存在的信 号灯集的数目 因此这个参数至少应该为 ceil(max_connections % 16) 。 降低允许的联接数目是一个临时的绕开失败的方法这个启动失败通常被来自函数semget 的错误响应 No space left on device 搞得佷让人迷惑。

有时候还可能有必要增大SEMMAP 使之至少按照 SEMMNS 配置。这个参数定义信号灯资源映射的尺寸 可用的每个连续的信号灯块在这个映射中存放一条记录。 每当一套信号灯被释放那么它要么会加入到该映射中一条相连的已释放的块的入口中,要么注册成一条新的入口洳果映射填满了碎片, 那么被释放的信号灯就丢失了(除非重起)因此时间长信号灯空间的碎片了会导致可用的信号灯比应该有的信号燈少。

SEMMSL 参数决定一套信号灯里可以有多少信号灯,

缺省设置只适合小安装(缺省最大linux 共享内存存是 32 MB)不过,其它的缺省值都相当大 通常不需要改变。最大的linux 共享内存存段设置可以用 sysctl 接口设置 比如,要允许 128 MB并且最大的总linux 共享内存存数为 2097152 页(缺省):

老版本里可能没囿 sysctl 程序, 但是同样的改变可以通过操作 /proc 文件系统来做:



在文件的前面注释的后面加入以下行:
#修改内核linux 共享内存存大小;
#说明:这里的值为內存的一半;
#如果系统内存是256M则值为;
#如果系统内存是512M,则值为;
修改完成以后重起机器就搞定。

在 OS X 10.3 及以后的版本里这些命令移动到 /etc/rc 里面詓了,必须在那里编辑 你需要重新启动才能让设置生效。请注意 /etc/rc 通常会被 OS X 更新覆盖 (比如 10.3.6 到 10.3.7)所以每次更新后你可能都需要重新编辑。

在这个平台上SHMALL 是用 4KB 页来度量的。 还要注意有些版本的 OS X 将拒绝把 SHMMAX 的数值数值为非 4096 的倍数

缺省配置时,只允许每段 512KB linux 共享内存存 要增大設置,首先进入 /etc/conf/cf.d 目 录 要显示当前的以字节记的 SHMMAX ,运行

这里 value 是你想设置的以字节记的新值 设置完了以后SHMMAX 重新制作内核

至少对于版本 5.1 而言,我们有必要为类似 SHMMAX 这样的参数做特殊的配置 因为这个参数可以配置为所有内容都当作linux 共享内存存使用。这就是类似 DB/2 这样的数据库常用嘚配置

信息,因为文件大小的缺省硬限制(fsize )以及文件数(nofiles )可能太低了

至少到版本 2.6 为止,linux 共享内存存段的缺省最大设置对 PostgreSQL 来说是太低了相关的设置可以在/etc/system 里面修改, 例如:

你要重起系统令修改生效

获取关于 Solaris 里面的linux 共享内存存的信息。

就会显示以字节记的当前的缺渻的最小和最大值 要给SHMMAX 设 置一个新值,运行:

这里 value 是你想设置的以字节记的新值 设置完SHMMAX 后,重建内核

linux 共享内存存. 缺省时是只支持 4 MB 的linux 共享内存存请记住linux 共享内存存是不能分页的;它是锁在 RAM 里面的。 要增加你的系统支持的共享缓冲区数目向你的内核配置文件里增加下面嘚行:

SHMALL 以 4KB 页为单位计算,所以 1024 页面代表 4 M linux 共享内存存 所以上面的东西把linux 共享内存存区域增加到 32 MB。 对于运行 4.3 或者更新版本的人你可能需要增大 KERNEL_VIRTUAL_MB , 超过缺省的 248 做完上面的修改之后,然后编译内核并重起

对于运行 4.0 或者更早的版本的, 请用 bpatch 找出当前内核的 sysptsize 值它是启动的时候動态计算的。

然后把 SYSPTSIZE 修改为在内核配置文件里的一个硬代码值。 用 bpatch 算出来的值并且为你需要的每个额外的 4 MB linux 共享内存存再加 1。

信号灯. 你鈳能还需要增加信号灯的数量;系统缺省的总数 60 只能允许大概 50 个 PostgreSQL 连接 在内核配置文件里设置你需要的值,比如:

如果用 sysctl 那么剩下的信號灯设置是只读的, 但是信号灯可以在启动的时候在 loader 提示符下设置:

类似的,这些东西可以在 /boot/loader.conf 中保存 以便重启之后依然有效。

你可能還想配置内核让把linux 共享内存存装载到 RAM 里,避免他们被交换到交换分区中 这些可以通过使用 sysctl 设置 kern.ipc.shm_use_phys 来实现。

编译内核时需要把选项 SYSVSHMSYSVSEM 打开 (缺省是打开的。)linux 共享内存存的最大尺寸是由选项SHMMAXPGS (以页计) 下面显示了一个如何设置这些参数的例子(OpenBSD 使用的是 option ):

缺省设置看來对普通安装是足够的了。 在 HP-UX 10SEMMNS 的出厂缺省是 128, 可能对大的数据库节点来说太小了

我要回帖

更多关于 linux 共享内存 的文章

 

随机推荐