英文原文:
how a course in operating systems changed me
在普林斯頓大學有很多課程改變了我,就像cos 318(作業系統課程)。它極有挑戰,耗時耗力,但是當我學完後回頭想想,我很慶幸我選了這門課。
我當初選擇這門課程的時候很猶豫,因為周圍的人都這麼說:
這門課毫無疑問非常難,但是不妨暫時放下你之前聽到的對它的偏見。不學它並不會毀掉你軟體工程師的生涯,但是如果你真的學過了它,你將會在很多方面獲得啟發。我選擇作業系統課程之前其實十分討厭系統底層程式設計,也很害怕參加這門課程。但是現在來看,我覺得選擇它是我做過最正確的決定之一。下面是我認為這門課程對我作為學生,作為軟體工程師和作為問題解決者所帶來的啟發:
我的經驗和啟發都是基於普林斯頓2023年秋季的cos 318課程來說的,但是這對其他本科作業系統課程也都適用。
毫無疑問,在寫乙個作業系統的時候,我們需要非常非常多的除錯。如果你覺得你在演算法課上的除錯已經夠難了,那你可以想想如果兩次除錯會產生完全不同的結果該是多麼令你抓狂。
當你寫的作業系統慢慢變得異常複雜了之後,你就不得不去尋找順手的除錯(debug)工具和一套科學合理的除錯方法了。
在參加這門課之前,我覺得除錯就是隨手做一做的事情,根本不是寫程式的乙個正規環節。以往我除錯的方法都是把所有我認為可能出錯的地方都修改一遍看看,這是一種毫無技巧可言並且讓人感到無聊的過程,我通常稱之為「橡膠雞除錯法」(rubber chicken debugging)。在作業系統課程結束之後,除錯從一門藝術變成了一門科學。我開始意識到原來存在一種科學省時的方法能夠迅速精確地定位錯誤(bug),並決定應該採用什麼樣的修復方案。
這種除錯方法在其他的課程或者經歷中也十分有用。比如,我在facebook做實習生的時候,我十分接受「親力親為」這樣的**工程理念。如果有些部分除了問題,那麼就要立刻開始標記記錄日誌,然後一直記錄檢視,直到乙個地方記錄的結果和你所期望的結果出現了不同(這就是錯誤出現的地方)。這種思維方式只有那種高強度的程式設計課程,類似作業系統課程,才能給你的。
作業系統課程突然讓我意識到了**的效能問題。如果這個程式執行很慢,我就會停下來想一下:到底是什麼是制約效能的關鍵因素?cpu?記憶體?硬碟i/o?理解了這些基礎的東西讓我在高層次程式設計的時候讓**更快,更簡練。
人們通常都認為作業系統課程只有在底層程式設計的情況下才會有用。但是事實上並不是這樣,只有用c和彙編寫過作業系統**的人才能夠更好地駕馭高階語言。
我們的作業系統課程有一些協作完成的專案,兩個同學一組。我十分幸運在協作專案中和我兩個好朋友一起工作。這種一起面對困難的經歷讓我們成為更好的朋友,也讓整個班級同學的聯絡更加緊密。
由於有這些協作專案,我們變得更加善於合作。團隊工作很容易陷入這麼一種模式:乙個人編寫**,另外乙個坐在旁邊看寫**。在作業系統課程上,我們的做法更加高效:兩個人分別負責不同模組的實現,然後互相檢查對方的**。團隊合作同時也增強了我們版本控制的能力,這是乙個好的實際應用git的機會。
這是乙個年輕程式設計師面臨的最顯著也是最難解決的問題:當我們遇到問題的時候,常常陷於費曼演算法(feynman algorithm)
把問題寫下來
努力去想…想不出來繼續努力想…想…努力…努力想…
寫下來答案
採用這個方法讓我作業系統前一部分的專案苦不堪言。這門課讓我不得不去找乙個科學的解決問題的方案。我最後想到了一種通用的做程式設計專案的方案,而且我把這個方法也用到了其他的計算機課程上了。它包括三個步驟:
① 任務:在這個專案中我需要完成哪些目標?我非常看重任務驅動,所以在安排我工作的時候,我會做乙份清單,上面有一些劃分成小塊的任務目標。拿烘焙蛋糕打個比方:
買雞蛋買牛奶買麵粉
洗碗洗鍋
洗勺預熱爐子
給鍋塗脂
把雞蛋,牛奶和麵粉混合成麵糊
把麵糊鋪到平底鍋上
把平底鍋放到爐子上
② **錯誤(bugs):有哪些**中的錯誤是已知的?在這個步驟中,我會跟蹤**錯誤和一些我嘗試修復的東西。在早期的專案裡,我把時間都浪費到了重複嘗試可能的解決方案上和頻繁遇到一樣的**錯誤上了。頻繁追蹤產生的**錯誤和修復方案能夠在接下來的專案中節約我很大一部分時間。
③ 問題:我有什麼問題?在這部分,只要我遇到了問題,我都會把它們大致記下來。當我翻閱文件或者詢問同學獲得答案之後,我就會把我學到的知識記錄在這。
有這麼乙個**讓我對我所做的專案抱有很大的信心。如果沒有它,我可能現在還在花大量的時間在實驗室裡,雖然也可能有進步,但絕對沒有我現在進步得這麼明顯。
作業系統課程確實是一門有挑戰性的課程,但是還是建議能夠參加這門課。它是我成為軟體工程師路上提高最大的一門課。如果即使你學完之後甚至都不記得什麼是虛擬層(hypervisor )了,你也會感謝它教會你的其他東西。
作業系統課程是如何改變我的
普林斯頓大學有很多課程改變了我,就像cos 318 作業系統課程 它極有挑戰,耗時耗力,但是當我學完後回頭想想,我很慶幸我選了這門課。我當初選擇這門課程的時候很猶豫,因為周圍的人都這麼說 這門課毫無疑問非常難,但是不妨暫時放下你之前聽到的對它的偏見。不學它並不會毀掉你軟體工程師的生涯,但是如果你真的...
作業系統是如何啟動的
作業系統啟動過程分為bios執行和bootloader執行兩個步驟 一 bios程式執行過程 執行過程 在cpu加電之後,會把cpu所有暫存器的值設為預設值,除了cs暫存器的值改為0xffff,其他暫存器的值都為0,這樣,根據cs 和 ip的值就可以找到指令的實體地址0xffff 0x0000。這時...
作業系統課程設計 模擬作業系統
程序管理主要包括程序排程,程序的建立和撤銷 程序的阻塞和喚醒,中斷作用的實現。用全域性變數模擬重要暫存器,如cpu重要暫存器,程式狀態暫存器psw 指令暫存器ir,程式計數器pc,資料緩衝暫存器dr等。中斷的發現應該是硬體的工作,這裡在函式cpu中加檢測psw的方式來模擬。在cpu 函式中,每執行一...