看了
apache 的分析文章之后,觉得里面的图非常好地描述了 apache 的结构。也尝试用 visio 画一下
spprocpool 的结构。
对图中各个部分的说明:
1. MasterServer 通过 Fork 创建 ProcessManager ,ProcessPool 作为 ProcessManager 在 MasterServer 中的存根
2. 在 ProcessPool 和 ProcessManager 存在一个 ManagerPipe 管道
3. 当 MasterServer 需要更多的子进程的时候,MasterServer 通过 ProcessPool 对象向 ProcessManager 发起创建 ChildServer 的请求4. ProcessManager 是创建 ChildServer 的唯一一个地方
5. 在 MasterServer 和 ChildServer 之间存在一个 ChildPipe 管道
6. MasterServer 只负责监控子进程的状态(包括:忙、闲、异常退出),监控子进程的状态完全是通过 ChildPipe 来进行的;MasterServer 使用 select 可以同时监控所有的 ChildPipe 的可读状态;当一个 ChildPipe 可读的时候,MasterServer 读入内容,如果读入的最后一个字节为 BusyChar,设置 Child 的状态为 Busy;如果为 IdleChar ,设置 Child 的状态为 Idle;如果读入 0 字节,那么表示 Child 已经关闭 ChildPipe ,也就表明 Child 已经异常退出了。
7. ChildServer 被创建出来之后,就在 ListenFd 上 accept ,如果 accept 成功就通过 ChildPipe 发送一个 BusyChar,然后开始处理;处理结束之后,再通过 ChildPipe 发送一个 IdleChar;接着检查 PipeOfDeath 是否有内容,如果读到有内容,那么子进程自行退出;
关于几个主要文件句柄的传递说明:
1. ManagerPipe :MasterServer 创建,传递给 ProcessManager(通过 Fork)
2. ListenFd :MasterServer 创建,传递给 ProcessManager(通过 Fork),由 ProcessManager 传递给 ChildServer(通过Fork)
3. PipeOfDeath :MasterServer 创建,传递给 ProcessManager(通过 Fork),由 ProcessManager 传递给 ChildServer(通过 Fork),MasterServer 持可写的一端,各个 ChildServer 持可读的一端;PipeOfDeath 在 MasterServer 只有一个句柄;
4. ChildPipe :MasterServer 创建,传递给 ProcessManager(通过 Send_Fd),由 ProcessManager 传递给 ChildServer(通过 Fork),ChildPipe 在 MasterServer 有多个,每个 ChildServer 有一个 ChildPipe;