為什麼要學習作業系統課程?

周進林發表於2014-12-14

幾天前,我和同事在喝咖啡時,提起了我將會在秋季給學生上作業系統課程。他的研究領域是不涉及作業系統的,所以他問我這門課的意義何在?學生們應該從這門課裡得到什麼?這都是一些常規的問題,我想我可以給出合理的答案。我將會在這裡詳細的闡述一下;如果我遺漏了任何重要的回答,請告訴我。

我上一次教作業系統是在2012年。當時這門課在猶他洲(Utah)的學校是一門必修課並且大約有80個學生在上這門課。現在它不再是必修的了,它已經被歸入到一門基於 O’Hallaron and Bryant book的課程。即便如此,現在已經50個學生選了秋季學期的作業系統課,這似乎很合理。這個課程分為兩部分:本科生課程和研究生課程。這雖然不是我最喜歡的安排,但也沒什麼大問題。

也許我應該提一下,一門涉及大量檔案系統hacking的OS課程是我對電腦科學感興趣的原因所在。之前我已經儘量嘗試了一些CS課程,但是沒有找到太多有挑戰性的或者有趣的

用一個簡單的案例分析我們我可以推斷,作業系統的意義不是去教會學生怎樣去編寫他們自己的作業系統。第一,這裡有些學生對作業系統有興趣並能編寫一個作業系統。他們不需要看課堂上的資料就能夠很好地編寫自己的作業系統。第二,我們也有一些學生沒能力實現一個新的的作業系統或者對實現新的作業系統沒興趣的。他們同樣不需要課堂上的資料。

那麼,意義何在呢?

併發

編寫併發程式碼並不容易,特別是使用執行緒共享記憶體和執行緒鎖。然而,現在很多學習電腦科學的學生都會在他們以後的職業生涯的某些時候使用到(併發)。在OS課程以外的課程裡學習併發問題已經成為了一種增長的趨勢,但即便如此,作業系統是學生首次瞭解執行緒,競爭,死鎖等等重要概念的傳統課程。教材很難(實際上很簡單的,但運用起來很難),在畢業前多看幾次是很有幫助的。一個可靠的併發程式設計介紹對學習作業系統課程是有很大好處的。

資源管理

硬體層次上的資源通常是專用的。作業系統提供了這些資源的種類,它們可以是虛擬的(每個使用者都有種錯覺,自己擁有資源的一份備份)或者是仲裁的(一次只能有一個使用者佔有資源,但由作業系統來安排訪問順序)。允許多使用者訪問專用物理資源是一個很基本的策略並被運用到很多使用者級別的程式中。通過詳細地學習這些內容,學生學會了能夠在許多其他場合重用的模式。

效能分析和衝突解決

正如“為什麼#*$是我的機器分頁?”。當資源被分享時,衝突通常也會隨之而來。衝突問題可以使用多種方式來解決,比如使用佇列,合理共享,或者使用優先順序。在某些情況下,比如CPU排程,沒有單一技術解決方案並且最後的解決方案是一些古怪的混合技術。有時,最令人感興趣的是找出導致問題出現的主要原因是哪一類衝突。我花費了夏天的一大部分時間去找出所有Windows NT導致MP3跳過的原因。作業系統課是學習這些理論的完美課程,它的適用性比電腦科學更廣泛。

隱藏複雜性的介面

一個具有良好設計的介面是一個美妙的東西。它更美妙的地方體現在把一個討厭的低層次介面(調變解調器或者NE2000卡)轉換為一個實用高效的高層次抽象介面(套接字流)。學生應該已經在教材裡關於抽象資料型別那部分接觸過這些想法了,給定的例子一般都是比較普通的,並且抽象化和隱藏複雜性的作用在那個層次裡不夠明顯。我認為把像套接字(socket),檔案系統和地址空間這些集合合到一個單一便利的包裡可能是電腦科學10大貢獻之一了。這是司空見慣的事,以至於很容易讓人忽視它的迷人之處。

沒什麼神奇的

從使用者模式(user mode)看,很容易發現OS是一個神奇的東西–它提供了流暢的多工處理,高效擦儲存管理等。–不好的–它會出現藍屏,系統顛簸,安全問題和排程異常。對於一般使用者來說,這個模式是好的。但在另一方面,如果你想去證明你是一個電腦科學家,你需要知道這些問題的幕後細節。你將會從那裡發現什麼?很多時候,這看起來都是一些令人憂愁的集合,比如單調的連結串列,狡猾的啟發式資源和維護不當的裝置驅動程式。好的OS課程應該教會學生這些:

  • 在核心的程式碼很優秀,你只需要知道到哪裡找到它們。當你第一次看到它們時,你不一定會理解它們。但你理解了它們,你就會學得更多。
  • 通常,核心程式碼都是很普通的程式碼。任何人都可以編寫它,對比於使用者模式程式碼(user-mode code),核心程式碼(kernel code)僅需要多一點對細節的關心和注意,因為核心程式碼中的bug造成的結果更嚴重。

處理大型軟體

這是毫無疑問的,陷入別人的幾百萬行程式碼庫中去是一個噩夢。錯誤零散的文件,殘舊和廣泛的介面,糟糕的互動,和費解的錯誤資訊。不過,歡迎回到現實世界,我們不能因為這些糟糕的問題就經常重新開始。作為一個學生,如果你能夠開始制定一個系統的方法去學習你需要用程式碼修復的大軟體的相關部分,那麼你以後的生活就會輕鬆很多。你可以討厭Linux核心但它比你以後的職業生涯會遇到的軟體好多了。

計算機系統設計

設計任何的工程系統,包括軟體系統,都是一個權衡的過程。是要側重於可靠性?效能?消耗還是維護性?因為作業系統是很龐大的,效能至關重要的程式,它一般都要維護幾十年,所以它們是學生學習這類權衡的很好的地方。擁有一雙發現合適設計點的銳利眼睛的學生在工業上是很需要的。這些人更像一個藝術家而不是一個科學家,你需要看大量的程式碼,理解這些問題,和學會自己獨立考慮這些問題。

總結

我已經嘗試去說清楚,一門OS課程不僅僅是關於作業系統和給UNIX/Windows/MacOS的使用者提供知識。優秀的OS課程教會你對廣泛使用的作業系統的思考技巧和方式,即使你從沒接觸過一行的核心程式碼。實際上,在我的大學裡獲取學位的CS學生不要求一定要上OS課程,但我覺得,所有真正的電腦科學家要麼是已經學這麼課,要麼已經用其他方式學會了這方面的技巧和直接

相關文章