进程池的工作模式是先fork一定数量的子进程,当进程池中的空闲子进程数超过最大空闲子进程数时,就不fork子进程,因为这时的子进程数已经足够处理客户端的请求服务,只有当空闲子进程小于最大空闲子进程时,且进程池中子进程数小于最大子进程数时,才fork子进程。
主要的数据结构描述
进程池结构体,类似C++中的抽象类
typedef struct tagPOOLSVRSTRU
{
STR szListenIpAddr[MAX_STR_LEN]; /* 监听服务的IP地址 */
INT nListenPort[MAX_LISTEN_PORT]; /* 监听服务端口数组 */
POOLSTARTFUNC funcPoolStart; /* 子进程构造函数 */
PVOID pPoolStartArg; /* 子进程构造函数参数 */
POOLWORKFUNC funcPoolWork; /* 子进程工作函数 */
PVOID pPoolWorkArg; /* 子进程工作函数参数 */
POOLENDFUNC funcPoolEnd; /* 子进程析构函数 */
PVOID pPoolEndArg; /* 子进程析构函数参数 */
POOLFINFUNC funcPoolFinish; /* 管理进程结束函数 */
PVOID pPoolFinishArg; /* 管理进程结束函数参数 */
INT *pConnectFd[6]; /* 连接服务端口数组 */
POOLWORKFUNC11 funcPoolWork11; /* 管理进程工作函数 */
PVOID pPoolWorkArg11; /* 管理进程工作函数参数 */
}POOLSVRSTRU;
进程池状态描述
typedef struct tagCPQSTRU
{
INT nTotalProNum; /* 进程池进程总数 */
INT nWaitStatProNum; /* 进程池等待进程数 */
CPISTRU struCpi[MAX_CHILD_NUM];
}CPQSTRU;
进程本身描述
typedef struct tagCPISTRU
{
INT nSelfProcessId; /* 自身进程号 */
INT nChildProcessId; /* 子进程号 */
CPSENUM enumCps;
}CPISTRU;
进程状态:
typedef enum tagCPSENUM
{
WAIT=1, /* 等待状态 */
WORK=2 /* 工作状态 */
}CPSENUM;
进程池函数指针类型定义
typedef INT (*POOLSTARTFUNC)(PVOID pArgument);
typedef INT (*POOLWORKFUNC)(INT nSockDescriptor,PVOID pArgument);
typedef INT (*POOLENDFUNC)(PVOID pArgument);
typedef INT (*POOLFINFUNC)(PVOID pArgument);
typedef INT (*POOLWORKFUNC11)(INT pSockDescriptor,PVOID pArgument);
定义的常量
#define MAX_LISTEN_PORT 100 /* 系统最多监听端口数 */
#define MIN_CHILD_NUM 6 /* 最小进程数目 */
#define MAX_CHILD_NUM 256 /* 最大进程数目 */
#define MIN_CHILD_IDLE 3 /* 最小空闲进程数目 */
#define MAX_CHILD_IDLE 6 /* 最大空闲进程数目 */
#define INTVAL_SCAN_TIME 5 /* 管理进程扫描间隔时间 */
#define INTVAL_SCAN_TIME11 100 /* 管理进程扫描间隔时间 */