I/O复用前世今生

简介: 之前总结了一篇文章《单服务器知识》[1],主要整理两方面的:一是socket以及IO常识二是单机高性能模式你会一般不会出现socket连接IO相关知识结合,所以在学习IO的时候,总会有很多的背景知识,出现现在会很吃力,或者说不知道就在里面。这是为什么呢?

之前总结了一篇文章《单服务器知识》[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],截取图片表示多路复用技术的对比:

image.png

在多路复用的时候,每次通信,没有一个通道上只能传输一个信号,浪费了

image.png

当采用技术后,通过设备多路复用器多路复用器(MUX),一个通道可以传输多个分离信号,从而使用多路复用器。在接受端,通过多路复用器(DEMUX),再把多个信号复用器离开分。

这一张图是 DEM 里面的一个多路复用技术,其中两个比较关键,负责多路分发多路复用,另一个负责多路分发。

理解了multiplexing,再看看I/O

简要回顾一下:

最初的BIO,PPC最进化到T,通过线程池PC,但有线程切换导致IO不再是主要的控制方式。

image.png

从这张图可以,突然的发生,之前的块连接的高块仍然存在,如何发挥作用?

怎么办呢?

一次又一次提供了另一种方法 - 阻塞阅读的方法和非阻塞阅读方法后,这很喜欢

1、不要每次都来问了,多一个包问吧。

2、不要总跑来问我了,有情况我你吧。对,这就是著名的好莱坞原则

众所周知,这两个办法,打造出本款完美体的投票。当然在这个完美体前还有选择、投票两个被淘汰的产品


反应堆模式

反应器设计模式是一种事件处理模式,用于处理由一个或多个输入同时传递的服务请求。然后,服务处理程序对传入的请求进行多路分解,并将它们同步分派给关联的请求处理程序。

更多详细的介绍可看Reactor 一种对象行为模式,用于对同步事件进行解复用和调度句柄[3]

看看reactor模式里面包含的组件:

image.png

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

image.png

头晕,他们都是一家人的。

总结

随便堆在一起,看是不是又不是名字不是不断剪,理还乱。

简单讲:

结合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/

目录
相关文章
|
5月前
|
存储 Cloud Native Linux
软件开发方法:复用与扩展
软件开发方法:复用与扩展
|
1月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
21 1
|
6月前
合成复用原则~
合成复用原则~
分集和复用
分集和复用
107 0
|
网络协议
|
Java Windows 调度
|
存储 编解码 容器
mux复用 demux解复用
保存音频包: 直接输出解复用之后的的音频数据码流。只需要在每次调用av_read_frame()之后将得到的音频的AVPacket存为本地文件即可。 但在分离AAC码流的时候,直接存储AVPacket后的文件可能是不能播放的。
1760 0