【Linux高性能服务器编程】——高性能服务器框架

1、服务器模型

1.1C/S模型
这种模型通俗一点来说就是所有客户端都通过访问服务器来获取所需的资源。这种模型的逻辑非常简单,如下图所示:
【Linux高性能服务器编程】——高性能服务器框架
服务器启动过后,首先创建一个或多个监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接。服务器稳定运行过后,客户端就可以通过调用connect函数向服务器发起连接。此时,针对客户端连接到达的异步事件,服务器就通过一种I//O模型来监听这一事件。当监听到连接请求过后,服务器就调用accept函数接收他,其主线程主要实现接收连接和创建子进程。子进程完成数据的通信功能。
这种模型适合于资源相对集中的场合,并且实现也很简单,但是缺点就是当访问量过大的时候,所有客户得到的响应就是很慢的,现代的技术当中我们多用分布式或者集群的方式对其进行处理。
1.2P2P模型
这种模型就是每台机器在消耗服务的同时也是给别人提供服务,这样资源能够充分、*的共享。下面图示的这两种模型中,第一种模型就有一个非常明显的缺点及时主机之间很难互相发现。所以实际使用的P2P模型就是图2所示的那样带有一个专门的发现服务器(关于发现服务器的理解,我们可以简单的将其理解为百度这样的搜索引擎,当我们要查找一个信息词条的时候,他的处理就去其他的服务器上去寻找相关词条的连接来供我们选择)。

2、服务器编程框架

我们的服务器编程的框架主要有三个部分构成,一个是I/O处理单元,一个是逻辑单元再者就是存储单元了。他们三者之间的关系如下图所示:
【Linux高性能服务器编程】——高性能服务器框架
I/O处理单元:服务器管理客户连接的模块。他主要是等待并接受鑫的客户连接,接受客户数据,将服务器响应数据返回给客户端。对于一个服务器机群来说,I/O处理单元是一个专门的接入服务器,它实现负载均衡,从所有逻辑服务器中选取负荷最小的一台来为新客户服务。
逻辑单元:通常是一个线程或进程。它分析处理客户数据,然后将结果传递给I/O处理单元或者直接发送给客户端。

3、两种高效的事件处理模式

同步I/O模型通常用于实现Reactor模式,异步I/O模型则用于实现proactor模式。
关于Reactor模式简单来说就是它要求主线程只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程。除此之外主线程不做任何其他实质性的工作。其中包括读写数据,接收新的连接以及处理客户请求均在工作线程中完成。具体的操作过程如下图所示:
【Linux高性能服务器编程】——高性能服务器框架
proactor模式将所有的I/O操作都交给主线程和内核来处理,工作线程仅仅负责业务逻辑,因此这种模式更符合我们之前描述的服务器框架。具体的工作流程如下图所示:
【Linux高性能服务器编程】——高性能服务器框架

4、两种高效的并发模式

服务器主要有两种并发编程模式:半同步/半异步模式和领导者/追随者模式。
半同步/半异步模式:首先,我们得了解一下在并发模式中,同步和异步的概念。“同步”是指程序完全按照代码序列的顺序执行,“异步”指的是程序的执行需要由系统事件来驱动。常见的系统事件包括中断、信号等。下图分别描述了同步读操作和异步读操作
【Linux高性能服务器编程】——高性能服务器框架
他们各自有相应的优点和缺点,异步线程虽然执行效率高,实时性强但是程序相对复杂,难于调试和扩展,而且不适合于大量的并发。但是同步线程虽然效率相对较低但是实时性较差。所以对于像服务器这种既要求较好的实时性又要求能同时处理多个客户请求的应用程序,我们一般采用半同步半异步的方式。
半同步半异步的模式中,同步线程用于处理客户逻辑,异步线程处理I/O事件。
领导者追随者模式:这个模式的核心就是多个工作线程轮流获得事件源集合,轮流监听、分发并处理事件的一种模式。在任意时间点,程序仅有一个领导者线程,它负责监听I/O事件。而其他线程则是追随者,他们休眠在线程池中等待成为领导者。当前领导者如果检测到I/O事件,首先要从线程池中推选出行的领导者线程,然后处理I/O事件。此时,行的领导者等待新的I/O事件,而原来的领导者则处理I/O事件,二者实现了并发。下面这张图显示了这三种撞他之间的转换关系。
【Linux高性能服务器编程】——高性能服务器框架