微前端架构如何改变企业的开发模式与效率提升
947
2022-10-06
Linux下5种IO模型
类型
本文总结自极客时间《深入拆解Tomcat和Jetty》
UNIX系统下的IO模型有5种
IO模型 | 英文 | |
阻塞IO | blocking I/O | 同步 |
非阻塞IO | nonblocking I/O | 同步 |
IO多路复用 | select poll 和 epoll | 同步 |
信号驱动IO | signal driven I/O(SIGIO) | 同步 |
异步IO | asynchronous I/O | 异步 |
对于一个网络IO通信过程,比如网络读取会涉及两个对象
调用I/O操作的用户线程操作系统内核
一个进程的地址空间分为用户空间和内核空间,用户线程不能访问内核空间
当用户线程发起I/O操作后,会经历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]Netty相关 [2][3]一个故事讲清楚NIO IBM [5]https://ibm.com/developerworks/cn/java/j-lo-javaio/index.html
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~