5种I/O模型的理解

参考与互联网文章:
https://cloud.tencent.com/developer/article/1586243—基础
https://tech.meituan.com/2016/11/04/nio.html-----进阶
https://blog.csdn.net/woaixiaopangniu521/article/details/70279143—部分内容有价值
https://www.jianshu.com/p/dde17c2d2e50—部分内容有价值
pool和epool的区别

站在服务端的视角,对于一次 Socket的数据读取操作流程,网络数据到达网卡,数据先被拷贝到内核缓冲区中,然后从内核缓冲区拷贝到进程用户空间。从函数调用来讲,稍微再细化一下,其实会经历两个阶段。

  • 第一阶段:等待数据准备。 例如:recv() 等待数据,需要等待网络上的数据分组到达,然后被复制到内核的缓冲区。
  • 第二阶段:将数据从内核缓冲区拷贝到用户空间。 例如:recv()
    接收连接发送的数据后,需要把数据复制到内核缓冲区,再从内核缓冲区复制到进程用户空间。

也正因为存在这两个阶段,Linux系统升级迭代中出现了五种网络 IO 模型。

阻塞 IO 模型 - Blocking IO

当应用进程调用了 recv() 这个系统调用,内核就开始了 IO 的第一个阶段:准备数据。这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程会被阻塞。
当内核一直等到数据准备好了,它就会将数据从内核中拷贝到用户内存,然后内核返回结果,用户进程才解除阻塞的状态。

非阻塞 I/O 模型 - Non-Blocking IO(并不是说的Java的NIO,Java的NIO不是利用这个IO模型实现的)

当用户进程发出recv()操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个错误码。
一旦内核中的数据准备好了,并且又再次收到了用户进程的系统调用,那么它马上就将数据拷贝到了用户内存,然后返回。

I/O多路复用 - IO multiplexing

(Linux 内核代码迭代过程中,多路复用的网络I/O模型依次支持了select(不停的轮询)、poll(不停的轮询)、Epoll(系统通知)三种。JavaNIO的实现是基于这个模型)

以 select 为例,当用户进程调用了 select,那么整个进程会被阻塞,而此时,内核会监视所有 select 负责的 socket,当任何一个 socket 中的数据准备好了,select 就会返回。这个时候用户进程再调用 recv 操作,将数据从内核拷贝到用户进程。
对应JavaNIO的实现就是,当调用socketchannel.read的时候其实是阻塞的。

信号驱动 I/O - Signal driven IO

应用进程使用 sigaction 系统调用,预先告知内核,向内核注册这样一个函数,内核立即返回,应用进程可以继续执行,也就是说等待数据阶段应用进程是非阻塞的。
内核在数据到达时向应用进程发送 SIGIO 信号,应用进程收到之后在信号处理程序中调用 recv() 将数据从内核复制到应用进程中。

异步 I/O 模型 - Asynchronous IO

应用进程执行 aio_read() 系统调用会立即返回,应用进程可以继续执行,不会被阻塞,内核会在所有操作完成之后向应用进程发送信号。
异步IO模型,要求等待数据和数据拷贝操作的两个处理阶段上都不能等待(blocking),内核自行去准备好数据并将数据从内核缓冲区中复制到应用进程的缓冲区,再通知应用进程读操作完成了,然后应用进程再去处理。

Linux并未很好的实现异步IO,异步IO的实现底层仍然是Epoll。Linux的网络IO处理的第二阶段总是阻塞等待数据copy完成的。不过就算没有实现第二阶段是内核来做这一次拷贝,还是用户线程来做差距并不大。

多路复用异步IO模型和事件分发器的两种模式有:

  • Proactor模型
  • Reactor模型

异步IO是我们常说的Proactor模型来实现,IO多路复用使用的是Reactor模型来实现。不过我们仍然可以再框架层进行自己封装,把Reactor模型模型封装为Proactor模型。

关于第二篇文章有疑惑:
A:多连接短连接的HttpClient不使用RPC框架的模型原因是因为:
Q:题目的前提是多连接短连接,不会长时间连接同一个url。RPC框架中经常是一直连接某台机器,不会改变。所以并不需要保持一个长连接,使用序列号区分数据,没有用处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值