Linux I/O模型

I/O:指的是计算机的input和output

Linux 的 I/O

  • 磁盘I/O

  • 网络I/O : 一切皆文件,本质为对socket文件的读写

磁盘 I/O

image

  • 进程向内核发起系统调用,请求磁盘上的某个资源比如是html文件或者图片,

  • 然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,

  • 加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。

网络 I/O

  网络通信就是网络协议栈到用户空间进程的IO就是网络IO
image

  • 1.用户发送http请求报文到达web服务器网卡

  • 2.网卡将收到的请求报文复制到内核空间

  • 3.内核空间再把请求复制到用户空间的应用程序

  • 4.应用程序分析请求并把请求发送给内核

  • 5-6.内核将磁盘上的文件加载到内核空间,

  • 7.内核空间将数据复制到用户空间

  • 8.用户空间封装响应报文发送给内核空间

  • 9.内核空间再通过网卡将响应报文发送出去。

I/O 模型

I/O 模型相关概念:

同步和异步:

  关注的是消息的通知机制(调用者和被调用者之间的消息通知关系)

同步:sync
  被调用者不提供事件的处理结果。需要调用者主动讯问

  A安排B干一件事,B干完了A不问,B就不说

异步:async
  被调用者通过状态通知机制主动告诉被调用者自己的状态。

  A安排B干一件事,B干完了A不问,B也要主动说。

阻塞和非阻塞:

阻塞:blocking

  结果返回前,干不了别的的事。

  A找B干活,B没做完之前,A不能做别的事。

非阻塞:noblocking

  A找B干活,B没做完,A就去做别的事。

缓冲和缓存

image

Buffer:

  缓冲区,把大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数 --- 写数据到磁盘

  例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。

Cacahe:

  缓存,为了弥补高速设备和低速设备的鸿沟而引入的中间层,起到加快访问速度的作用。 --- 读数据到内存

  例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后CPU再次访问同一个资源,速度会快很多。

网络 I/O 模型

阻塞型、非阻塞型、复用型、信号驱动型、异步

阻塞型(同步阻塞):

image

image

  程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求

阻塞段:

  • 内核将数据从磁盘复制到内核空间

  • 内核空间再把数据复制到用户空间

缺点:

  一个客户端就会占用一个进程,这个进程完成请求之前会一直处于等待的状态。不能实现高并发。

非阻塞型 I/O 模型:

image

  用户发起IO请求后不等待,而是立即返回,但是会不断询问内核空间是否准备好数据,内核空间准备好数据后,将数据从内核空间复制到用户空间这个阶段会阻塞。

阻塞段:

  • 内核空间复制数据到用户空间

问题:
  即 “轮询”机制会大量消耗CPU资源,也不适合高并发

多路复用 I/O 型:

image

  通过一个代理程序,用户将这些请求交给代理程序,代理程序集中用户的请求后,统一交给系统内核处理,用户只需要等待代理程序返回结果就行。

三种代理程序:select,poll,epoll

阻塞段:

  • 等待代理程序返回请求信息(内核空间是否准备好数据)

  • 内核空间数据复制到用户空间

信号驱动式 I/O 模型:

image

  用户发请求后不等待内核准备好数据,而是去做其他的事,内核在数据准备好后,会发送信号通知进程。后面内核再把数据从内核空间拷贝到用户空间。

阻塞段:

  内核空间数据复制到用户空间(内存对拷速度比较快)

优点:

  让进程做更多的事情,可以提高并发性。

缺点:

  信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知

异步 I/O 模型:

image

  进程发起请求后,不等待内核空间准备好数据,内核空间准备好数据,把数据从内核空间拷贝到用户空间后,再通知进程。进程直接处理最终结果。

五种IO模型的区别:

image

posted on 2022-10-31 20:33  背对背依靠  阅读(46)  评论(0编辑  收藏  举报