这四个词语都跟线程有关,跟函数有关,跟数据就绪有关,跟主动还是被动有关
1.阻塞----------相对于函数 基于线程上下文
调用者线程调用函数时,因为条件不满足(没有数据),函数不返回,调用者线程状态进入暂停状态,
等待其它线程(也许是内核)待条件满足时通知,即激活线程进入运行状态,继续执行
有2点注意 调用者线程不干活了 调用者主动取数据
2.非阻塞----------相对于函数 基于线程上下文
调用者线程调用函数时,因为条件不满足(没有数据),函数立即返回,调用者线程继续执行,可以执行其它函数,
那啥时获取数据呢,的调用者自己决定了,一次不成功就再尝试,记得很多API 有返回值AGAIN,就是再试试。问题来了,试多少次呢,
这就的根据业务决定了,比如可以超时。
有2点注意 调用者线程继续干活,调用者主动获取数据
3.同步--------------相对于线程
同步一词在多线程编程中资源的竞争经常用到,且还经常用同步的函数,锁,信号量,条件,互斥等等。所以效率不高。
同步的目的保证了代码的串行执行。一件事一件事地做完才能做下一件事
所以 阻塞 和非阻塞 都属于 同步范畴
4.异步 ---------相对于线程
与同步相反,我不需要同步,不需要锁与另外一个线程协调。(咱俩100米短跑比赛看看谁跑的快)
调用者只需发出请求后,可以继续干其它事,另外一个线程(也许是内核)回主动通知并把数据给你
有2点 调用者线程继续干活 调用者被动获取数据(一般在回调函数返回,数据已返回)
======================网上也有一篇讲的靠谱一点的================================
IO操作分为两个过程,第一个是内核有没有准备好数据,第二个是准备好的数据由内核空间拷贝到用户空间。
阻塞、非阻塞、IO复用都是同步的,都是第一个阶段的不同,阻塞是主动去询问内核数据有没有准备好数据,阻塞的就停止了,直到内核说有了。非阻塞的内核告诉没有,直接返回,干其他事情。IO复用也是同理,与非阻塞相比,这里的IO复用是监听多个IO操作,比如在网络编程中,用select或者epoll可以监听一组套接字,这时候哪个套接字准备好数据了,就读,没有就接着干其他的,然后等到下次循环去问。同步中,数据由内核拷贝到用户空间的过程也是需要等待的,只是操作系统处理这个过程比较快,所以我们感觉不到程序已经停下来了,其实是等待数据结束,IO操作才结束。
至于异步,是真正的非阻塞。IO操作的两个过程都没有阻塞,就是说,我在IO的过程中,只告诉内核,我是异步IO,我要读什么什么,然后我就不管了,直接去做其他事情,内核准备好数据后,然后把数据拷贝到用户空间,这两个过程完成后会给进程一个信号,告诉进程,数据都准备好了,请拿走,然后进