专栏首页架构说整天背诵五种I/O模型/epoll区别,换个马甲确不认识了!

整天背诵五种I/O模型/epoll区别,换个马甲确不认识了!

方法

一、这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题

二、这个技术的优势和劣势分别是什么

三、这个技术适用的场景。任何技术都有其适用的场景,离开了这个场景

四、技术的组成部分和关键点。

五、技术的底层原理和关键实现

六、已有的实现和它之间的对比

故事

  • 过去1年,看了种IO模型,一年后忘记了
  • 过去1年,看了种epoll区别,一年后忘记了
  • 然后重复重复。没有提升。
  • 翻来覆去就这东西 没错必败(不知道哪里有问题)
  • 翻来覆去就这东西 没错必败(很奇怪)

Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。

程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。厉害呀

问题1:什么是AI0

  • 一片空白 我 同步,异步 阻赛和非阻赛 5个模型,没听说过呢!
  • 我的回答:reactor模型。

问题2:什么是kqueue与epoll区别

我的思考,没有什么区别,就是别的系统上

我的回答:监控大量连接。各种不同事件类型

‘’

什么是AI0

5个

细节是魔鬼:

  1. 第一幅是5个类型,到了第二幅,第三图变成4个,遗漏信号io。
  2. 到了第二幅,第三图 对epoll的同步和异步定义模糊。

异步定义:An asynchronous IO operation does not cause the requesting process to be blocked.

aio 纯异步,io多路复用也是异步。wait for data 和copy data from kernel to user

同步定义:A synchronous IO operation causes the requesting process to be blocked until that IO operation completes.

类型定义

1 BIO(Blocking IO) BIO是同步阻塞模型,一个客户端连接对应一个处理线程。在BIO中,accept和read方法都是阻塞操作,如果没有连接请求,accept方法阻塞;如果无数据可读取,read方法阻塞。

2 NIO(Non Blocking IO) NIO是同步非阻塞模型,服务端的一个线程可以处理多个请求,客户端发送的连接请求注册在多路复用器Selector上,服务端线程通过轮询多路复用器查看是否有IO请求,有则进行处理。

  • 相对于之前的 IO 模型来说 IO Multiplexing 实际做的事情没变化甚至更低效,因为需要两次 System Call 才完成一个读操作。但它的好处就是在可能耗时最长最不可控的等待数据到达的时间上, 可以一口气等待多个 Socket,不用轮询消耗 CPU

3 AIO(NIO 2.0) AIO是异步非阻塞模型,一般用于连接数较多且连接时间较长的应用,在读写事件完成后由回调服务去通知程序启动线程进行处理。

  • Asynchronous I/O

AIO 看上去和 Signal Driven IO 很相似,但区别在于 Signal Driver IO 是在数据可读后就通过 SIGIO 信号通知应用程序数据可读了,之后由应用程序来实际读取数据,拷贝数据到 User Space。而 AIO 是注册一个读任务后,直到读任务真的完全完成后才会通知应用层。

应用上区别

第二关 区别:

可以看出 Proactor 和 Reactor 的区别:

1)Reactor 是在事件发生时就通知事先注册的事件(读写在应用程序线程中处理完成);

2)Proactor 是在事件发生时基于异步 I/O 完成读写操作(由内核完成),待 I/O 操作完成后才回调应用程序的处理器来进行业务处理。

Reactor 可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」, 而 Proactor 可以理解为「来了事件操作系统来处理,处理完再通知应用进程」

  1. Proactor 正是采用了异步 I/O 技术,所以被称为异步网络模型。

现在我们再来理解 Reactor 和 Proactor 的区别,就比较清晰了。

Reactor 是非阻塞同步网络模式,感知的是就绪可读写事件。在每次感知到有事件发生(比如可读就绪事件)后,就需要应用进程主动调用 read 方法来完成数据的读取,

也就是要应用进程主动将 socket 接收缓存中的数据读到应用进程内存中, 这个过程是同步的,读取完数据后应用进程才能处理数据。

Proactor 是异步网络模式, 感知的是已完成的读写事件。

在发起异步读写请求时,需要传入数据缓冲区的地址(用来存放结果数据)等信息,这样系统内核才可以自动帮我们把数据的读写工作完成, 这里的读写工作全程由操作系统来做,

并不需要像 Reactor 那样还需要应用进程主动发起 read/write 来读写数据, 操作系统完成读写工作后,就会通知应用进程直接处理数据。

第一关:基本概念

  • 单 Reactor 单进程

单 Reactor 单进程的方案不适用计算机密集型的场景,只适用于业务处理非常快速的场景

而且只在主线程中运行,在面对瞬间高并发的场景时,容易成为性能的瓶颈的地方。

  • 单 Reactor 多线程

单 Reator 多线程的方案优势在于能够充分利用多核 CPU 的能,那既然引入多线程,那么自然就带来了多线程竞争资源的问题。

  • 多 Reactor 多进程 / 线程

