Windows系統技術的研究
潘愛民,2008.5.23
最近兩年來,一直在鑽研Windows系統技術,之所以做這件事情,源於兩年前的一個想法,我想看看Windows系統到底是怎麼響應使用者請求的,特別是當系統效能表現很差的時候,更想知道應用程式和作業系統在忙些什麼。
一個看似簡單的想法,在實現過程中走了不少彎路,前前後後有許多名來自國內最好學校的大學生和研究生跟我一起探索。真的要感謝他們,要不然我未必能堅持下來。
從某種程度上,我感覺差不多已經實現了當初的想法,雖然仍有不少細節尚待完成,但那已經不很重要了。我們有了一套比較系統化的方法,可以揭開許多謎團。每當發現一些意想不到的問題根源的時候,那種感覺真的很好。下面是兩個很有意思的例子,寫出來跟大家分享。
(1) 在我的一台電腦上,每當進入一個目錄的時候,視窗總要停滯好一會兒,有時候,右鍵菜單也有這問題。這給我的感覺很不好,我下決心要找到原因。可重現的問題總是不難尋找根源,尤其對於有好奇心和耐心的人而言。後來我們發現,這是因為有一個檔案類型關聯到一個遠程路徑上,而遠程路徑所指的那台機器已經不存在了。所以,每次當Explorer處理這種檔案類型時(比如顯示表徵圖、增加有關的功能表項目等),發出的遠程請求都要等到逾時,如果遠程請求發生在使用介面執行緒中,那麼介面停滯也就不可避免了。
(2) 有一天深夜在家,我的系統在搜尋無線網路的時候發生極不正常的現象,而且不可重現,幸好,我當時開啟了我們開發的一個工具,把那段紀錄資訊拿下來分析,半自動半手動地很快找到了原因。在Windows底層的一個驅動程式中,有一個5000次的迴圈,在迴圈中,它檢查一個標記值然後睡眠1毫秒。但是我可以清楚地觀察到,迴圈中實際的睡眠時間總是15或16毫秒。所以,程式碼本身的意圖是執行5000*1ms=5秒,但實際執行時間超過了5000*15ms=75秒。至於為什麼Sleep(1ms)變成了Sleep(15ms),我只做簡單解釋。在現代作業系統中,線程調度精度差不多都在10ms以上,多核版本的Windows XP是15ms。
鑽研的過程非常有樂趣,我們搞清楚了Windows底下的線程們是如何協作做事情的。抓住這些要點,我相信,大多數異常行為我們都有可能解釋清楚,但如何自動完成做並非易事。
其實我寫的程式非常少,但是我們對於程式的理解在不斷加深,最初我特別關注調用棧(call stack),到後來更加關注系統全域的協作,一步步的經驗積累,讓我們不斷地化解系統的複雜性。向系統的複雜性挑戰,非常有意思!
除了沿著已有的作業系統實現來考慮問題,我們也在研究和思考現代作業系統的發展和變革。畢竟硬體技術的飛速發展,使得個人電腦的系統內容發生了質的變化。多核處理器和64位系統的普及,將會帶來挑戰和機遇。
順便提一下,根據這幾年的工作經曆,我發現精通系統技術的人才太少,無論是學生還是工業界的從業人員,都鮮有碰到者,或許是因為我接觸人太少的緣故。我很希望能做些工作來帶動一些人,但似乎個人的努力總是很渺小。如果在校學生對系統技術很有興趣,也有不錯的基礎,我很願意跟你們交流。