同步IO, 异步IO的理解
1. 什么是IO?
在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO。
2. 阻塞IO

(1)当用户线程发起IO请求后,会进行系统调用(system call)来让内核(Kernel)进行IO操作
(2)此时用户线程阻塞,等待内核将数据准备好
(3)内核将数据准备好后会将数据从内核空间拷贝到用户空间,并返回给用户线程结束阻塞。
3. 非阻塞IO

(1) 由用户线程发起IO请求, 进行系统调用来让内核进行IO操作
(2) 此时如果内核没有准备好数据则会直接返回error,并不会阻塞用户线程,用户线程可以重复的发起IO请求
(3)当用户线程发起请求并且内核已经将数据准备好后,会将数据从内核空间拷贝到用户空间(这个过程是需要阻塞用户线程的),返回给用户
4. 多路复用IO

(1)用户线程调用select后进行系统调用(内核会监视所有select负责的socket),此时用户线程被阻塞
(2)当内核将数据准备好后就会返回,并通知用户线程进行读取操作,此时内核将数据拷贝到用户空间并返回
5. 异步IO

(1)用户线程进行aio_read,进行系统调用切换到内核
(2)内核立即返回,并不会阻塞用户线程
(3)内核准备好数据后会将数据从内核空间拷贝到用户空间并通知用户线程操作已完成
6. 阻塞IO与非阻塞IO?
阻塞IO:用户线程发起IO操作,紧接着由内核线程来执行IO操作,在阻塞IO中内核线程并不会立即返回而是等待数据拷贝到内存空间时才返回,在此期间用户线程处于阻塞状态。
非阻塞IO: 与阻塞IO不同,内核线程在执行IO操作后会立即返回,若结果为error则用户线程可以重新发起请求而不会被阻塞,一旦内核将数据准备好了且用户线程发起了IO请求那么将数据拷贝到用户空间。
我们看上面的图可以知道IO操作大致分为两个部分:
(1)用户线程发起IO请求时,内核未准备好数据
(2)用户线程发起IO请求时,内核以准备好数据
通过对比两个图中流程我们可以发现,(2)这个流程在阻塞IO与非阻塞IO流程是相同的区别在于(1)这个步骤。因此阻塞IO与非阻塞IO的区别在于内核线程在执行IO操作时是否立即返回结果,若立即返
回则为非阻塞IO,反之则为阻塞IO。
7. 同步与异步IO?
异步IO: 用户线程发起IO操作后,可以立即去做其他事情,另一方面,对于内核线程当它收到异步读取之后会立即返回,不会对用户线程造成阻塞。当内核将数据准备好之后会将数据从内核空间拷贝到用户空间,内核会发送 给用户一个信号通知用户IO操作已完成。
同步IO: 同步IO的关键在于在真正读取数据(也就是上面提到的(2)这个步骤)的时候用户线程是否被阻塞。非阻塞IO虽然在用户发起请求时会立即返回,但是当内核准备好数据之后,任然需要用户线程发起请求才会将数据 从内核空间拷贝到用户空间,因此非阻塞IO属于同步IO。
8. 异步IO与非阻塞IO的区别?
异步IO与非阻塞IO的区别在于,当用户线程发起一次IO操作不需要再次去确认内核是否准备好数据。异步IO中内核准备好数据后会将数据从内核空间自动拷贝到用户空间。
9. 总结
最后统一的总结一下:
用户进程发起请求从内核中获取数据那么这时候有两种情况:
(1)操作系统还没有准备后数据,那么这时候怎么办,有两种方法:
a. 让用于进程等着(这种情况就是阻塞)
b. 如果没有数据就返回一个ERROR,不需要用户进程干等(这种情况就是非阻塞)
(2)过了一会儿操作系统准备好数据了,这时候又有两种方法:
a. 啥也不管,等着用户进程再次来请求才把数据给它(这种情况就是同步)
b. 负责到底,数据准备好,直接给到用户进程,并且还发出一个信号,告诉用户进程数据已经准备好(这种情况就是异步)
因此,我们可以发现:不管是阻塞IO,还是非阻塞IO都是同步IO。
同步IO, 异步IO的理解的更多相关文章
- 阻塞IO, 非阻塞IO, 同步IO,异步IO
阻塞IO, 非阻塞IO, 同步IO,异步IO 介绍 先说明几个概念 用户空间与内核空间 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间(内存)划分为两部分,一部分 ...
- Python学习-day10(番外篇) 阻塞IO 非阻塞IO 同步IO 异步IO
这个章节的内容是关于IO的概念,谈一谈什么是 阻塞IO 非阻塞IO 同步IO 异步IO.以下摘要是我对这四种IO的一个形象理解. 场景是去去银行办理业务.节点有三个,1)到银行提交申请:2)取号:3) ...
- 一文读懂阻塞、非阻塞、同步、异步IO
介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
转载:IO复用\阻塞IO\非阻塞IO\同步IO\异步IO 一. 什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述符时(例如服务器程序要同 ...
- 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍
事件驱动介绍 一.前言 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收 ...
- 阻塞、非阻塞、同步、异步IO
阻塞.非阻塞.同步.异步IO http://www.cnblogs.com/yunxitalk/p/9031306.html 介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用. ...
- 网络编程----堵塞、非堵塞和同步、异步IO
我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...
随机推荐
- jsp实现增加数据功能
1. 环境的搭建 软件 数据库 sql myeclipse 8.0 tomcat 6.0 2. 安装完 myeclipse 配置下 部署tomcat 6.0 =1=> =2=> 新 ...
- PHP的array_walk和array_map函数实现数组值UTF-8转GBK编码
在PHP中,array_walk() 和 array_map()两个函数都可以实现对数组中每个值的修改,比如本例就是将数组中所有的值,由UTF-8编码转成GBK编码. 当然,除了这两个函数,也可以用 ...
- Web安全测试实战之测试HTTP方法
一. Http方法测试 有些Web服务器默认情况下开放了一些不必要的HTTP方法(如DELETE.PUT.TRACE.MOVE.COPY),这样就增加了受攻击面. 测试方法: 1.打开webscara ...
- 什么是渐进式框架 (vue.js)
渐进式意味着你可以将 vue 作为你项目的一部分嵌入其中,带来更丰富的交互体验
- python2和python3编码问题
欢迎加入python学习交流群 667279387 一.什么是编解码 1.什么是unicode 2.编码方式 二.python中的编解码 1.python2 (1).encode() 和 .decod ...
- 商品分页查询 ego-prc 实现-easyui
使用 easyui 的 DataGrid 控件实现商品的分页查询,DataGrid 控件提交分页所需要的 page 和rows 参数,后台响应包含总记录数 total 和需要显示的商品对象的集合 ro ...
- python做单因素方差分析
方差分析的主要功能就是验证两组样本,或者两组以上的样本均值是否有显著性差异,即均值是否一样. 这里有两个大点需要注意:①方差分析的原假设是:样本不存在显著性差异(即,均值完全相等):②两样本数据无交互 ...
- python学习笔记—DataFrame和Series的排序
更多大数据分析.建模等内容请关注公众号<bigdatamodeling> ################################### 排序 ################## ...
- CSS的三种样式,有一种你肯定不知道
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者LFuser 正文 新手注意:如果你学习遇到问题找不到人解答,可以点我进裙 ...
- WebAPI接口的自动化测试1
自动化测试要满足四个条件: 1 - 自动化用例能够完成所有测试步骤 -------- postman不支持 没有完整的用例管理系统 2 - 每个用例的输入数据,必须要自动填入 -------- ...