五种I/O模型

I/O模型是指对输入和输出做出的规范与实现

同步/异步

主要区别在I/O进程需不需要全程参与。

  • 同步:全程需要当前进程参与。
  • 异步:当前进程发送完请求指令之后,就不需要参与后续的操作,意味着发送请求后执行完其他操作就可以停止了,不需要管I/O是否完成。这也就注定异步I/O不会阻塞。

阻塞/非阻塞

区别在于调用者进程是否需要挂起进行等待。

  • 阻塞:需要等待I/O操作完成后才可以执行后续代码。
  • 非阻塞:不需要等待I/O操作完成就可以执行后续的代码。也就是说并不关心I/O的执行状态。

五种I/O模型

三种模型分别是BIO(同步阻塞IO)、NIO(同步非阻塞IO)、AIO(异步非阻塞IO)、IO多路复用、信号驱动。

BIO

可以理解为一般的单线程,即同一时间只能做一件事,后续的事情必须要等前一件事处理完才能进行处理。

NIO

区别于BIO,NIO会轮询数据是否加载完成,在轮询的间隙中可以完成后续的事情,只需要再返回最终结果前等待I/O完成即可。

AIO

异步I/O必然是非阻塞的,因为调用的线程只需要调用,或者给出一个回调函数即可,不需要等待I/O操作完成即可返回结果。

IO多路复用

顾名思义,这种IO模型复用一个线程,实现了单线程监控多个请求。

需要依靠系统支持,拿linux举例,提供了select/poll和epoll两种函数。

linux操作文件实际上是通过fd(文件描述符),而select函数需要传入fd_set参数,这个参数是bitmap的数据结构,可以理解为位为0就说明数据没到缓冲区,位为1说用数据到了缓冲区。select会遍历fd_set,判断标志位是否有变化,如果变化就会通知对应程序进行处理。

epoll是对select的缺点进行弥补,它不需要每次都遍历fd_set,而是对已经就绪的fd专门维护一个队列,只需要每次从这个就绪队列中取出即可。而epoll使用mmap来加速内核空间和用户空间的消息传递,避免了内存拷贝,效率上就比select高很多。

信号驱动

上面的IO多路复用模型是主动询问的方式去确认数据是否就绪,而信号量是通过向内核发送一个信号(SIGIO)然后就可以做其他事情,当内核数据准备好后,通过SIGIO信号通知应用程序,应用程序收到信号后就会去读取数据。

总结

五种IO模型中只有一种是异步的(AIO),其他的都是同步的,因为他们都需要等待数据从内核空间到用户空间。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值