Chinaunix

标题: 关于SystemV 共享存储的问题. [打印本页]

作者: beggar    时间: 2003-05-15 13:42
标题: 关于SystemV 共享存储的问题.
小弟初学编程,有一个关于system V Share memory的疑问,在此向大虾请教。

我想测试我最大能得到多少个shm的id.写了如下程式。


  1. #include <sys/types.h>;
  2. #include <unistd.h>;
  3. #include <sys/ipc.h>;
  4. #include <sys/shm.h>;
  5. #define MAXLIST 1000
  6. int shmlist[MAXLIST];
  7. int main(int argc,char **argv)
  8. {
  9.         int i,n;
  10.         for(i=0;i<MAXLIST;i++){
  11.                 if((shmlist[i]=shmget(IPC_PRIVATE,1,IPC_CREAT))<0)
  12.                         break;
  13.         }
  14.         printf("Your Limits is:%d \n",i);
  15.         for(n=0;n<i;n++){
  16.                 if(shmctl(shmlist[n],IPC_RMID,NULL)<0)
  17.                         errx(1,"error when remove shm id.\n");
  18.         }
  19.         exit(0);
  20. }
复制代码

编译运行如下


  1. $ sysctl kern.ipc.shmmni kern.ipc.shmseg //查看系统限制值
  2. kern.ipc.shmmni: 192
  3. kern.ipc.shmseg: 128
  4. $ ./a.out
  5. Your Limits is:189  //程序的输出值
  6. $
复制代码


为什么我得到的限制是192-4(另外3个为其它程式占用),而不是 128-4 ?[/code]
作者: 蓝色键盘    时间: 2003-05-15 14:08
标题: 关于SystemV 共享存储的问题.
那么系统?

查看mtune 和stune的配置。

能够创建的总的段数是由进程限制的,大小也有限制。
作者: beggar    时间: 2003-05-15 19:47
标题: 关于SystemV 共享存储的问题.
原帖由 "蓝色键盘" 发表:
那么系统?

查看mtune 和stune的配置。

能够创建的总的段数是由进程限制的,大小也有限制。


感谢楼上回答
FreeBSD 4.8 STABLE
kern.ipc.shmmni 值好象是系统范围内id总数.
kern.ipc.shmseg 值好象是进程可以获得的id总数

我就是奇怪这个测试进程怎么得到了比kern.ipc.shmseg还要大的值(从程式的输出结果来看是受到了shmmni的限制). 郁闷中....
作者: 蓝色键盘    时间: 2003-05-15 19:59
标题: 关于SystemV 共享存储的问题.
没有你的环境FreeBSD 4.8 STABLE ,看看哪位有环境将测试结果公布出来。
作者: 无双    时间: 2003-05-15 20:09
标题: 关于SystemV 共享存储的问题.
使用ulimit看看限制值是多少
作者: beggar    时间: 2003-05-15 20:23
标题: 关于SystemV 共享存储的问题.

  1. $ sysctl kern.ipc.shmmni kern.ipc.shmseg //查看系统限制值
  2. kern.ipc.shmmni: 192
  3. kern.ipc.shmseg: 128
复制代码


我的系统上ulimit不能显示ipc的限制。
作者: 无双    时间: 2003-05-15 20:27
标题: 关于SystemV 共享存储的问题.
SHMMAX 最大共享内存段尺寸(字节) 512 kB + 8192 * 缓冲区数 + 额外 ... 无穷大
SHMMIN 最小共享内存段尺寸(字节) 1 (最多大约是 256 kB)
SHMSEG 每进程最大共享内存段数量 只需要 1 个段,不过缺省比这高得多.
SHMMNI 系统范围最大共享内存段数量 类似 SHMSEG + 用于其他应用的空间
SEMMNI 信号灯标识符的最小数量(也就是说,套) >;= ceil(max_connections % 16)
SEMMNS 系统范围的最大信号灯数量 ceil(max_connections / 16) * 17 + 用于其他应用的空间
SEMMSL 每套信号灯最小信号灯数量 >;= 17
SEMMAP 信号灯映射里的记录数量 参阅文本
SEMVMX 信号灯的最大值 >;= 255 (缺省通常是32767,除非被要求,否则不要修改)


