CPU ≠ 内存

不妨把外存比作一个大仓库,里面有各种原材料,可以生产不同的东西。而CPU就是进行加工处理的车间。

一般来说,一个时间段,想要生产的东西也就那几样(是确定的,也是有限的,毕竟CPU也是有限的)。

产品确定了,原材料自然也是确定的。而当我们去取原材料,因为外存这个大仓库实在是大,且里面放的是所有的原材料。直接从这里取太过耗时。

所以我们把一个时间段要用到的原材料都放到了一个距离更近的小仓库,也就是内存。生产所需的材料直接从这取好了,大大缩短IO时间。



挂起(Suspend)

挂起是一种主动行为,因此恢复也应该要主动完成。

进程挂起的结果是从内存移到外存,所以挂起

不占内存

因为挂起后还要受到CPU的监督(等待着激活),所以挂起

不释放CPU



如果被挂起的线程任务优先级巨高,就永远轮不到其他线程任务运行。

挂起一般用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。

比如sleep(),不释放锁,占着CPU睡觉。



阻塞(Pend)

而阻塞是一种被动行为,是在请求IO资源时,发生的等待。 IO资源拿到后,自动加入就绪任务队列,等待分配CPU。

因为拿不到IO资源,所以阻塞时会放弃 CPU的占用。

比如wait(),释放锁,释放CPU,等待。


老张爱喝茶,废话不说,煮开水。

出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,立等水开。(同步阻塞)

老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)

老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~ 的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞)

老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

老张觉得自己聪明了。

我们来总结一下,

阻塞即 CPU 等待 IO,且期间不能做其他事情。非阻塞即 CPU 在等待 IO 的期间可以去做其他任务(如 B),当 IO 处理完了任务 A,CPU 再回来继续处理任务 A。

那 CPU 怎么知道 IO 处理的任务完成了呢?有两种方式,一是主动去查看情况,即同步,二是等 IO 处理完后,主动来通知他,即异步。

一般来说,我们不会把阻塞(非阻塞)和同步(异步)拆开来说。所以通常我们说的异步是指异步非阻塞。



版权声明:本文为weixin_37641832原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_37641832/article/details/83217104