之前总结了一篇文章《单服务器知识》[1],主要整理两方面的:
一是socket以及IO常识
二是单机高性能模式
你会一般不会出现socket连接IO相关知识结合,所以在学习IO的时候,总会有很多的背景知识,出现现在会很吃力,或者说不知道就在里面。
这是为什么呢?
都是从角度看,因为是发生关联的时候,数据源与网络是网络,而数据与套接字就是网络,而套接字是从操作系统的角度来看的;都是从某个角度看,linux 接口是应用程序的一切文件种。
与 linux操作,所有的 linux 皆是文件,IO 对象文件写;IO 相关的一切 IO 操作得涉及内核,最优化都需要操作系统的支持。
所以你会发现提升这些,提升I/O多路复用、零拷贝性能的技术时,都需要OS表示出手,否则有很大的提升。
其中I/O多路复用和Reactor经常被搞混,甚至被认为是同一种东西。
我再总结一下I/O Multiplexing的前世生以及与reactor的关联:
I/O 多路复用
多路复用概念多用于通信领域,详细可看多路复用定义——多路复用类型:FDM、WDM、TDM [2],截取图片表示多路复用技术的对比:
在多路复用的时候,每次通信,没有一个通道上只能传输一个信号,浪费了
当采用技术后,通过设备多路复用器多路复用器(MUX),一个通道可以传输多个分离信号,从而使用多路复用器。在接受端,通过多路复用器(DEMUX),再把多个信号复用器离开分。
这一张图是 DEM 里面的一个多路复用技术,其中两个比较关键,负责多路分发多路复用,另一个负责多路分发。
理解了multiplexing,再看看I/O
简要回顾一下:
最初的BIO,PPC最进化到T,通过线程池PC,但有线程切换导致IO不再是主要的控制方式。
从这张图可以,突然的发生,之前的块连接的高块仍然存在,如何发挥作用?
怎么办呢?
一次又一次提供了另一种方法 - 阻塞阅读的方法和非阻塞阅读方法后,这很喜欢
1、不要每次都来问了,多一个包问吧。
2、不要总跑来问我了,有情况我你吧。对,这就是著名的好莱坞原则
众所周知,这两个办法,打造出本款完美体的投票。当然在这个完美体前还有选择、投票两个被淘汰的产品。
反应堆模式
反应器设计模式是一种事件处理模式,用于处理由一个或多个输入同时传递的服务请求。然后,服务处理程序对传入的请求进行多路分解,并将它们同步分派给关联的请求处理程序。
更多详细的介绍可看Reactor 一种对象行为模式,用于对同步事件进行解复用和调度句柄[3]
看看reactor模式里面包含的组件:
1.事件:IO 事件,如写、读、超时和信号。
2.事件源(ES):linux中的文件描述符(fd)和Windows中的Socket或Handle。程序在给定事件上添加它关心的事件。
3. event_demultiplexer (ED):操作系统提供的select()和epoll()。该程序首先将事件源(fd)和相关事件添加到ED。当事件发生时,ED eill 通知一个或多个 EV 上的事件已准备就绪,程序可以以非阻塞方式处理事件。在 Libevent 中使用了与 select()、poll() 和 epoll() 相同的 ED 方式,它们由 eventtop struct 封装。
4. event_handler_interface 和 event_handler_imp (EH):EH 有一系列的接口,每个接口引用一个不同的事件。当某些特定的事件 fets 准备好时,Reactor 将调用特定的接口。EH 通常绑定一个有效的 ES。在 libevent 中,它是事件结构。
5. reactor:事件管理。它在内部使用 ED 来添加和删除事件。当事件准备好时,调用事件的回调函数。它实际上是 libevent 中的 event_base 结构。
可以看到reactor模式中,分解reactor组件。而在一个组件event_demultiplexer是由多路复用技术支持的。
所以在转换Reactor的时候,还是Reactor模式的reactor部件?没有必要咬文嚼字,它们是一类。
还有如此,还有一股编程潮思:响应式宣言[4]里面也有reactor
头晕,他们都是一家人的。
总结
随便堆在一起,看是不是又不是名字不是不断剪,理还乱。
简单讲:
结合I/O与复用,由此得来I/O复用。
Reactor中包含了reactor组件及依赖了多路复用技术。而多路复用技术的epoll又提供了reactor的思想。
道生一,一生二。阴阳之道,存乎万物之间。
参考
[1]
《单服务器高性能》: https
[2]
://www.zhuxingsheng.com/blog/socket-and-io-high-performance.html 复用-定义-复用类型:FDM、WDM、TDM: https://www. physics-and-radio-electronics.com/blog/multiplexing/
[3]
Reactor 一种对象行为模式,用于同步事件的多路分解和调度句柄: http
[4]
://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf 响应式宣言: https ://www.reactivemanifesto.org/