我,作為計算機的內核,也就是人們眼中所謂的操作系統,是不折不扣的幕后英雄!給大家說說都干了些什么,你們就知道我不是在吹牛了。
隨著散熱風扇的嗡嗡聲響起,我的忙碌生活就開始了。BIOS大哥習慣做甩手掌柜,把里里外外掃一遍發現沒什么意外后,就通知CPU,省下的事情,照舊——找內核。然后,睡大覺去了。
CPU是我們這兒的頂梁柱,腦子特好使,幾乎從來不犯錯誤。不過這位同志的缺點就是太缺乏主觀能動性,總是不斷的問我:“下一步干什么?下一步干什么?”,他不覺得煩,我就要不厭其煩的告訴他。
于是我開始搗鼓硬盤:“小樣,醒醒,把Shell給我”。硬盤這伙計懶,雖然記性沒話說,但就是磨嘰,找個東西要半天。對于我這個忙碌習慣了的人來說,實在受不了,所以我都是告訴他該找什么,然后該忙什么忙什么,反正找到了他會通知我(硬件中斷)。或者有時候干脆讓他和內存自己嘀咕去(DMA)。不過大家在一起時間長了,彼此也就了解了,有些合作的技巧:比如說我經常讓他找東西的時候多找點,相關的、用得到的,一股腦給我(預讀取),我都放到內存里(磁盤緩存),省得他麻煩,也省的自己老著急。
內存正好和硬盤正相反,反應快是沒話說,但一歇班就全忘干凈了。于是還要硬盤一點點的告訴他,累。
幾位同事都準備好了,就開始干活。其實我是個演員,不對不對,是管理人員,而且只是個中層管理人員。所以上面還有幾個老板(內核程序),還要伺候一大堆客戶(用戶程序)。
老板好說,所有領導的話都是對的(內核總是假定內核的程序沒有錯誤)、都是重要的、緊急的(內核認為內核的要求都是合理的,應該盡快滿足的)。所以都應該是盡量滿足。客戶的情況就復雜了,經常會有客戶想干不能干的事情,而且客戶還可能會犯錯誤。這些都要進行協調,能解決的就盡量解決,實在無可救藥的,也只能舍小家,為大家了。(殺進程)
不管是老板還是客戶,分配的任務也是五花八門:有的要求反應快,比如Shell和文本編輯程序,但是通常任務不重,也就是顯示個字,存個盤啥的,我們管這叫交互式進程;也有任務重的,比如編譯程序,但是快點慢點都成,這叫批處理進程;還要得要求隔一段時間就想做點兒什么的,比如計劃任務啥的,算是實時進程。總之,根據不同的任務特點,也有不同的應對辦法。但是這也要花心思,通過任務過去干過什么來確定他的特點,我們內部管這叫“基于過去行為的啟發式算法”。
而我要做的事情就是盡可能地滿足所有人的要求!為了完成這個impossible mission,我努力學習、不斷總結經驗教訓,掌握了以下辦法:
- 把任務切片。由于CPU同志從來不關心在做什么、也從來不知道下一步要做什么。所以我就讓他這個時間段干這個任務,下個時間段干下個任務。這樣CPU同志就會分身術了!
- 把內存分頁。一個字節一個字節分配內存是會累死人的,而我的辦法是把把內存分成4K、4K的一小塊,然后按塊分配。在此基礎上,我還會用4K到4M不同大小的段來分配內存,以便解決內存的碎片問題,這就是著名的“伙伴算法”。
- 學會偷懶。有很多事情不一定立刻要做,比如說有的任務要求在內存里分配個地方,我的辦法是讓他覺得“貌似”已經分配完了就可以了,至于真正開辟內存空間,還是等他用到這塊空間的時候再說吧,一個小小的缺頁異常處理就可以搞定。
- 我還會能通過復雜的算法在固定的時間內決定下一個要處理的任務,這對付成百上千的任務時,效果相當好。
- ......
類似這樣的工作技巧太多太多了,哎呀,又一個中斷響了,我要去忙了,同志們再見!o(∩_∩)o...