Acceptor 对象中的 accept 获取连接,将新的连接分配给某个子线程;

  • aio

无论是 Reactor,还是 Proactor,都是一种基于「事件分发」的网络编程模式,区别在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式则是基于「已完成」的 I/O 事件。

接下来,一起看看 Proactor 模式的示意图:

可惜的是,在 Linux 下的异步 I/O 是不完善的

Proactor is a software design pattern for event handling in which long running activities are running in an asynchronous part

细节是蘑菇:

  • 在 Linux 下的异步 I/O 是不完善的,其他系统呢?这里是重要切入点 ?
  • 在 Linux 下的异步 I/O 是不完善的,其他系统呢?这里是重要切入点 ?

什么是kqueue

定义:

kqueue 是一种可扩展的事件通知接口。

Kqueue is a scalable event notification interface introduced in FreeBSD 4.1 on July 2000

2000 年 7 月发布的 FreeBSD 4.1 中首次引入了 kqueue[1],

随后也被 NetBSD、OpenBSD、macOS 等操作系统支持。

Kqueue makes it possible for software like nginx to solve the c10k problem

  • epoll 在文件描述符可进行 I/O 操作时进行通知,
  • 而 kqueue 和 IOCP 都在请求的操作完成时进行通知。

塔山
  • https://github.com/littledan/linux-aio 【正在看】
  • java aio 编程 【没看懂】 ❌ https://colobu.com/2014/11/13/java-aio-introduction/ http://hg.openjdk.java.net/nio/nio/jdk/file/a11b4063024f/src/share/classes/sun/nio/ch

Java NIO2增加了对第五种模型的支持,也就是AIO。http://hg.openjdk.java.net/nio/nio/jdk/file/a11b4063024f/src/share/classes/sun/nio/ch

  • Why is AIO better than select and multi-threaded IO processing? [closed]

https://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html https://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/overview/core/basics.html 【完成】

https://colobu.com/2014/11/13/java-aio-introduction/ 【】

  • Async IO on Linux: select, poll, and epol 阅读30分钟 ✅
  1. https://jvns.ca/blog/2017/06/03/async-io-on-linux--select--poll--and-epoll/
  2. Chapter 63: Alternative I/O models
  3. 从源码剖析Go语言基于信号抢占式调度 【没看懂】
  • How do you use AIO and epoll together in a single event loop? 动手 10分钟 ❌ https://stackoverflow.com/questions/1825621/how-do-you-use-aio-and-epoll-together-in-a-single-event-loop
  • Linux高性能IO网络模型对比分析:Reactor vs Proactor
  • 理解 Java 三种IO模型 BIO/ NIO/ AIO,面试必考问题!
  • FreeBSD Kqueue的实现原理 https://www.freebsd.org/cgi/man.cgi?query=kqueue&apropos=0&sektion=0&format=html
  • 原来 8 张图,就能学 Reactor 和 Proactor 阅读5分钟 ✅
  • Java】Java AIO使用
  • Async IO on Linux: select, poll, and epol https://jvns.ca/blog/2017/06/03/async-io-on-linux--select--poll--and-epoll/
  • How do you use AIO and epoll together in a single event loop?
  • libevent – an event notification library

libevent supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4).

  • AIO support 阅读5分钟 完成 ✅

https://libevent-users.monkey.narkive.com/MXzHLDTN/aio-support https://sourceforge.net/p/levent/patches/13/

On FreeBSD notification via kqueue is supported, on other platforms default implementation with signal notification supposed to be used. https://oxnz.github.io/2016/10/13/linux-aio/

  • 深入学习理解 IO 多路复用 阅读5分钟 ✅ blocking I/O

nonblocking I/O

I/O multiplexing (select and poll)

signal driven I/O (SIGIO)

asynchronous I/O (the POSIX aio_functions)

https://www.dre.vanderbilt.edu/~schmidt/PDF/proactor.pdf

https://en.wikipedia.org/wiki/Proactor_pattern

【翻译】两种高性能I/O设计模式(Reactor/Proactor)的比较

https://blog.csdn.net/liu251/article/details/8351197

Comparing Two High-Performance I/O Design Patterns

Read-Completed /Ready-to-Read

Standard/classic Reactor:

  • Step 1) wait for event (Reactor job)
  • Step 2) dispatch "Ready-to-Read" event to user handler ( Reactor job)
  • Step 3) read data (user handler job)
  • Step 4) process data ( user handler job)

Proposed emulated Proactor:

  • Step 1) wait for event (Proactor job)
  • Step 2) read data (now Proactor job)
  • Step 3) dispatch "Read-Completed" event to user handler (Proactor job)
  • Step 4) process data (user handler job)

The Proactor Design Pattern: Concurrency Without Threads

优缺点:

— Decoupling threading from concurrency.

ー线程与并发性的分离。

