我,作为计算机的内核,也就是人们眼中所谓的操作系统,是不折不扣的幕后英雄!给大家说说都干了些什么,你们就知道我不是在吹牛了。
随着散热风扇的嗡嗡声响起,我的忙碌生活就开始了。BIOS大哥习惯做甩手掌柜,把里里外外扫一遍发现没什么意外后,就通知CPU,省下的事情,照旧——找内核。然后,睡大觉去了。
CPU是我们这儿的顶梁柱,脑子特好使,几乎从来不犯错误。不过这位同志的缺点就是太缺乏主观能动性,总是不断的问我:“下一步干什么?下一步干什么?”,他不觉得烦,我就要不厌其烦的告诉他。
于是我开始捣鼓硬盘:“小样,醒醒,把Shell给我”。硬盘这伙计懒,虽然记性没话说,但就是磨叽,找个东西要半天。对于我这个忙碌习惯了的人来说,实在受不了,所以我都是告诉他该找什么,然后该忙什么忙什么,反正找到了他会通知我(硬件中断)。或者有时候干脆让他和内存自己嘀咕去(DMA)。不过大家在一起时间长了,彼此也就了解了,有些合作的技巧:比如说我经常让他找东西的时候多找点,相关的、用得到的,一股脑给我(预读取),我都放到内存里(磁盘缓存),省得他麻烦,也省的自己老着急。
内存正好和硬盘正相反,反应快是没话说,但一歇班就全忘干净了。于是还要硬盘一点点的告诉他,累。
几位同事都准备好了,就开始干活。其实我是个演员,不对不对,是管理人员,而且只是个中层管理人员。所以上面还有几个老板(内核程序),还要伺候一大堆客户(用户程序)。
老板好说,所有领导的话都是对的(内核总是假定内核的程序没有错误)、都是重要的、紧急的(内核认为内核的要求都是合理的,应该尽快满足的)。所以都应该是尽量满足。客户的情况就复杂了,经常会有客户想干不能干的事情,而且客户还可能会犯错误。这些都要进行协调,能解决的就尽量解决,实在无可救药的,也只能舍小家,为大家了。(杀进程)
不管是老板还是客户,分配的任务也是五花八门:有的要求反应快,比如Shell和文本编辑程序,但是通常任务不重,也就是显示个字,存个盘啥的,我们管这叫交互式进程;也有任务重的,比如编译程序,但是快点慢点都成,这叫批处理进程;还要得要求隔一段时间就想做点儿什么的,比如计划任务啥的,算是实时进程。总之,根据不同的任务特点,也有不同的应对办法。但是这也要花心思,通过任务过去干过什么来确定他的特点,我们内部管这叫“基于过去行为的启发式算法”。
而我要做的事情就是尽可能地满足所有人的要求!为了完成这个impossible mission,我努力学习、不断总结经验教训,掌握了以下办法:
- 把任务切片。由于CPU同志从来不关心在做什么、也从来不知道下一步要做什么。所以我就让他这个时间段干这个任务,下个时间段干下个任务。这样CPU同志就会分身术了!
- 把内存分页。一个字节一个字节分配内存是会累死人的,而我的办法是把把内存分成4K、4K的一小块,然后按块分配。在此基础上,我还会用4K到4M不同大小的段来分配内存,以便解决内存的碎片问题,这就是著名的“伙伴算法”。
- 学会偷懒。有很多事情不一定立刻要做,比如说有的任务要求在内存里分配个地方,我的办法是让他觉得“貌似”已经分配完了就可以了,至于真正开辟内存空间,还是等他用到这块空间的时候再说吧,一个小小的缺页异常处理就可以搞定。
- 我还会能通过复杂的算法在固定的时间内决定下一个要处理的任务,这对付成百上千的任务时,效果相当好。
- ......
类似这样的工作技巧太多太多了,哎呀,又一个中断响了,我要去忙了,同志们再见!o(∩_∩)o...