[转帖]再谈IO的异步,同步,阻塞和非阻塞
再谈IO的异步,同步,阻塞和非阻塞
https://yq.aliyun.com/articles/53674?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg
kryptosx 2016-05-27 23:57:51 浏览1528
原本转过一个《六种Socket I/O模型幽默讲解》,里面用比喻的方法讲解各种IO,但说到底那个时候我对同步异步这些还是只知其表。还未能完全理解异步和同步,现在觉得清晰一些了。总结一下。
前提概要:
IO的过程:
整个IO的过程其实是应用发起IO的请求,到应用获取到IO请求数据的中间过程。
这个中间,其实主要的时间就是系统准备数据的过程。这也是异步技术的优化所在。
对系统调用的理解:
首先,我们要明确一点。IO的操作属于一种系统调用。也就是应用在运行中,进入到内核代码来执行某些重要的操作。
其实我们可以把系统调用看做是一个通信的过程。应用程序是A,操作系统是K。这就类似于一个C/S的模型。
- A向K发送请求信息。(系统调用)
- K返回给A信息。(返回值)
- 会话结束。(我们认为,这样就是一个完整的通信过程)
当然,也可能会出现这样的通信过程。
- B发送给A信息。(比如回调)
- 会话结束。
一次IO请求,可能是一个通信过程,也可能需要多个通信过程。这就是各种IO的区别。
同步和异步:
同步:
由应用(A)向K发起请求,到A获取数据,期间一直是A作为会话的发起者。
异步:
和同步相反的自然就是异步。异步中,A获取数据这次会话,是由K发起的。
注意:这里有点困惑的是,K通知A时,可以直接把数据给它,也可以告诉A我准备好了,你来请求吧。感觉二者的区别应该就是IOCP和Epoll的区别。后者给人的感觉就是,异步中带有同步。网上的异步阻塞应该也就是这个。
区别:
可以看出,二者的区别就是在于最终获取到数据这个会话,是哪边发起的。对于应用而言,主动就是同步,被动就是异步。(这个有点像CPU的同步/异步中断)
阻塞和非阻塞:
它们的区别主要在于IO请求发起,直到获得数据,这段时间,应用是等着还是不等着。
阻塞:
阻塞,就是应用等待着,不干活。
其实对于操作系统而言,阻塞不是什么坏事,不然要我操作系统干嘛。操作系统功能之一就是系统资源的调度,当某个进程(线程)阻塞了,它就能调度CPU资源给别的进程。这其实能提高不少利用率。
非阻塞:
看网上不少人说,这看上去是个差一点的方案。它是让应用不断的轮询,直到拿到数据。它相比于阻塞,会浪费一些CPU,自然性能也就会差一些了。
总结:
各种IO设计不同,但目的是一样的。都是为了让应用程序跑的更快,系统资源利用的更充分。
异步对于同步的优化点:
我一直觉得异步多进程和同步的性能并没有什么差异。因为我们的优化点是在发起IO请求到获得请求数据之间的这段时间。这段时间如果等着,那就浪费了。
- 同步程序中(阻塞模式),多进程的情况下,操作系统的调度让阻塞的程序停止,把CPU给另一个需要CPU的进程,比如计算,处理。
- 异步程序的话,程序自身就不阻塞,像一个工厂流水线一样,只要上面工件下来,干完扔给下一步就行。(有可能回到上一步,也就是回调)
看上去,二者用了不同的方法优化了那段时间。其实把同步的程序从操作系统调度的层面来看,它也是异步的,对于操作系统而言,进程就是一个task_struct嘛,现在的CPU和IO设备其实就是异步的。
所以,准确的说,是应用程序的同步还是异步。二者的区别在于代价,也就是管理的灵活和切换的性能损耗。因为在同步程序中,第一步完成后,需要切换任务。而异步程序就不需要了,它继续干它自己的活。那么切换的代价就小了。
有人说,协程让用户使用同步的方式写出异步的性能。主要也是因为协程的切换代价小。再看IOCP的设计,为了最有效的利用操作系统,它使用了线程池,其目的也就是让线程能保持一个合理的数量。
该阻塞还是非阻塞:
阻塞其实就是把调度的权力给了操作系统,让操作系统来提高利系统用率。非阻塞则是把这个权力给了开发者,因为不阻塞的话我们可以做些别的事情,类似于程序内部的一个调度功能。
协程就是在系统调用时,内部跳转到别的协程代码去执行。类似于是自己实现了一个轻量级的调度。
转载请注明:旅途@KryptosX » 再谈IO的异步,同步,阻塞和非阻塞
[转帖]再谈IO的异步,同步,阻塞和非阻塞的更多相关文章
- 谈IO中的阻塞和非阻塞,同步和异步及三种IO模型
什么是同步和异步? 烧水,我们都是通过热水壶来烧水的.在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开.随着科技的发展,现 ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) 当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. <IO - 同步,异步,阻塞,非阻塞 >是我在开始学习e ...
- IO中同步、异步与阻塞、非阻塞的区别
一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...
- IO同步、异步与阻塞、非阻塞
一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...
- IO中同步、异步与阻塞、非阻塞的区别(转)
转自:http://blog.chinaunix.net/uid-26000296-id-3754118.html 一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步, ...
- IO之同步、异步、阻塞、非阻塞 (2)
[原创链接: http://www.smithfox.com/?e=191, 转载请保留此声明, 谢谢! ] I/O Model 是一个很大的话题, 也是一个实践性很强的事情, 网上有各种说法和资料, ...
- IO多路复用,同步,异步,阻塞和非阻塞 区别
一.什么是socket?什么是I/O操作? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切都是 ...
- 一文读懂阻塞、非阻塞、同步、异步IO
介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...
随机推荐
- Java ArrayList对象集合去重
import java.util.ArrayList; import java.util.Iterator; public class StringSampleDemo { public static ...
- (大型网站之Nginx)图解正向代理、反向代理、透明代理
一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端[用户A]和原始服务器(o ...
- BufferedReader和BufferedWriter简介
BufferedReader和BufferedWriter简介 为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率.BufferedReader用于加快读取字符的速 ...
- java并发编程学习博客
http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 经典
- .netFramework 升级NetCore 问题汇总及解决方案
升级版本: NetCore sdk 2.2.108 .AspNetCore 2.2.0.EFCore 2.2.6 所有程序引用均从NuGet上下载,并支持NetCore 问题: 问题1:No coer ...
- 基因表达半衰期 | mRNA Half-Life
做单细胞RNA-seq分析,自然就能想到我们测到的其实是一个概率学的东西,就像女士品茶里的酵母的泊松分布一样. 真实的细胞里,一切都是连续的,从DNA到mRNA到蛋白,是有一个时间间隔的,每一个pro ...
- 解决“Jquery的each里面return失效的问题”
参考文章:http://blog.csdn.net/coffeesmile/article/details/53349860 问题描述: 集中获取页面的一些元素,然后用each循环处理这些元素,如果其 ...
- linux内核的0号进程是在哪里创建的?
1. 0号进程即为idle进程或swapper进程,也就是空闲进程 2. 0号进程特点 idle是一个进程,其pid为0. 主处理器上的idle由原始进程(pid=0)演变而来.从处理器上的idle由 ...
- Dart对象和类
/* 面向对象编程(OOP)的三个基本特征是:封装.继承.多态 封装:封装是对象和类概念的主要特性.封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则 ...
- Python3基础 函数 多值参数 元组与字典形式(使用星号对列表与字典进行拆包)
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...