Long-duration operations are performed asynchronously by the implementation on behalf of the application. Consequently applications do not need to spawn many threads in order to increase concurrency. 长时间的操作由代表应用程序的实现异步执行。因此,应用程序不需要产生许多线程来提高并发性。

— Performance and scalability.

high-performance concurrent applications

https://www.cnblogs.com/l

uminocean/p/5631336.html

本文分享自微信公众号 - 架构说(JiaGouS),作者:王传义

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP网络编程之epoll开启篇

    这个公众号自从去年6月份到现在已经半年了,将近80篇的原创大概换来了550元的广告费。这不是我一个人的钱(主要是大家浏览量带来的支持),再加上我们最近遇到的事情...

    老李秀
  • 最全Java成神学习路线总结!!!

    1)每本书每个人的思路不一样,哪怕有不好的地方,一定要坚持按照一种思路去学习,不要半路换,不然很容易失去乐趣或者放弃。

    用户5224393
  • Oracle 中国研发中心裁员已成定局,云时代下一个是谁?

    2019年5月7日,甲骨文(Oracle)召开了中国区电话会议,亚太区人力资源负责人明确了裁员的计划,而且这是全球性。至此,过去几个月一直在传闻的大裁员正式开始...

    数据和云
  • 4寒假专辑:二、数据输入、输出

    1、使用printf和scanf函数时,要在最前面加上#include“stdio.h”

    用户6755376
  • 逆风而行!从考研失败到收获到自己满意的Offer,分享一下自己的经历!

    大家好,我是Guide哥,这篇文章是一位读者的投稿。这篇文章分享了他从确定Java后端方向 -> 考研 -> 考研失败->准备春招 -> 收货自己满意的offe...

    Guide哥
  • TCP的流量窗口……看完笑出鹅叫声

    计算机编程的很多知识点,往往在日常生活中就有类似的例子。最近整理了十个非常形象生动的生活例子,助大家理解这些计算机面试必备的知识点。

    用户1737318
  • 十个形象比喻,助你理解计算机面试必备的知识点

    大家好,我是捡田螺的小男孩。计算机编程的很多知识点,往往在日常生活中就有类似的例子。最近整理了十个非常形象生动的生活例子,助大家理解这些计算机面试必备的知识点。

    Bug开发工程师
  • 聊聊IO

    应用程序向操作系统发出IO请求:应用程序发出IO请求给操作系统内核,操作系统内核需要等待数据就绪,这里的数据可能来自别的应用程序或者网络。一般来说,一个IO分为...

    你呀不牛
  • 贷还是不贷:如何用Python和机器学习帮你决策?

    本文我们用贷款风险判断的实际案例,帮助你一步步学习如何用Python做决策树。依靠机器学习中的分类(classification)方法,你可以快速高效地完成繁重...

    王树义
  • Linux中epoll IO多路复用机制

    epoll简介 epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和...

    小小科
  • Linux下的I/O复用与epoll详解

    I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实...

    用户7678152
  • 微信支付安全手册

    这两天后台有粉丝说被这些帖子吓哭。面对如此夸张的标题,小编一定要立马查明真相。 原来是重庆的范先生手机中毒导致微信被盗刷了,得知消息后,微信团队已第一时间联系了...

    腾讯大讲堂
  • 用C写一个web服务器(二) I/O多路复用之epoll

    前言 继续更新“用 C 写一个 web 服务器”项目(上期链接:用C写一个web服务器(一) 基础功能),本次更新选择了 I/O 模型的优化,因为它是服务器的基...

    枕边书
  • 2014 360校园招聘技术类笔试题

    原文:http://blog.csdn.net/lanxuezaipiao/article/details/41892553

    bear_fish
  • select,poll,epoll的区别

    在多路复用的IO的模型中,存在三种机制,分别是select,poll和epoll.为了便于理解,可以使用简单的伪代码来表示一个原始的IO的读写:

    付威
  • 从小作坊到大生产,AI数据标注转捩点

    2018年初,「甲子光年」曾发布《“数据折叠”:今天,那些人工智能背后“标数据的人”正在回家》。劳动密集型是人们对数据标注行业的固有印象,基层数据标注员被视为数...

    用户2908108
  • 甲基化的一些基础知识

    同样的策略,我们也可以应用到其它领域的知识背景快速学习,比如我们的lncRNA系列,miRNA系列,现在我们一起学习一下DNA甲基化吧。

    生信技能树
  • 【译文】epoll() 3步搞定

    并不久远之前,设置单个Web服务器以支持10,000个并发连接还是一项伟大的壮举。有许多因素使开发这样的Web服务器成为可能,例如nginx,它比以前的服务器可...

    袁承兴
  • 深入理解 Linux 的 epoll 机制

    在 Linux 系统之中有一个核心武器:epoll 池,在高并发的,高吞吐的 IO 系统中常常见到 epoll 的身影。

    KevinYan

扫码关注云+社区

领取腾讯云代金券