阻塞IO 非阻塞IO IO多路复用 异步IO 区别
Linux中五种IO模型:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型、异步IO模型
linux的内核将所有外部设备都看作一个文件来操作,针对一个文件的读写会调用内核提供的系统命令,返回一个file description(df,文件描述符)。图片截取自《Netty权威指南》
UNIX提供了5种IO模型:
1、阻塞式IO:以socket套接字为例,在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或发生错误时才返回,在此期间一直会等待,进程从调用recvfrom开始到返回的整段时间内都是被阻塞的。
2、非阻塞IO:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个ewouldblock错误,一般都对非阻塞IO进行轮询检查这个状态,看内核是不是有数据到来。
3、IO复用:linux提供了select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select上,这样select/poll可以帮助我们侦测多个fd是否处于就绪状态。select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。linux还提供了一个epoll系统调用,epoll使用基于事件驱动的方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback。
4、信号驱动IO:首先开启套接字信号驱动IO功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为该进程生成一个sigio信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理函数。
5、异步IO:告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别是:信号驱动模型由内核通知我们何时可以开始一个IO操作;异步IO模型由内核通知我们IO操作何时已经完成。
其实我个人理解整个io的过程可以大概分为两个阶段:
1、阶段一是内核态对数据报的准备阶段。
2、阶段二是将数据从内核态拷贝到用户空间。
阻塞io在两个阶段都阻塞。
非阻塞io在阶段一通过进程反复调用revfrom等待返回成功指令,第二阶段为阻塞。
io复用通过select/poll epoll,将传递过来的df文件描述符的状态进行检测,其是否为就绪状态。 select为O(n)的轮询复杂度,有最大连接数限制。 poll也是O(n)复杂度,但因为它基于链表的实现,没有最大连接数限制。 epoll将每个流发生的io事件对我们进行通知。实际上是事件驱动,每个事件关联fd。使复杂度降低到O(n)。
信号驱动io的第一阶段建立sigio的信号处理程序,以及sigio的回传,第二阶段为阻塞。
异步io在第一阶段和第二阶段的工作都完成后,由内核向应用进程进行通知。
阻塞IO 非阻塞IO IO多路复用 异步IO 区别相关推荐
- 什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞
转自:http://www.elecfans.com/baike/wangluo/fuyongqi/20180307644141.html 一.什么是socket? 我们都知道unix(like)世界 ...
- python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO
Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...
- IO:同步,异步,阻塞,非阻塞
IO - 同步,异步,阻塞,非阻塞 都是老生常谈的东西,多通读几遍,理解透彻! 实际上同步与异步是针对应用程序与内核的交互而言的.同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看 ...
- Linux IO - 同步,异步,阻塞,非阻塞
From:http://blog.csdn.net/historyasamirror/article/details/5778378 同步/异步,阻塞/非阻塞概念深度解析:http://blog.cs ...
- 网络IO之阻塞、非阻塞、同步、异步总结
1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...
- 阻塞和非阻塞、同步和异步 、五种IO模型
阻塞和非阻塞,同步和异步 1 例子 故事:老王烧开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 老王想了想,有好几种等待方式 1.老王用水壶煮水,并且站在那里,不管水 ...
- 阻塞IO, 非阻塞IO, 同步IO,异步IO
阻塞IO, 非阻塞IO, 同步IO,异步IO 介绍 先说明几个概念 用户空间与内核空间 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间(内存)划分为两部分,一部分 ...
- IO中同步、异步与阻塞、非阻塞的区别
一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例 ...
- 网络编程中同步与异步,IO阻塞与非阻塞总结
IO操作分两个阶段 第1个阶段:等待数据准备好(从外部设备磁盘或网络读到内核缓冲区): 第2个阶段:采用系统调用(内核进程),操作系统内核将数据从内核缓冲区读到用户空间. 第1阶段花费的时间远远大于第 ...
最新文章
- 华为外包1年_2021年(1月)有哪些高性价比的华为/荣耀手机值得购买?
- bert pytorch源码_【PyTorch】梯度爆炸、loss在反向传播变为nan
- VSEARCH操作实战-免费使用无内存限制的USEARCH!
- 1874畅通工程续(dijkstra算法)
- laravel框架总结(十一) -- 集合
- 【Spring学习】ring的core模块应用详解
- 工作63:await和anync
- LeetCode 2125. 银行中的激光束数量
- 当代开发者的六大真实现状,你被哪一个场景“戳中”了?
- Redis 学习---(4)Redis 数据类型
- 如何使用SQL Server主数据服务替换硬编码的查找
- PAT甲题题解-1010. Radix (25)-二分搜索
- 网络安全图书馆文件下载
- 关于Android 微信APP支付开发中遇到的问题
- 戴文的Linux内核专题:22 配置内核 (18)
- 轻松制作 Notion 风格的头像 - Notion Avatar Maker
- DbContext 查询(三)
- VS调试技巧:让断点在for循环中i为某个值的时候停下来
- 基于Python+django的航班查询与推荐-计算机毕业设计
- java电商和企业项目_java电商和企业项目