Listening to the Words

什么是同步、异步、 阻塞、非阻塞?

什么是同步、异步、 阻塞、非阻塞?

updated at : 2021-04-03

几个月后的今天,在想起上次在写这篇文章时举的例子,总觉得迷惑和不恰当,它只是做了一个类比,但有感觉没能准确描述。

同步异步的通常指的是客户端的行为,从一而终的行为为同步,半途而去,等待别人通知结果的行为是异步。

阻塞与非阻塞其实不是客户端(应用层软件)的行为,不管程序里怎么调用阻塞或非阻塞功能,最终都是由内核(kernal)在执行。因此,这个概念是指 内核态的行为是阻塞和非阻塞。

在现代编程中阻塞和非阻塞是非常重要的系统I/O模型。BIO NIO AIO都是从内核态发生的,根本不是用户态(应用层)的行为。

应用:
在编程语言中PHP基本是同步阻塞模型的代表,Nodejs则是异步非阻塞模型的代表。但是这两者都有其弊端,Nodejs最大的弊端是异步回调地狱(callback无数层的嵌套),这对于开发者不太友好。

其实相对对于开发者最好的模型是同步非阻塞模式,即书写同步代码程序不阻塞执行,最典型的程序语言是golang,使用开启协程的方式执行(而不是回调)。

其实基于epoll模型的应用程序都不是异步非阻塞的,而是同步非阻塞,应用程序仍然需要监听内核态事件(读写)的变化。


分割线


直接举例子:

同步、异步

同步异步指的的是做一件事前后的行为是否是同一个执行者;
同步和异步指的是对于消息结果是客户端主动获取的,还是由服务端间接推送的。

举例子:

小明去烧开水,水烧开了取出来泡茶。

同步: 小明烧开水一直到水开。
异步: 小明只去烧水,烧开后水壶呼呼的通知小明水壶响了。这个就是异步过程

阻塞、非阻塞

阻塞非阻塞是一件事情的处理方式。

阻塞和非阻塞指的是客户端等待消息处理时本身的状态,是挂起还是继续干别的。

举例子:
小明去烧开水,一直等着水烧开,那么烧水过程就是阻塞的。小明什么都没干。

小明去烧开水,然后去洗杯子,洗茶具不时看看水烧开了吗(轮询),烧开水的过程对于小明就是非阻塞的。

同步阻塞

小明烧开水,一直傻傻的等水开,然后洗茶杯、茶具,沏杯茶。

同步非阻塞

小明烧开水,然后去洗茶杯、茶具,不时看看水烧开了没,然后水开了沏茶。

异步阻塞

小明烧开水,直到水开了呼呼的响,小明一直不时还在看开水是否烧好了。

异步非阻塞

小明烧开水,然后去洗茶杯、茶具,玩手机,直到水烧开了呼呼的响。

所谓同步异步,只是对于水壶而言。 普通水壶--同步;会响的水壶--异步。 虽然都能干活,但响水壶可以在自己完工之后,提示小明水开了。
所谓阻塞非阻塞,仅仅对于小明而言,他有没有一直等待结果。
点赞