http://www.pgsqldb.org/pgsqldoc-7.1c/kernel-resources.html
作者: beggar    时间: 2003-05-15 21:09
标题: 关于SystemV 共享存储的问题.
感谢无双的热心.
这么巧,你也搞pgsql?
不过我想你还没明白我的问题

  1. SHMSEG 每进程最大共享内存段数量 只需要 1 个段,不过缺省比这高得多
复制代码

我的问题是我的一个进程分配到的数量超过了SHMSEG的值,我想知道这是为什么?
作者: 无双    时间: 2003-05-15 21:22
标题: 关于SystemV 共享存储的问题.
上面就是答案

有的系统的实现的话可能不会实现按进程限制
而而只是限制总数目

在许多系统中对POSIX标准的实现就是这样的
所以并不是说只要是符合POSIX的就一定会这样
很多系统对POSIX理解都有点偏差
作者: beggar    时间: 2003-05-18 02:55
标题: 关于SystemV 共享存储的问题.
对无双的热心表示感谢,但又对无双的不负责任的态度感到婉惜。

我从你前一次的回贴看不出什么答案.相信很多人也看不出什么答案。说老实话。我觉得这个坛子风气越来越差,很多人不懂装懂误导别人。copy paste的作法随处可见,真正解释问题,分析原因的内容少之又少?要不含糊其词,故作深沉.

这两天看了一下FreeBSD关于ipc的源代码,也查了一些资料。结果并不是你所说的posix理解偏差。“有的系统的实现的话可能不会实现按进程限制,而只是限制总数目”不知你说的是什么系统?

在FB源文件sysv_shm.c中找到关于shmseg和shmmni的变量:

  1. TUNABLE_INT("kern.ipc.shmmni", &shminfo.shmmni);
  2. TUNABLE_INT("kern.ipc.shmseg", &shminfo.shmseg);
复制代码


发现在shmget函数中没有出现检查shminof.shmseg的地方.只是在开头检查了一下
shmmin,shmmax,shmmni,没有对shmseg进行检查。代码如下

  1. if (uap->;size < shminfo.shmmin || uap->;size >; shminfo.shmmax)
  2.                 return EINVAL;
  3.         if (shm_nused >;= shminfo.shmmni) /* any shmids left? */
  4.                 return ENOSPC;
复制代码


但在shmat函数中却发现了检查shmseg的代码

  1. if (i >;= shminfo.shmseg)
  2.                 return EMFILE;
复制代码


