同步异步阻塞非阻塞
一、任务运行的三种状态
- 进程在运行的过程中不断地改变其运行状态
- 通常一个运行的进程必须具有三种状态:就绪态, 运行态, 阻塞态
1.就绪态 (Ready)
- 当进程已分配到除CPU以外的所有必要的资源后,只要再获得CPU, 便可执行程序, 进程这时的状态就称为就绪态,
- 在一个系统中处于就绪态的进程可能有多个, 通常将他们排成一个队列, 这就叫就绪队列
2.运行态 (Running)
- 当进程已经获得CPU操作权限, 其程序正在运行, 着就叫做运行态
- 在单核操作系统中, 只有一个进程处于运行态, 多核操作系统有多个进程处于运行态
3.阻塞态 (Blocked)(sleep)
- 正在执行的进程, 由于等待某个事件而无法执行时, 便被操作系统剥夺了cpu的操作时间, 这是就是阻塞态
- 引起阻塞的原因多种, 例如: 等待I/O操作, 更高优先级的任务抢走了CPU权限等.
4.进程三种状态之间的转换
一个进程在运行期间, 会不断地在一种状态切换到另一只种状态
他可以是多次处于就绪态和运行态, 也可以多次处于阻塞态, 下图是三种状态的转换图
-
就绪态➠➠运行态
- 处于就绪态的进程, 当进程调度程序为之分配了CPU的时间片后, 该进程就会由就绪态转变成运行态
-
运行态➠➠就绪态
- 处于运行态的进程在运行过程中, 因为分配的时间片用完了, 于是失去了CPU的使用权限, 运行态就会重新转为就绪态
-
运行态➠➠阻塞态
- 正在运行的进程由于遇到I/O操作或被更高优先级的任务抢走CPU使用权限而无法继续执行, 便从运行态转为阻塞态
-
阻塞态➠➠就绪态
- 处于阻塞态的进程, 若其等待的事情已经处理完毕, 于是进程从阻塞态转为就绪态
二、任务提交的两种方式
1.同步
- 同步是指发送方发送数据后, 等接收方发回响应后才发下一个数据报的通讯方式
- 同步是指两个程序的运行是相关的, 其中一个线程在阻塞需要等待状态, 那另一个线程才运行
2.异步
- 异步是指发送方发出数据后, 不等接收方发回响应, 接着就发下个数据报的通讯方式
- 异步是指两个线程毫无相关, 自己运行自己的
3.例子
-
同步
- 你叫我去吃饭, 我听到了就立即和你去吃饭, 如果没有听到, 你就不停的叫, 直到我告诉你听到了, 才一起去吃饭
- 打电话好比同步, 两边是同时进行不能再打给另一个人
-
异步
- 你叫我去吃饭, 然后自己去吃饭了, 我得到消息后可能立即走, 也可能过会儿走
- 发消息好比异步, 和一个人发完消息就可能和另一个人发消息
三、同步/异步和阻塞/非阻塞
1. 同步阻塞形式
- 效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
2. 异步阻塞形式
如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面。
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
3. 同步非阻塞形式
- 实际上是效率低下的。
想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
4. 异步非阻塞形式
- 效率最高
因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。
比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞。