Linux下5种IO模型

类型

本文总结自极客时间《深入拆解Tomcat和Jetty》

UNIX系统下的IO模型有5种

IO模型英文
阻塞IOblocking I/O同步
非阻塞IOnonblocking I/O同步
IO多路复用select poll 和 epoll同步
信号驱动IOsignal driven I/O(SIGIO)同步
异步IOasynchronous I/O异步

对于一个网络IO通信过程,比如网络读取会涉及两个对象

  1. 调用I/O操作的用户线程
  2. 操作系统内核

一个进程的地址空间分为用户空间和内核空间,用户线程不能访问内核空间

当用户线程发起I/O操作后,会经历2个步骤

  1. 用户线程等待内核将数据从网卡拷贝到内核空间
  2. 内核将数据从内核空间拷贝到用户空间

各种I/O模型的区别就是:他们实现这2个步骤的方式是不一样的

同步阻塞IO

同步阻塞IO:用户线程发起read调用后就阻塞了,让出CPU。内核等待网卡数据到来,把数据从内核拷贝到用户空间,接着把数据拷贝到用户空间,再把用户线程唤醒

在这里插入图片描述

同步非阻塞IO

用户线程不断发起read调用,数据没到内核空间时,每次都返回失败,直到数据到了内核空间,这一次read调用后,在等待数据从内核空间拷贝到用户空间这段时间里,线程还是阻塞的,等数据到了用户空间再把线程叫醒

在这里插入图片描述

I/O多路用

用户线程的读取操作分成两步,线程先发起select调用,目的是问内核数据准备好了没?
等内核把数据准备好了,再发起read调用。再等待用户数据从内核空间拷贝到用户空间的这段时间里,线程还是阻塞的。那为什么叫IO多路复用呢?因为一次select调用可以向内核查多个数据通道(Channel)的状态,所以叫多路复用
在这里插入图片描述

异步IO

read线程发起read调用的同时注册一个回调函数,read立即返回。等内核将数据准备好后,再调用指定的回调函数完成处理。在这个过程中,用户线程一直没有阻塞

在这里插入图片描述

select poll epoll的区别

select打开连接数有限制
poll用链表来存储,仅受限于物理内存
epoll基于时间驱动,有数据来才通知

推荐阅读

《UNIX网络编程》

参考博客

Linux下的五种IO模型
[1]https://www.jianshu.com/p/486b0965c296
Netty相关
[2]https://cloud.tencent.com/developer/article/1360553
[3]https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html
一个故事讲清楚NIO
[4]https://www.cnblogs.com/LBSer/p/4622749.html
IBM
[5]https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java识堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值