论文投出去了,软件也交付了,上个学期剩下的东西终于完成,但是前面的路却只有更加困难。好像我有一颗单核CPU,而冥冥中给我分配任务的是一台多核心的机器。另一个比喻是,我是网络中一台服务器,需要不停接收和响应来自多个客户端的请求,我响应得越多,就更多客户端向我发出请求。问题就来了:事情不是一件件排着队到达的,却只能一件件去处理,那积压的事情岂不越来越多,永远都做不完?想想CPU和服务器是怎么处理这个问题的,应该会对我们有启发。
先说服务器,同时面对成千上万的请求,它首先拒绝那些恶意的请求,如DDoS攻击等等,然后给每个有效的请求分配一个线程,单独为其服务,互不影响。
而到CPU一级,需要面对的是来自不同进程的指令(群),操作系统调度CPU的方案可以有:
先来先服务:优点是简单,缺点显而易见,如果你到银行排队而前一个人需要将从十个户口分别转十万元到另外十个户口……
时间片轮转:平均分配时间(很短的分段),轮流处理,优点是公平,缺点是排你前面的那个人可能到银行关门都没拿完钱;
长进程/短进程优先:一个是穷人等到饿死,一个是富人等到气死;
优先级机制:给每个进程分配一个优先级,和上面的情况相似,优先级低的永无出头之日……
以上种种方案都有较大的缺陷,Windows采用一种很复杂但是很漂亮的方法:可变优先级+时间片轮转,先给每个进程分配初始的优先级,然后根据进程等待的时间,其优先级线性增加,CPU以时间片轮转方式,服务当前最高优先级者,时间到了,该进程优先级恢复初始值,而新的最高优先级者进入CPU。这样,保证了原本高优先级的进程能轮到更多的机会,而优先级低的进程在等待相对长的时间后也能得到机会。
综合起来,在处理众多任务时,一个好的方法是首先筛选任务,看看哪些必须做,哪些暂时不能做,哪些很想做,哪些不值得做;然后给每个任务设立单独的推进计划和记录。分配时间则要模仿Windows方式,每天主要时间做重要任务,也要留时间给次要任务。
说倒很简单,做起来就容易当局者迷。譬如,备考GRE已经是很高优先级的任务了,但是各种留学指导经常强调论文和项目等等更重要,于是我前几天都在忙这两件事,备考的工作也就被一再推迟,已经到危险的地步了。现在看来,我之前是用了固定优先级的方法来分配时间,差点饿死了低优先级的进程。现在意识到这个问题希望不会太迟。那么,你是怎么做的呢?
P.S.以上CPU调度方案完全凭记忆描述,如有差错,概不负责……