有时看到别人或自己在安排和处理事情上陷入混乱时,我脑海里都忍不住想到系统调度算法,一直想写一下调度算法对我们日常处理事情的启发,今天终于动笔,本文就结合操作系统调度算法,以日常生活做事安排为例,看看是否有值的借鉴的地方。
一、概述
学计算机的基本都学过《操作系统》这门课程,里边关于调度算法的章节让人印象深刻,我想也许最初设计调度算法的人也是根据自己日常生活中对任务的安排和处理经验而设计的算法。
例如要对所有要做的事情进行管理(记录到便签纸等)、要对任务的重要性及优先级排序(应该先做哪件事)、处理中遇到阻塞或依赖项等待时的任务切换(不能干等啊,通知完就干别的,定期检查下对方完事没)、任务处理完毕后的状态变更(TODO便签划掉)等。
我们现在每个人都很忙,每天面对的信息量、要处理的事情都很多,如何更好地安排计划、管理进展,这其实都是对我们自己时间和任务的调度;而如何规划未来、设定目标、并执行落地,其实就是对我们人生的调度。
二、调度算法与生活
常见调度算法如下:
1.先来先服务算法(FCFS)
很多人都用 To-Do 清单来管理自己的任务,老板每交代你一个新的任务,你就把它写到清单的最下面,然后你按照从上到下的按顺序一件一件完成这些事,这就是 FCFS 算法。你应该明显能感觉到这里面的问题,我们做事是要分轻重缓急的,而且很多事你不知道完成它到底需要多久,万一一直没完成,你单子里下面的事是不是也跟着都完成不了,这显然是不行的,明天估计就毕业了。
2.短作业优先算法(SJF)
老板给你安排事情以后,你肯定要预估一下每件事的完成时间,哪件事用的时间最短就最先做哪件事,这就是 SJF 算法。这里又有明显的问题了,万一这件事用时很长但又很重要,那你可能永远都没机会去完成,好了别说了,又毕业了……
为啥这些算法这么傻呢?别急,这只是开胃菜,毕竟设计操作系统的人一开始也没想的那么完备。
3.优先权调度算法(FPF)
很好理解,就是哪件事的优先级最高就先做哪件事。这下你学会了,老板给你安排任务之后,你不仅预估了时间,还预估了一下这件事的重要程度,列了个优先级。按找优先级来一件件完成,这样这下总没错了吧。
然鹅,又有问题了,你本来在做用户调研,结果老板明天要去开会,让你今晚把参会演讲的 PPT 做一下,显然这个 PPT 的优先级更高,但是呢调研刚做了一小半也很重要,这时候就要分两种情况了:如果你就一根筋要先做完一件事才能再做下一件事,那么你就得今天把用户调研先赶完,然后加班去做 PPT,很惨。第二种情况,你思路灵活,肯定先给老板做 PPT 要紧啊,三下五除二把 PPT 做完了,结果老板一看,“不行,这里得改”,结果你改了一天,加班……很惨。本来想着说第二天把调研做完,没想到老板又让你去一同参会,显然这件事情的优先级又比调研高,那你又思路灵活的去参会了,没想到回来当天老板问你要调研报告,你拿不出来,好了,你又毕业了,again!
很惨,经过第三次毕业你明白:优先权调度算法的问题就在于你要做的那件事很有可能一直被优先级更高的事情抢占。
4.高响应比优先调度算法(HRRN)
这个算法可以说是采纳前 3 种之长,兼顾了任务的优先级,也不会让任务有一直拖着没完成的情况。具体来说,除了任务本身的优先级之外,还通过“响应比”来计算任务的优先级,不要怕这个名词,通俗简化下:
响应比 =(已经拖了多久 + deadline)/ deadline
可以看出,你拖的越久,这个任务的优先级越高,很有可能就超过你当前任务的优先级。还是刚才那个栗子,你发现用户调研报告拖了 3 天了,优先级已经比参会更重要,所以你参会当天就抽时间挤时间去做报告,晚上免不了加班,很惨,但总算没毕业。
5.时间片轮转调度算法(RR)
经过上边的几种算法,你已经对任务如何安排处理轻车熟路,很快就升职加薪迎娶白富美当上了CEO,这时又有问题了……假如你相同优先级的事有很多呢?毕竟大老板了,手底下 10 个团队,你肯定都要兼顾,任务齐头并进的时候,你怎么办?时间片轮转法你可以试一下。
一周 5 天工作日,假设每天按上下午分的话,你正好有 10 整块的时间。你的 To-Do list 里列了 10 项任务分别是跟每个团队交涉,具体交涉需要的时长你没法预估,所以你就每个半天,集中处理一个团队的事情,这就是时间片轮转算法,轮转的是你清单里的任务,“时间片”是一个时间区间,每个时间片结束后如果任务没有完成,就继续把它放到清单的末尾,下次去轮转。这样就保证了每个团队每周都能有一个半天去协调安排工作(尽管可能存在没有交涉完的情况,但你保证了雨露均沾)。
6.多级反馈队列调度算法(MLFQ)
这个算法就厉害了,集上面所有算法优点于一身,还避免了它们的问题。具体是这样的,它把任务分成多个清单,而不是都统统扔进一个单子里(队列理解成任务清单就行)。这个几个清单按优先级分别是:重要且紧急,重要但不紧急,紧急但不重要,不重要也不紧急。
这里有几个点:
- 直接给清单设置了优先级。
- 同时,每个清单还要设置时间片大小,随着优先级的降低,时间片也越长。
- 当你接到一个任务时,首先放到优先级最高的清单(放的顺序你可以参考前面的算法 4),如果该任务在一个时间片内没有完成,那么它自动放到优先级次高的清单。同理,如果一直没完成就会被放到优先级最低的清单里。
- 仅当上一级清单清空之后,再去执行下一个优先级的清单任务。
是不是第三点你很疑惑,万一放到最后一个清单,你事情岂不是一直完不成?你别忘了,优先级越低的清单时间片越长,你有更多的时间去集中攻克一个任务。
基本上 MLFQ 算法是兼顾各种因素的较好的算法了,保证了短任务很快完成、重要任务优先完成、拖延的任务能集中精力完成,是不是很完美。不知道你有没有看过《无压工作的艺术》这本书,这个算法和书中的内容几乎契合。这本书中说 5 分钟之内能做完的事,就赶紧做完,不让它占用大脑的“内存”,做完就可以完全置诸脑后。如果需要超过 5 分钟来完成,就把它列在清单里,之后抽专门的时间再统一分配,相关理念还是很值得借鉴的。
三、总结
调度算法有很多,这篇文章粗浅的介绍了一些操作系统常用的调度算法,还有很多其他方面的调度算法有待大家去探索,比如负载均衡之类的算法,就是你一个人实在忙不过来了怎么办。
最后的“多级反馈调度”算法目测是最符合我们人处理事情思维的,但还是要结合自己的习惯,变法很多很灵活,本文只是做个简介,具体的灵活运用全看你了。
除了调度算法,其他很多计算机算法的思想,也都可以运用在生活中,以后有机会再整理。
yan 9.6
参考: