合理的多进程调度管理程序应该根据当前负载压力情况,决定该启动的进程数量。
多进程的服务器程序涉及到了如下程序的开发: 1:多进程调度服务器 2:进程服务器 调度服务器负责接收网络请求,并将请求转化为进程服务器需要的格式,后通过进程间通讯发送到进程服务器程序,后采用进程间通讯获取处理结果,使用网络IO发送给客户端。 进程调度器在不同的平台上面处理方法可能不太一致: 1:windows平台 网络部分可以采用异步模式,如select或者IOCP。进程间通讯可以采用共享内存、SOCKET或者其他,视具体项目所要求的时间效率而定。 2:Linux平台 网络部分也采用异步模式,如select、/dev/poll、epoll。进程间通讯可以采用shm或者SOCKET之类。 3:其他平台 网络部分异步,如freebsd的kqueue。进程间通讯按照特定系统提供的最佳进程通讯而定。 调度服务器考虑采用单线程执行,讲网络IO封装成为事件驱动机制,这样避免了线程间的互斥以及线程数据之间的锁定带来的负荷,可以大大的提高整个系统的效率和伸缩性。 进程服务器使用进程间通讯模式,等待调度服务器发送来的特定数据,进行处理该数据,将结果再由进程间通讯方法发送给进程调度服务器。 按照进程服务器和调度服务器的部署方式不同,系统模型也会有很大的区别。如果进程服务器和调度服务器部署在同一台服务器上面,可以采用的进程间通讯方法就比较多,而且也比较方便快速,但是并不是特别适合集群以及系统压力分解。优点是系统性能可以达到最佳状态。 进程服务器和调度服务器部署在多台服务器上面的话,通讯的方式Socket为最佳。这种方式适合集群系统以及压力分解,缺点是系统的性能可能会较差。 对调度服务器的伪代码模型如下: Class System{ //保存进程列表 List<Process *> pLists; //保存客户端列表 List<Client *> pClients; Socket sock; Void Initial(); Void Start(); Void Clean(); } 对象的主函数Start为系统关键函数: 伪代码如下: Void Start(){ //启动N个进程服务器 StartNProcess(); //主线程循环 While(flag){ //获取Socket发生事件 Event = GetClientEvent(); Switch(event){ //客户端连接事件 Case ClientCome: //更新客户端队列 UpdateClientList(); //收到客户端数据 Case GetClientData: //获取数据 GetData(); //分析处理数据 ProcessData(); //使用进程间通讯发送给某个进程 SendToAProcess(); //客户端离开 Case ClientGoes: //更新客户端队列 UpdateClientList(); //客户端错误 Case ClientError: UpdateClientList(); //默认 Default: DoSth(); } //获取进程事件 Event = GetProcessEvent(); Switch(event){ //进程处理完数据 Case ParseData: //发送给客户端 SendToClient(); //错误 Case Error: UpdateProcessList(); Default: DoSth(); } //进程队列处理 PerformProcessList(); //客户端队列处理 PerformClientList(); } }
从上面的伪代码中,我们可以大致了解到进程调度服务器所需要处理的工作。 |
|
来自: techres > 《socket编程》