分享

【转】进程服务器模型

 techres 2012-06-30


图二:典型的多进程服务器模型
UML时序图

合理的多进程调度管理程序应该根据当前负载压力情况,决定该启动的进程数量。


图三:典型进程服务器模型执行图

多进程的服务器程序涉及到了如下程序的开发:

       1:多进程调度服务器

       2:进程服务器

调度服务器负责接收网络请求,并将请求转化为进程服务器需要的格式,后通过进程间通讯发送到进程服务器程序,后采用进程间通讯获取处理结果,使用网络IO发送给客户端。

进程调度器在不同的平台上面处理方法可能不太一致:

       1windows平台

              网络部分可以采用异步模式,如select或者IOCP。进程间通讯可以采用共享内存、SOCKET或者其他,视具体项目所要求的时间效率而定。

       2Linux平台

              网络部分也采用异步模式,如select/dev/pollepoll。进程间通讯可以采用shm或者SOCKET之类。

       3:其他平台

              网络部分异步,如freebsdkqueue。进程间通讯按照特定系统提供的最佳进程通讯而定。

调度服务器考虑采用单线程执行,讲网络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();

       }

}

从上面的伪代码中,我们可以大致了解到进程调度服务器所需要处理的工作。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多