高性能服务器开发项目框架

服务器模型为C/S模式。
CS模型逻辑。服务器启动后,首先创建一个或多个监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户连接。服务器稳定运行后,客户端就可以调用connet函数向服务器发起连接。
由若干客户连接是随机到达的异步事件,服务器需要使用某种IO模型来监听这一事件,当监听到连接请求后,服务器就调用accept函数接受它,并分配一个逻辑单元为新的连接服务。
可以创建一个新的进程或线程作为逻辑单元。逻辑单元读取客户请求,然后处理该请求,然后将处理结果返回给客户端,客户单接受到服务器反馈结果后,就额可以继续向服务器发送请求,也可以中断连接,主动关闭连接。如果客户端主动关闭连接,则服务器执行被动关闭连接。至此,双方通信结束。

P2P就是所有主机既可以是服务器又可以是客户机。网络中的所有主机地位相同。

整个服务器解构为三个模块。
分为IO处理单元和逻辑单元和网络存储单元。各单元之间才会用队列方式进行通信。
IO处理单元负责处理客户连接,读写网络数据。
逻辑单元时业务进程或线程。网络存储单元一般是本地数据库文件或缓存。
IO处理单元是服务器管理客户连接的模块,他通常要完成以下工作,等待并接受客户连接,接收客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在IO处理单元中执行,也可能在逻辑单元中执行。
逻辑单元通常是一个进程或一个线程,他分析并处理客户数据,将结果传递给IO处理单元或直接发送给客户端。
网络存储单元可以是数据库,缓存或文件,甚至是一台独立的服务器,但他不是必须的。

IO处理单元可能有不同的IO模型,通常分为阻塞型IO和非阻塞型IO。阻塞性IO,在发生IO事件时,如果事件尚未发生,会被系统挂起直到发生继续执行。
socket的很多函数connect和send,recv都是阻塞型。

针对阻塞IO执行的系统调用则总是立即返回,不管事件是否发生。如果事件没有发生,系统调用会返回-1,可以通过errno来区分。

很显然,在事件已发生的情况调用非阻塞IO会提高效率。

非阻塞IO通常和其他IO机制一起使用。

IO复用是常见的IO同志机制。应用程序通过IO复用函数想内核注册一组事件,内核通过IO复用函数把已经就绪的事件通知给应用程序。linux常用的IO复用有select,poll和epoll。
除了IO复用,也可以通过signo信号来报告IO事件。可以以一个文件描述符指定一个宿主进程,如果宿主进程将捕获到signo信号。但目标文件符上有事件发生是,signo信号处理函数就被触发,然后就可以在信号处理函数中对目标文件描述符执行非阻塞IO操作。

从理论上说,阻塞IO,IO复用还有信号驱动IO都是同步模型。这三种IO模型中,IO读写事件都是在IO事件发生后,由应用程序来完成。

而异步操作,则不同,对于异步IO来说,用户可以直接对IO执行读写操作。这些操作告诉内核用户读写缓冲区位置,以及IO操作完成后内核通知应用程序的方式。异步IO读写操作总是立即返回,不管IO是否阻塞。因为真正的读写操作已经由内核接管,也就是同步IO模型要求用户自行执行IO操作,而异步IO是由内核来执行。

异步IO通知的是IO完成事件,同步IO通知的IO就绪事件。

服务器通常处理三类事假,IO事件,信号及定时事件。Reactor和Proactor。

Reactor就是,也就是同步模型。主线程负责监听文件描述符,读写和处理客户请求都在工作线程中。

Proactor模型。则是异步IO。所有IO操作都交给主线程和内核来执行。工作线程只负责业务逻辑。

主线程负责监听文件描述符,并告诉内核用户IO缓冲区位置,以及完成时如何通知应用程序。
主线程通知完内核后,走了,继续干自己的事。
内核处理完IO,告诉应用程序。
工作线程处理完请求,注册写完成事件,交给内核执行写。
等内核处理完,内核告诉线程来负责善后。

同步IO模拟proactor。
则是主线程负责IO不是内核。因为这时主线程可能阻塞于IO。

高并发模式用于处理IO密集型。如果是计算密集型没有必要。
半同步半异步模式。

并发模式的中的同步和异步指的是是否按代码序列来执行。
同步是完全由代码序列执行,异步则是由系统时间来驱动程序的执行。
半同步半异步就是同步线程用于处理客户逻辑。异步用于处理IO事件。异步线程监听管道客户请求后将他封装成请求对象插入到请求队列中,请求队列将通知某个工作在同步模式下的工作线程来处理该请求,具体选择哪个工作线程作为新的客户请求取决于请求队列的设计。
半同步半异步反应堆是异步主线程负责监听的同时要负责连接,然后把连接好的对象插入到队列中,等工作线程自己去取。这里有两个缺点
1.主线程要负责连接,如果有多个请求,响应就会越来越慢。同时要把包装好的对象模型插入队列,需要上锁。

高效的半同步半异步,是主线程只管监听,而把连接借给工作线程。

领导者追随者模式,则是不分主线程和工作线程。线程队列头部的就是领导者,领导者负责监听,如果有连接到来,从追随者线程池中选出新的领导者,然后原来的领导者用于处理IO事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值