冷文学习者

文章 分类 标签
22 7 36

公告

冷文博客(KEVINLU98.COM),记录我日常业余的一点一滴。
利用业余时间写与typecho与emlog的主题、插件等,同时也分享一些资源与技术帖
顺带帮大家免费代下载IT教程吧的资源 传送门

初步认识I/O

MR丶冷文 2021-04-28 47 0条评论 技术学习 学习IO模型

首页 / 正文

什么是I/O

对计算机来说,一切都是流,在信息交换过程中,计算机都是对这些流进行数据的收发操作,简称I/O操作(Input And Output),其包括往流中读出数据、系统调用read、写入数据、系统调用write。
我们创建一个Socket,通过系统调用会返回一个FD(文件描述,File Descriptor)标识,那么剩下的对Socket的操作就会转化为对这个FD的操作。

I/O交互流程

通常用户进程中的一次完整的I/O交互流程分为两个阶段,首先是经过内核空间,也就是由操作系统处理;紧接着就是到用户空间,也就是交由应用程序处理

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210426/390754a8265242a0953955eb7c2773f8.png

对于一个输入操作来说,进程I/O系统调用后,内核会先看缓冲区中有没有相应的缓存数据,如果没有再到设备中读取。因为设备I/O一般速度较慢,需要等待,内核缓冲区有数据则直接复制到进程空间

一个网络输入通常分为两个阶段

  • 等待数据到达网卡,然后将数据读取到内核缓冲区
  • 从内核缓冲区复制数据,然后拷贝到用户空间

5种I/O通信模型

在网络环境下,I/O分为两步:(1)等待;(2)数据搬迁

由此可见:如果想要提高I/O效率,需要将等待时间降低

因此发展出来5种I/O模型:

  • 阻塞I/O模型
  • 非阻塞I/O模型
  • 多路利用I/O模型
  • 信号驱动I/O模型
  • 异步I/O模型

阻塞I/O模型

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/8c1b05212922442fadcdc4025a7b698e.png

阻塞I/O模型在I/O执行的两个阶段(等待数据和拷贝数据)都被阻塞,典型应用有阻塞Socket,JavaBIO

优点:

  • 进程阻塞挂起不消耗CPU资源,及时响应每个操作
  • 实现难度低,开发应用较容易
  • 适合并发量小的网络应用开发

缺点:

  • 不适合并发量大的应用,因为一个请求I/O会阻塞进程
  • 需要为每个请求分配一个处理进程(线程)以及响应,系统开销大

非阻塞I/O模型

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/4ae517a56c2c433ebd5ae1f45f28351f.png

对比阻塞I/O模型,非阻塞I/O模型在用户进程执行时需要不断地主动询问内核数据准备好了没有

优点:

  • 实现难度低,开发应用相对阻塞I/O较难

缺点:

  • 进程轮询调用,消耗CPU资源
  • 适合并发量较小且不需要及时响应的网络应用开发

多路复用I/O模型

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/1482cbaeea284cb587a175bd65b79644.png

多路复用I/O将多个进程的I/O可以注册到一个复用器(Selector)上,当用户调用Selector,Selector会监听注册进来的所有I/O,如果Selector监听的所有I/O在内核缓冲区都没有可读数据,Selector调用进程会被阻塞,而当任一I/O在内核中有可读数据时,Selector调用就会返回,而后Selector进程可以自己或通知另外的进程再次发起读取I/O,读取内核中准备好的数据,多个进程注册I/O后,只有一个Selector调用会被阻塞。典型应用有Java NIO、Nginx

优点:

  • 专一进程解决多个进程I/O进程的阻塞问题,性能好
  • 适合高并发服务应用开发,一个进程/线程响应多个请求

缺点:

  • 实现和开发应用难度较大

信号驱动I/O模型

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/9110ea274988489b9cebe5aac040c210.png

信号驱动I/O是指进程预先告知内核,向内核注册一个信号处理函数,然后用户进程返回不阻塞,当内核数据就绪时会发送一个信号给进程,用户进程便在信号处理函数中调用I/O读取数据,但尽管如此,数据从I/O内核拷贝到用户进程的过程依然是阻塞的。

异步I/O模型

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/9f87da921450437b8cc236d43d45d6cb.png

用户进程发起aio_read操作后,给内核传递与read相同的描述符、缓冲区指针、缓冲区大小三个参数以及文件偏移,告诉内核当整个操作完成时如何通知用户进程。所以当内核收到一个aio_read之后,它会立刻返回,所以用户进程不会任何阻塞,内核会在数据准备完成后将数据拷贝到用户内存,当这一切进行完成之后会给用户进程发送一个信号,告诉它aio_read操作完成

异步I/O与信号驱动I/O的区别在于,信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,这个I/O操作由用户自定义的信号函数来实现,而异步I/O由内核告知我们I/O操作何时完成,是五种I/O模型中唯一的异步I/O模型。其典型的应用为 Java AIO、高性能服务器应用

优点:

  • 不阻塞,数据一步到位
  • 非常适合高性能、高并发应用

缺点:

  • 需要操作系统的底层支持,Linux2.5内核首现,linux2.6内核标准特性
  • 实现和开发应用难度大

几个概念

同步和异步

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/ca37986649484145bdbc5ec3243f24f0.png

阻塞和非阻塞

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210428/d7717acbf6bf4a92814867301efcb2da.png

组合

  • 同步阻塞:请求方主动发起请求且一直等待应答结果,期间不能做其它事件
  • 同步非阻塞:请求方主动发起请求,然后去做其它事件,但要不断轮询查看发起请求是否有应答结果
  • 异步阻塞:如果结果是由服务方主动通知的,请求发送之后,请求方一直等待通知
  • 异步非阻塞:如果结果是由服务方主动通知的,请求发送之后,请求方去干其它事情

一个例子帮助理解

比如我们去照相馆拍照,拍完照片之后,商家说需要30min左右才能洗出来照片

  • 这个时候,如果我们一直在店里面什么都不干,一直等待直到洗完照片,这个过程就叫同步阻塞
  • 当然,大部分人很少这么干,更多的是大家拿起手机开始看电视,看一会儿就会问老板洗完没,老板说没洗完,然后接着看,再过一会儿接着问,直到照片洗完,这个过程就叫同步非阻塞
  • 由于店里生意太好了,越来越多的人过来拍,店里面快没地方坐了,老板说你把手机号留下,我一会儿洗好了就打电话告诉你过来取,然后你去外面找了一个长凳开始躺着睡觉等待老板打电话,什么都不干,这个过程就叫异步阻塞(实际不应用)
  • 当然实际情况是,大家可能会先去逛街或者吃饭,或者做其他活动,这样一来,两不耽误,这个过程就叫异步非阻塞(效率最高)

评论(0)

当前没有评论,还不快来留下第一个脚印吧

热门文章

最新评论

  • 难说博客

    那就回复看看

  • 他听

    给大佬递杯卡布奇诺[捂嘴笑]

  • 我愿提笔画尽天下

    向大佬低头[太开心]

  • flvck

    @MR丶冷文 [[呲牙]]可能看错了,不是这个

  • MR丶冷文

    @flvck ?? 这个主题应该还没发布呢[委屈]

日历

2021年05月

      1
2345678
9101112131415
16171819202122
23242526272829
3031     

文章目录

推荐关键字: IO模型 缓冲区 buffer java nio

上一张 下一张