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/

目录
相关文章
|
2月前
C 函数怎么实现复用
在 C 语言中,函数复用主要通过定义、调用、使用头文件、参数化及库的使用来实现。定义一个函数完成特定任务,并在需要的地方调用它,避免重复代码。将函数声明放在头文件中,供多个源文件包含,进一步提升复用性。参数化使函数能处理不同输入,增强灵活性。将常用函数编译成库,在多个项目中引用,提高代码可维护性和可读性。
|
4月前
|
JSON 测试技术 数据格式
软件复用问题之如果待复用的组件是需要新建的,应该如何解决
软件复用问题之如果待复用的组件是需要新建的,应该如何解决
|
4月前
软件复用问题之在复用组件降低成本和复用组件引入依赖之间取得平衡,如何解决
软件复用问题之在复用组件降低成本和复用组件引入依赖之间取得平衡,如何解决
|
6月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
93 1
分集和复用
分集和复用
127 0
|
网络协议
|
Java Windows 调度
|
存储 编解码 容器
mux复用 demux解复用
保存音频包: 直接输出解复用之后的的音频数据码流。只需要在每次调用av_read_frame()之后将得到的音频的AVPacket存为本地文件即可。 但在分离AAC码流的时候,直接存储AVPacket后的文件可能是不能播放的。
1797 0