我们致力于一个Apache知识的分享网站

Home » Apache基础知识 » apache 的AcceptMutex 的理解

apache 的AcceptMutex 的理解


2010-04-13 13:15:48  |   才被看了5,103次  |   要评论?
分类: Apache基础知识  |   发布:   |   来源:phpor

Tags:

当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, 0x81dd334, 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, 0x81dd33a, 1)             = 0

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

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

第三步:accept 17

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

Apache2中俩种设置PHP的异同 HTTP 状态代码解释

Leave a Reply