免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3120 | 回复: 18
打印 上一主题 下一主题

关于SystemV 共享存储的问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-15 13:42 |只看该作者 |倒序浏览
小弟初学编程,有一个关于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]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-05-15 14:08 |只看该作者

关于SystemV 共享存储的问题.

那么系统?

查看mtune 和stune的配置。

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

论坛徽章:
0
3 [报告]
发表于 2003-05-15 19:47 |只看该作者

关于SystemV 共享存储的问题.

原帖由 "蓝色键盘" 发表:
那么系统?

查看mtune 和stune的配置。

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


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

我就是奇怪这个测试进程怎么得到了比kern.ipc.shmseg还要大的值(从程式的输出结果来看是受到了shmmni的限制). 郁闷中....

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-05-15 19:59 |只看该作者

关于SystemV 共享存储的问题.

没有你的环境FreeBSD 4.8 STABLE ,看看哪位有环境将测试结果公布出来。

论坛徽章:
0
5 [报告]
发表于 2003-05-15 20:09 |只看该作者

关于SystemV 共享存储的问题.

使用ulimit看看限制值是多少

论坛徽章:
0
6 [报告]
发表于 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的限制。

论坛徽章:
0
7 [报告]
发表于 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

论坛徽章:
0
8 [报告]
发表于 2003-05-15 21:09 |只看该作者

关于SystemV 共享存储的问题.

感谢无双的热心.
这么巧,你也搞pgsql?
不过我想你还没明白我的问题

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

我的问题是我的一个进程分配到的数量超过了SHMSEG的值,我想知道这是为什么?

论坛徽章:
0
9 [报告]
发表于 2003-05-15 21:22 |只看该作者

关于SystemV 共享存储的问题.

上面就是答案

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

在许多系统中对POSIX标准的实现就是这样的
所以并不是说只要是符合POSIX的就一定会这样
很多系统对POSIX理解都有点偏差

论坛徽章:
0
10 [报告]
发表于 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上测试结果也是如此。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP