Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2594655
  • 博文数量: 2110
  • 博客积分: 18861
  • 博客等级: 上将
  • 技术积分: 24420
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-05 18:23
文章分类

全部博文(2110)

文章存档

2011年(139)

2010年(1971)

我的朋友

分类: LINUX

2010-04-29 11:03:27

 

当apache监听多个端口或多个ip上的端口时,多个子进程是怎么分工的呢?和只监听一个端口有什么区别吗?

1. 如果apache的多个进程只监听一个端口,则不需要AcceptMutex,每个apache进程都在执行accept操作,发现请求后就开始执行,执行完继续accept,多个进程之间不会相互干扰,这是由accept的机制来完成的。

2. 如果apache的多个进程只监听socket多于一个,则不能直接accept了,就必须使用select或poll机制来发现知否有请求需要执行,发现之后,再由accept来接受请求;然而select或poll没有accept那么能自动处理互斥的问题,这时候就需要一个“锁”了,就是所谓的AcceptMutex,AcceptMutex的实现形式有多种,这个不属于本文讨论的范围。

下面是apache在监听三个socket([16 17 18])时,其中一个进程的表现:

semop(524288, 0×81dd334, 1)             = 0

select(19, [16 17 18], NULL, NULL, NULL) = 1 (in [17])

accept(17, {sa_family=AF_INET, sin_port=htons(52932), sin_addr=inet_addr(”10.55.38.9″)}, [16]) = 29

semop(524288, 0×81dd33a, 1)             = 0

第一步:先获取锁(0×81dd334), 同一时刻只有一个进程能获取锁

第二步:开始select(对于apache2这里好像是poll,poll的效率更高一些),并且发现17需要处理了

第三步:accept 17

第四步:释放锁,这样其它进程就可以获取锁并处理后续的请求了

阅读(435) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~