服务器架构设计3------状态机的使用

对于网络服务器,当有多个并发用户连接服务器,那服务器是如何同时处理这些用户请求呢,大体上可以分成3种方式

  1. 多线程、多进程,分别开启多个进程或线程单独处理每一个ses连接,往往短连接会采用这种方式,并且可以通过线程池/进程池来优化;
  2. IO复用的事件循环,如何使用可以参见前一篇文章:http://blog.csdn.net/beginning1126/article/details/16941865
  3. SEDA模型
这里主要探讨一下IO复用的事件循环,前一篇文章《服务器架构设计2------线程的周期执行》,探讨了其实现方式,这种方式是为每个ses设定一个回调函数,当然,如果针对每个ses的处理很简单,回调函数中没有堵塞情况的发生,这种处理是ok的,但是一旦需要在回调函数中需要等待某种时间,需要发生堵塞,比如:读取网络数据(非阻塞的)、读取磁盘数据(非阻塞的)、操作数据库等,这样系统的性能会大打折扣。怎么来处理这种情况呢,状态机是很好选择。

状态机如下图所示:
服务器架构设计3------状态机的使用_第1张图片

状态、事件、处理函数、新的状态、新的事件、新的处理函数,这些都是状态机需要关注的点。
举个简单例子来说明状态机的使用:例如等待网络数据
服务器架构设计3------状态机的使用_第2张图片
如图所示,recv函数设定为非堵塞的,线程可以周期性的探测是否有数据到来,如果来了,则为ses产生Data arrived事件,状态机进入process data函数处理数据函数,同时将状态再次设定为wait data,如果recv返回值为-1,探测出网络数据结束,则产生Data finish事件,则进入finish data函数处理数据,同时将状态置为data finish状态。

上面仅仅举了一个简单例子来说明状态机的使用,在实际使用中,状态图会比这复杂得多,可能还会有子状态的产生,但是万变不离其宗,关键点都是防止堵塞在某一个ses的处理上,而耽误下一个ses的处理,影响性能。






你可能感兴趣的:(linux,服务器,架构设计,状态机)