进程、事件循环的一个类比

Posted by hstk30 on August 5, 2021

进程、事件循环的一个类比

突然想到一组很好的类比,觉得非常有趣,记录一下。

正文

我租的地方附近有个图书馆,周末就去走走,又体会了一把大学图书馆的感觉。不过西电的图书馆其实平时并没什么人, 去了就可以坐。而且我都是去二楼的阅览室,里面有很多体育杂志、青年文摘… 而且有斜着的桌子,看书更方便, 我感觉我有点怀念我的大学生活了。

家附近的图书馆周末就和西电期末一样,基本上没有“空位”,除了真正学习的人外,放点书、放个书包占座的情况也一模一样。

如果把一个座位比作一个CPU,把一个人比作一个程序,那么,当这个人找到一个座位开始他的学习,就相当于一个进程 开始运行。 如果这个人是一个“学霸”,那么我们就认为这个程序 是一个计算密集型(CPU-bound)的程序,没人会责怪一个“学霸”霸占一个座位, 所以,我们也不会去责怪一个计算密集型程序(假设它是优化完全的)。

但是,总会有那么几个座位,座位上就放着几本书,却不见一人,或者这个人正趴着睡觉(嗯,等他睡醒了就是他回家的时候), 我们就说这个座位没有被完全利用,相当于说这个CPU 没有完全跑满。

  • 如果没有人,这个人可能出去玩了,可能去买饮料了,那么我们认为这个程序 是一个IO密集型(IO-bound)的程序,它占着CPU 没有释放,却没有正在利用CPU ,它block 了。
  • 如果这个人正趴着睡觉,将相当于我们跑了个while True: sleep(60 * 60)

对于第二种情况,基本上是程序 的问题,改一下就完事了。但是对于第一种情况,如果我是一个厚脸皮的爱学习的大恶人兼学霸,那完全没问题, 我一屁股做到座位上,就开始学习了,在这个人还没回来前,我完全利用了这个座位。这个座位满足了我们两个人,且完全利用了这个座位。 但是我确是一个薄脸皮的人,没有别人的同意,我不可能去占这个座位的,于是我就只能在图书馆里转来转去,希望能找到一个空位 (当然,事实是找了一遍后就站着看书了)。当然,图书馆的管理员还是很尽职的,他会观察记录这些“空位”被空了多久,超过了一定时间, 他就会把座位上的东西收拾好,让这个座位空出来。这就相当于操作系统 执行了一个进程调度策略,将资源释放给了其他人(就是我😏)。 但是图书管理员的调度并不可能那么勤快,毕竟,如果一个人真的是去上个厕所,五分钟的时间,回来的时候发现已经被扫地出门了, 那估计这个图书管理员也干不了多长时间。

那是否有其他的策略,使得我这个薄脸皮的人能够在别人出去玩的时候安心的坐上这个位置呢?

一个非常友善的策略就是:这个人在出去玩之前,在桌子上贴了一张字条说,我要两个小时后才会回来,你可以使用这个座位,但不要把我的东西弄丢了。 但是字条太小,我也不可能凑到桌子上去看,所以友善的朋友就和图书管理员说了这个情况。图书管理员认为这是个非常好的策略,就索性自己做了个表格: ready list ,意为这些座位上虽然有东西,但是主人出去了,你可以安心的坐到这个位置上。于是,每次我去图书馆要找座位看书时, 我都去找图书管理员看下他的ready list,有“空位”就安心的坐上去。现在假设这个图书馆的人流还是很多的,那么所有的座位就都被利用起来了。 嗯,如果每天都这样,那这个图书馆可能要考虑扩容了O(∩_∩)O哈哈~。

上面的这个策略就相当于一个采用了IO多路复用事件循环,甚至可以说是采用的epoll ,因为图书管理员也就是操作系统 自己维护了一个表。

结尾

我居然开始用计算机知识指导生活了,真是难以想象。不过生活还是比程序要复杂太多,就算是现在深度学习的不确定性,也难以望其项背。