30分钟了解同步,异步,阻塞,非阻塞

同步,异步,阻塞,非阻塞,在一些场景下,它们是同一个概念的不同名字;在另一些场景下,它们是不同的概念。

一 描述任务的时候,它们是同一概念的不同名字:

同步,阻塞,串行是同一概念。

异步,非阻塞,并行是同一个概念。

二 处理I/O的时候,它们是不同的概念:

I/O操作有两种类型,同步I/O和异步I/O。I/O操作的过程,通常分为两步:

    第一步,等待数据从网络中到达,缓存到内核空间。
    第二步,把数据从内核空间,拷贝到进程空间。

同步I/O与异步I/O的区别在于第二步,同步需要主动把数据从内核空间拷贝到进程空间;异步由操作系统内核完成数据的拷贝。

其中,同步I/O又分为:同步阻塞式I/O(数据没有准备好,一直等着,直到数据准备好,一个线程只能管理一个IO),同步非阻塞式I/O(数据没有准备好,返回错误码,然后隔一段时间,过来看一下,直到数据准备好,一个线程可以管理多个IO),同步多路复用是I/O(多路复用,select:阻塞在select上,当某一个IO可以操作时,select返回,然后遍历所有IO,找到可以操作的IO,进行操作。多路复用,epoll:阻塞在epoll上,当某一个IO可以操作时, epoll返回,返回值中记录哪个IO可以操作,拿到返回值,直接进行IO操作);异步I/O只有一种(数据没有准备好,直接返回,收到数据准备好的通知后,再处理数据)。

下面,我们结合具体的API,来看下它们之间的区别。处理I/O的时候,所有的套接字编程都是同步I/O,只有使用了特殊的API才是异步I/O。

2.1 同步I/O API

1、同步阻塞式I/O

标红的这部分过程就是阻塞,直到阻塞结束recvfrom才能返回。

图1 同步阻塞是I/O

2、同步非阻塞式I/O

进程把一个套接字设置成非阻塞是在通知内核,当所请求的I/O操作不能立即完成时,不要把进程投入睡眠,而是返回一个错误。可以看出recvfrom是立即返回的,但是需要调用方不停的轮询。

图2 同步非阻塞式I/O

3、同步多路复用式I/O

虽然I/O多路复用的函数也是阻塞的,但是其与以上两种还是有不同的,I/O多路复用是阻塞在select,epoll这样的系统调用之上,而没有阻塞在真正的I/O系统调用如recvfrom之上。

2.2 异步I/O API

1、异步I/O

虽然I/O多路复用的函数也是阻塞的,但是其与以上两种还是有不同的,I/O多路复用是阻塞在select,epoll这样的系统调用之上,而没有阻塞在真正的I/O系统调用如recvfrom之上。红线标记处说明在调用时就可以立马返回,等函数操作完成会通知我们。

图3 异步I/O

参考链接:

1 http://yaocoder.blog.51cto.com/2668309/1308899

2 http://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking

3 http://my.oschina.net/dclink/blog/287198

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Youngxj

linux更新内核版本

60830
来自专栏企鹅号快讯

基于python3.5+的web框架sanic中文入门

sanic是一款用 python3.5+ 写的 web framework,用法和 flask 类似,特点是非常快。 Github 官网:https://git...

28470
来自专栏LEo的网络日志

如何通过criu checkpoint/restore应用

14220
来自专栏谈补锅

iOS项目groups和folder的区别(组和文件夹)

   在引用一个第三方框架的时候,已经拖进去了,但是引用框架里面的文件时,竟然报错说找不到.......查了一下,原来在拖进去时没有注意group和folder...

14230
来自专栏Java开发

搭建 ElasticSearch 6.1.3分布式集群

先启动mac上的master,再启动Ubuntu上的slave节点,观察输出,会有一个node-102探测到master节点的提示:

21010
来自专栏散尽浮华

linux下的缓存机制及清理buffer/cache/swap的方法梳理

1)缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存...

57680
来自专栏Java成神之路

redis_学习_01_redis的安装

11330
来自专栏运维小白

4.2 du命令

du命令 du命令,查看文件的大小 du命令用法 du -sh 目录/文件命令用法 du -sh 目录/文件 查看目录或文件的大小 [root@localh...

23790
来自专栏nummy

python安装私有包

你想要安装一个第三方包,但是没有权限将它安装到系统Python库中去。 或者,你可能想要安装一个供自己使用的包,而不是系统上面所有用户。

13130
来自专栏技术博文

Linux下用于查看系统当前登录用户信息的4种方法

作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(...

48780

扫码关注云+社区

领取腾讯云代金券