一、前言
线程、同步异步等知识,在我们刚刚踏入程序这一个行业就开始接触了。但是由于I/O(磁盘读写,网络通信)这种耗时的操作,各个语言都有完整的封装方法,我们并不用去了解其异步过程也能完成大部分功能。所以多数人在工作一两年之后,仍然无法理清他们的关系。不过它对于我们优化代码,了解底层不可或缺,现在我来盘点一下他们的联系和概念。
二、核与线程的关系
我们平时经常会听到8核、16核处理器,那这里的核与线程有什么关系呢?单核代表一个线程么?
单核可以有多个线程,只是它的多线程通过分时来实现,即把时间分成片,每片处理一个线程,所有的线程循环处理。所以对于单核系统而言,开多少个线程都无法提高程序的运行效率。
而多核可以同时实现多线程。比如双核系统开两个线程,运行效率将会翻倍。但并不代表效率可以无限提升,多线程个数等于核的个数时,效率达到最高。
比较另类的是,之前Intel有过16核32线程的机器,它的原理是超线程技术使一个核心能模拟2个逻辑核心,但据说并不能真正达到两个核的水平。
三、 同步与异步
1、同步(sync):发出一个功能调用的时候,在没有得到结果前,该调用就不返回。
2、异步(async):是与同步相对应的一个概念,调用在发出之后,就直接返回了,继续执行下面的函数,所以并没有返回结果。当调用完成后,一般通过状态、通知和回调来通知调用者。需要注意的是,对于异步调用,调用的执行和返回并不受调用者的控制。
3、通知调用者有如下三种方式:
- 状态:即监听被调用者的状态,调用者需要每隔一定时间检查一次,效率非常低。
- 通知:当被调用者执行完成后,发出通知告诉调用者,优点是调用者不用定时检查,提升效率,无需消耗太多性能。
- 回调:与通知类似,当被调用者执行完成后,会调用调用者 提供的回调函数。
四、阻塞与非阻塞
1、阻塞:阻塞是指调用结果返回前(或者是收到通知前),当前线程会被挂起,即不会继续执行后续操作。 2、非阻塞:是指在不能立刻得到结果前,该调用不会阻塞当前进程。
注:同步异步是对于被调用者而言的,而阻塞非阻塞则是针对调用者而言的。
和刚才一样,打个比喻加深理解:
1、同步阻塞:你打电话给114查路线,在不挂断的情况下,客服帮你查了十分钟之后告诉你,期间你一直在接听电话。
2、同步非阻塞:你打电话给114查路线,在不挂断的情况下,客服帮你查了十分钟之后告诉你,你期间吃了个🍉(打电话没有影响你做其他事,显示运用中也很难遇到)。
3、异步非阻塞:你打电话给114查路线,客服说查好之后打给你,这期间你可以做任何事。
4、异步阻塞:你打电话给114查路线,客服说查好之后打给你,但这期间你什么都没做,等到回复电话之后,再继续下一步动作。(是不是很傻)现实运用中,异步阻塞是没有意义的!
理解:
1、同步与异步是针对被调用者来讲的,同步就是在发出调用后,调用不会返回,但一旦有结果了,调用就会立刻返回结果。而异步则是调用发出之后,调用直接返回,可以理解为被调用者断开了与调用者之间的联系,有结果后会通过状态、通知、回调函数等通知。
2、阻塞与非阻塞则是针对调用者来讲的,阻塞是指结果返回之前调用者一直等待,无论是同步还是异步,非阻塞则是发起调用后如果不能立刻得到结果,调用程序会继续执行。