五种IO模型

27 篇文章 0 订阅
五种IO模型

在进程使用磁盘的数据的时候,需要用到几个空间
磁盘
内核缓冲区kernel buffer
用户缓冲区app buffer

其中内核缓冲区和用户缓冲区都属于内存的范畴,首先内核需要将数据从磁盘拷贝到内核缓冲区,然后再从内核缓冲区拷贝到用户缓冲区,接下来才能够被用户进程使用

这里首先定义几个角色和空间,两个角色kernel,httpd,五个存储空间磁盘,内核缓冲区,用户缓冲区,socket缓冲区(send缓冲区,recv缓冲区),NIC

数据在磁盘等外部硬件设备和内存之间的数据拷贝的时候不需要cpu的参与,此时使用 的DMA的数据拷贝的方式,比如磁盘到内核缓冲区之间的数据拷贝的时候,还有就是将socket缓冲求到NIC(网卡)之间的数据拷贝的时候是不需要CPU参与的

如果数据在内存等缓冲区之间拷贝数据的时候是需要cpu参与的,比如从内核缓冲区到用户缓冲区,从用户缓冲区到socket缓冲区的时候

  1. 阻塞式IO — 阻塞的是httpd
    钓鱼—一直等,一直等
    如果设置的是阻塞式IO的话,httpd告知内核,需要读取哪些数据,此时内核去读取数据,这个时候httpd是被阻塞的,内核将数据从磁盘拷贝到内核缓冲区,然后将内核缓冲区中的数据拷贝到用户缓冲区,直到这个时候httpd被唤醒,从而处理用户缓冲区中的数据
    上面的过程中,从磁盘拷贝到内核缓冲区的时候不需要cpu参与,这个时候CPU可以去处理其他的事情,最大可能的利用cpu;
    当从磁盘缓冲区拷贝到用户缓冲区的时候,httpd是被阻塞的,有助于提高拷贝速度

  2. 非阻塞式IO
    钓鱼 —- 一会过来问一下,一会过来问一下
    当httpd发起一个请求的时候,比如说是read的时候,这个时候会返回一个错误值,但是httpd没有进入到休眠状态,而是不断的发起read请求,不断询问内核数据是不是准备好了,直到数据从磁盘拷贝内核缓冲区的时候,这个时候read不再是错误了,此时需用将内核缓冲求的数据拷贝到用户缓冲区,这个时候需要cpu的参与,所以此时将httpd阻塞,等到数据全部拷贝到用户缓冲区的时候,httpd才被唤醒,这个时候继续处理就好了

  3. 信号驱动IO
    钓鱼 — 加上一个鱼鳔
    httpd会发起一个信号处理的系统调用,如sigaction(),这个系统调用是立即返回的,此时内核从磁盘中拷贝数据到内核缓冲区,当数据准备好了之后,发送一个信号给httpd,此时httpd会发起read请求,将数据从内核缓冲区拷贝到用户缓冲区
    在发起信号到收到信号的时候,httpd没有被阻塞,他可以去干其他的事情,当数据从内核缓冲区拷贝到用户缓冲区的时候,因为需要cpu的参与,此时httpd被阻塞了

  4. 异步IO
    钓鱼 – 将钓鱼的任务交给其他人处理,直接把鱼给我就好了
    httpd会发起一个异步IO的系统调用如aio_read()等,并立即返回,这个异步系统调用告诉内核,不仅要将数据拷贝到内核中,还要讲数据从内核缓冲求拷贝到用户缓冲区,数据拷贝到用户缓冲区之后,发送 一个信号告诉httpd数据准备好了,然后httpd再去处理数据
    上面的这些过程httpd都没有被阻塞

异步IO存在的一个问题就是,因为在将数据从内核缓冲区拷贝到用户缓冲区的时候,需要CPU参与,此时会存在httpd和内核争用cpu的 情况,如果并发量很大的时候,信号响应的速度回很慢,这个时候就会极大的影响性能

  1. IO复用
    钓鱼 – 100个鱼竿
    有三种模型,select,poll,epoll
    他们都是一种函数,用于监控执行文件描述符的数据是否就绪,就绪的意思可以理解为对于某个系统调用不在阻塞了,例如使用read的时候,就绪的意思就是说数据准备好了
    就绪的种类包括是否可读,是否可写,是否异常,

使用 上面的三种函数的作用实际上是监控数据是否被成功的写入到了内核缓冲区或者数据是否被成功的写入了socket缓冲区(send缓冲区)

当httpd调用select的时候,会被select“阻塞”,这个阻塞时长可以被设置,如果是0,则是立即返回,然后轮询,还可以设置为永久阻塞,当数据从磁盘拷贝到内核缓冲区的时候,被select监控到了,此时select会唤醒httpd,httpd会再次调用read函数,将数据从内核缓冲区拷贝到用户缓冲区,然后执行后续的操作

IO复用的优势在于,他可以同时监控多个文件描述符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值