免费注册 查看新帖 |

Chinaunix

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

请教进程池开发的几点疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-23 09:22 |只看该作者 |倒序浏览
我想实现进程池:
(SOLARIS平台)
  即主进程在LISTEN到某端口上后启动N个子进程,由这N个初始的子进程共同针对一个listenfd进行ACCEPT,为了防止产生惊群的影响,使用了prhtead_mutex_来保证accept的原子性,主进程用共享内存来监视子进程的状态,当发现IDLE的子进程少于某个阀值时,就启动几个子进程,如果IDLE子进程大于某个阀值时,就杀掉几个子进程

我想问的是:
1。共享内存可以用mmap实现吗?如何实现?因为我的子进程是动态变化的,所以存储子进程信息的共享内存也应该变化,这又如何实现?
2。如果我的进程因为某种原因退出,那么共享内存如何去除?
3。
主进程用共享内存来监视子进程的状态,当发现IDLE的子进程少于某个阀值时,就启动几个子进程,如果IDLE子进程大于某个阀值时,就杀掉几个子进程

这个算法具体一点如何实现,即初始子进程数量、空闲子进程的最小阀值、最大阀值、总进程的数量关系如何,能否用伪代码表示这一算法。

论坛徽章:
0
2 [报告]
发表于 2003-05-23 09:29 |只看该作者

请教进程池开发的几点疑问

还有,主进程是否只管理上述的监视,这样应该能保证当连接进来,子进程不够用吧,不用理会外连接进来,已经没有子进程可用的这种情况了吧

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

请教进程池开发的几点疑问

1。共享内存可以用mmap实现吗?如何实现?因为我的子进程是动态变化的,所以存储子进程信息的共享内存也应该变化,这又如何实现?

回答:可以用mmap实现。共享内存维护的信息是动态变化的,如果多与一个子进程,那么这个关系到同步的问题。同步机制可以采用信号量或其它的锁机制。

2。如果我的进程因为某种原因退出,那么共享内存如何去除?

回答:
假设条件1----
让若父进程是管理进程,子进程推出后,只需要修改shm标志或者清除对应子进程信息都可以。如果是父进程异常退出。那么shm重的东西将更难维护。可能存在错误。
假设条件2----
如果父子进程通过shm交换数据(管理数据,状态信息监测等)。那么在父子进程之间需要相互协调(通俗的说是相互通知对方)。这时候进程异常退出。清理相关信息,并且根据当前的阀值等确定重启一个进程或是什么都不做。

不论在如上哪种条件下,一旦整个进程down掉,shm需要RM(shmctl)。

3、主进程用共享内存来监视子进程的状态,当发现IDLE的子进程少于某个阀值时,就启动几个子进程,如果IDLE子进程大于某个阀值时,就杀掉几个子进程

回答:

  1. 定义数据结构管理所有子进程(这个比较灵活,根据你的需要来做)。例如:
  2. type struct
  3. {
  4.      pid_t ppid;  /*进程pid*/
  5.      int      pidnum;/*总进程的数量*/
  6.      int      initnum;/*初始子进程数量*/
  7.      int      idlemun /*空闲子进程的个数*/
  8.      int      busymun /*非空闲子进程的个数*/
  9.           .....等等,你感兴趣的东西
  10. }

  11. 定义数据结构维护每个子进程(这个比较灵活,根据你的需要来做)。例如:
  12. type struct
  13. {
  14.      pid_t chldpid;  /*子进程pid*/
  15.      int      status;/*子进程状态*/
  16.      time_t  proctime;/*子进程处理时间*/
  17.      .....等等,你感兴趣的东西
  18. }
  19. /*算法:每个进程需要到shm中注册自己的状态(包括状态的变化),管理进程通过维护第一个结构并与阀值比较,同时获得子进程的状态服务信息,决定start new 还是kill children。(对于处于服务状态的不能Kill).同时第二个结构是由子进程共通维护的,可能需要同步机制。*/
  20. /*另外,如上只是简单描述,具体怎么实现,纯粹的取决于你的应用了*/
复制代码

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

请教进程池开发的几点疑问

1.mmap是文件映射到内存的一种方式,与共享内存没有关系。共享内存的api有shmget,shmdt,shmctl等。这个实现的方法很多,例如用链表,或者开个够大的索引数组,记录shm的位置。

2.最好由管理进程统一处理。如果管理进程退出,再进入,可以通过shmget获取以前分配的shm

3.你不是在研究apache的代码么?犯懒了?

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

请教进程池开发的几点疑问

1.mmap是文件映射到内存的一种方式,与共享内存没有关系。共享内存的api有shmget,shmdt,shmctl等。这个实现的方法很多,例如用链表,或者开个够大的索引数组,记录shm的位置。

mmap通过文件提供内存映射(描述字不能映射),同时,mmap也可以映射真正的共享内存区。如果mmap调用成功,那么对文件的操作通过mmap返回的地址完成,对调用者来说,这个等同于操作内存,所有的I/O对调用者来说是透明的。此时,如果在父子进程间实现类似于shm的功能是可行的。

忘gadfly兄指教!

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

请教进程池开发的几点疑问

对于楼主的,我建议用socketpair实现,将会更简单。

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

请教进程池开发的几点疑问

呵呵,键盘兄的说法我同意。

如果要说作为一种共享数据的方式,mmap是一种机制。

针对楼主的一些问题,我刚看到一篇不错的文章。

对apache进程池,连接请求的处理都有分析。请看
http://www.yesky.com/20011018/201380.shtml

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

请教进程池开发的几点疑问

算了,楼主自己不说话,就怎么两个说来说去。

论坛徽章:
0
9 [报告]
发表于 2003-05-23 18:44 |只看该作者

请教进程池开发的几点疑问

呵呵,谢谢两位大虾,我先做做看。。。。。

论坛徽章:
0
10 [报告]
发表于 2003-05-24 12:28 |只看该作者

请教进程池开发的几点疑问

对于第2个结构数据,用共享内存取当前maxServer*sizeof(该结构),记录每个子进程的状态,用2值信号灯实现加解锁,需要用到maxServer个信号灯。而且我在想,父进程究竟该如何写。看APACHE代码,好痛苦ing!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP