浅谈阻塞、非阻塞、同步和异步

1.阻塞和非阻塞

阻塞和非阻塞指的是操作是否遵循先后顺序。

阻塞:主线程内操作顺序执行,后面的操作需要等到前面完成后才能继续顺序执行;

非阻塞:遇到阻塞的操作,去干其他事情;

2.同步和异步

同步及异步指的是通信机制的不同。

同步:主动判断操作的状态;

异步:等操作执行完了主动通知你;

3.引申

同步阻塞:出现阻塞,什么都不做,等待该操作完成,再去干其他事;

同步非阻塞:出现阻塞,去做别的事,但要不断的判断阻塞操作有没结束;

异步阻塞:出现阻塞,啥也不干,等阻塞操作完成通知你,再去干其他事;

异步非阻塞:出现阻塞,去干其他事,阻塞操作完成通知你,接着干其他事;

4. 一个小故事

故事:小A烧开水。

出场人物:小A出场道具:普通水壶(放在煤气灶上的那种,为了方便简称:水壶);会响的水壶(水烧开了会响的那种,简称:响壶)。故事目的:小A要拿开水泡咖啡

小A为了实现目的,指定了4个计划:

1、用水壶烧水,并且站在煤气灶旁边,啥事不干,两眼直勾勾的盯着水壶,等水烧开。烧开后就去泡咖啡。同步阻塞

假设烧水和泡咖啡是在同一个线程中执行。

2、仍然用水壶煮水,不过此时不再傻傻得站在那里看水开没开,而是去玩局LOL,每当自己死了,就过来看看水开了没有。如果水开了就去泡咖啡。同步非阻塞

假设这里玩LOL,是另一个线程运行的。

3、动用响壶烧水,仍然站在煤气灶旁边,不过此时不两眼直勾勾的盯着壶了,而是听响,因为响壶水开时会用响声通知小A。异步阻塞

4、在计划3的基础上,小A不站在煤气灶旁边了,而是去玩局LOL,等听到响壶的声音提醒后,再去跑咖啡。异步非阻塞

5.浅谈IO

当前IO模型主要分为五种:1.阻塞IO;2.非阻塞IO;3.IO多路复用(NIO);4.信号驱动IO;5.异步IO(AIO)


浅谈阻塞、非阻塞、同步和异步

内核空间和用户空间概念:

内核空间存放内核代码和数据,是系统进程使用的空间;用户空间是存放用户代码和数据的空间。

进行IO时,数据经过网络传输,进入网卡写入内核空间,用户使用时将数据从内核空间读取到用户空间,这是大部分IO需要经历的流程(epoll除外)。

总体来说,前四种都是同步IO,都需要一段阻塞的过程,将数据从内核空间复制到用户空间(信号驱动IO不是异步IO主要也是因为需要阻塞对数据进行处理)。信号驱动IO和异步IO的区别在于,信号IO通知你可以IO,仍然需要我们对IO进行处理,而异步IO是完成处理再去告知操作已经完成了。通过此图,我们也可以了解到,阻塞是相对于整体和局部的。