首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >30分钟了解同步,异步,阻塞,非阻塞

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

原创
作者头像
SOEZ
修改2018-07-22 10:46:36
1.6K0
修改2018-07-22 10:46:36
举报
文章被收录于专栏:How things work?How things work?

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

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

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

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

二 处理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
图1 同步阻塞是I/O

2、同步非阻塞式I/O

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

图2 同步非阻塞式I/O
图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
图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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 描述任务的时候,它们是同一概念的不同名字:
  • 二 处理I/O的时候,它们是不同的概念:
    • 2.1 同步I/O API
      • 1、同步阻塞式I/O
      • 2、同步非阻塞式I/O
      • 3、同步多路复用式I/O
    • 2.2 异步I/O API
      • 1、异步I/O
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档