编程测试

  1. #include <sys/types.h>;
  2. #include <unistd.h>;
  3. #include <sys/ipc.h>;
  4. #include <sys/shm.h>;
  5. #define MAXLIST 1000
  6. int shmlist[MAXLIST];
  7. char *shmpt[MAXLIST];
  8. int main(int argc,char **argv)
  9. {
  10.         int i,n;
  11.         for(i=0;i<MAXLIST;i++){
  12.                 if((shmlist[i]=shmget(IPC_PRIVATE,1,SHM_R|SHM_W))<0) break;
  13.                 if((shmpt[i]=shmat(shmlist[i],0,0))==(void*) -1) { //增加shmat
  14.                             warn("break at shmat\n");
  15.                             break;
  16.         }
  17.         printf("Your Limits is:%d\n",i);
  18.         for(n=0;n<=i;n++){
  19.                 shmdt(shmpt[n]);
  20.                 if(shmctl(shmlist[n],IPC_RMID,NULL)<0)
  21.                         errx(1,"error when remove share memory id.\n");
  22.         }
  23.         exit(0);
  24. }
复制代码


编译运行后的结果果然是kern.ipc.shmseg设定的值128
$ ./a.out
a.out: break at shmat: Too many open files
Your Limits is:128
$

查找了很多资料,发现很多关于shmseg和shmmni之间区别的翻译讲得含糊不清,而且都不规范。大多如你所paste的那样


  1. SHMSEG 每进程最大共享内存段数量 只需要 1 个段,不过缺省比这高得多.
  2. SHMMNI 系统范围最大共享内存段数量 类似 SHMSEG + 用于其他应用的空间
复制代码



其实shmseg真正限制的是进程可以用shmat连接的内存段的数量,而不是限制用shmget创建内存段的数量.在linux 及solaris上测试结果也是如此。
作者: 无双    时间: 2003-05-18 14:25
标题: 关于SystemV 共享存储的问题.
往往楼上找出

我的知识面并不是很广,什么都能懂,所以回答总会有错误的地方
另外我有我自己的事要做,所以也不可能对每一个问题进行深入研究,很多如果不懂的话直接找google然后把看来比较好的回答copy就是
所以很多回答只能说是我的想法,或说是我的认为
而不是正确的想法

同时也谢谢你把正确结果贴到这里来
让以后的人能够理解这个问题的真正原因
作者: 无双    时间: 2003-05-18 14:44
标题: 关于SystemV 共享存储的问题.
以后如果只是我的想法上加”我认为“
这样应该不会误导大家了
作者: flw    时间: 2003-05-18 15:11
标题: 关于SystemV 共享存储的问题.
少说为佳,言多必失。
版主的主要功能不在于回答问题,而是整理帖子,管理论坛。回答问题交给我这种人好了,我一向是“不懂的就不发言”,省的误人子弟。
作者: 无双    时间: 2003-05-18 15:29
标题: 关于SystemV 共享存储的问题.
如果这里问题都得不到解决的话
那么就没有什么整理的了

所以版主还是要能帮助别人解决问题
当然最重要的是管理好论坛
作者: flw    时间: 2003-05-18 15:37
标题: 关于SystemV 共享存储的问题.
原帖由 "无双" 发表:
如果这里问题都得不到解决的话
那么就没有什么整理的了

说得好!(鼓掌!热烈鼓掌!)
-------- 不过,如果问题不但没有解决,反而把一个错误的答案当成是正确的而“吸取”了,那岂不是很糟糕?
作者: 无双    时间: 2003-05-18 15:43
标题: 关于SystemV 共享存储的问题.
论坛只是讨论的

不是课堂老师上课
当然如果有高手讲那也很不错
大家都是在这里讨论中进步的
如果只是怕误导,
那么就没有办法交流自己思想
也不知道自己想的对不对

再说每个人精通的只是某几方面的知识
不可能全部精通,所以出错也是可能的
当然不是说我精通,我也是和大家一起学的
希望在这里和大家一起进步
作者: flw    时间: 2003-05-18 15:45
标题: 关于SystemV 共享存储的问题.
扯远了!扯远了!
作者: 无双    时间: 2003-05-18 16:32
标题: 关于SystemV 共享存储的问题.
是啊
但是觉得flw兄也是喜欢论坛的

一起努力吧

这里有时许多人都是新人,上来就要帮助,如果能及时帮助,能够多引导一下他们就会觉得这里很不错,然后会留下来,并能吸引更多的人来到这
想把它做成一个高手集中的论坛的路还是比较远
一步一步来吧
作者: 蓝色键盘    时间: 2003-05-19 09:36
标题: 关于SystemV 共享存储的问题.
对于楼主的这个问题,我当时在hp-11上做了测试,但是测试测结果无法回答楼主的问题(因为楼主的系统我没有接触过)。的确,在unix各个主流系统中,不管是shm这一块,很多地方实现的差异较大,我觉得楼主最后贴出了部分代码证明了对于shmat的限制(这个限制也是对于进程能够连接的共享内存段的限制),对于整个shm的大小应该(为了不误导人,还是用应该修饰)有限制的,这种限制或许不在那段代码中(例如可能在像核心申请shm的时候做了限制)。我觉得只要大家相互引导,相互探讨,问题还会逐步的明了的,如果大家都有兴趣,并且能够坚持的话,当然也要有时间。

在unix中的很多的东西,谁是真正的标准,谁是圣经!答案是没有。技术总在进步,每个厂商都是在遵循一定标准的前提下开发。如果我们能去对一些核心的东西做讨论,本身意味着论坛中的朋友在进步,既然是讨论,就不能保证所说的每一句话都必须天衣无缝,如果非要这样的话,我建议大家还是自己看书好了。毕竟一本好书能够出版是经过严格审批的!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2