計算機科班學習 OS 的正確姿勢!

大家好,我是小北。

今天單獨討論下,如何學習操作系統這個話題。

操作系統發展到今天,已經非常複雜了,像 Windows、Linux 任意一個都是幾千萬行代碼級別,想靠個人完全搞懂,幾乎是不可能的了。

所以需要先明確一下我們學習的目的,不同的學習目的,適用不同的方法,這裏我僅僅列一下作爲一名開發人員,我們掌握 OS 的幾種目標:

第一種:

知曉 OS 基本概念:看在線課程原理部分的視頻或者看《現代操作系統》之類的書,可大致知道OS的概念;

第二種:

理解OS基本原理: 在1的基礎上,完成與 OS 相關的課程練習題,可進一步理解 OS 基本原理,練習題可以參考學堂在線清華OS課程的練習題:

第三種:

掌握 OS 部分核心功能實現(細節):在 2 的基礎上,能夠通過編程完成類似  xv6 的幾個 lab ,

比如 xv6 就會涉及以下模塊:

  • Booting a PC
  • Memory Management
  • Multitasking
  • File system, Spawn and Shell
  • Network Driver

每個模塊代碼量都不會很多,但是麻雀雖小,五臟俱全,通過自己動手實現 thread、spinlock、semaphore 這些東西,會讓你理解更加深刻。

當然,在往上走就是去研究最新 Linux Kernel,研究一些子模塊了,有些還需要閱讀最新的 System 領域論文。

最新的 Linux Kernel  裏有很多新的算法、研究結果不斷的加入。

當然,這就超出了我所能掌握的範疇了哈哈。

不過說實話,如果你還在校大二大三,我真的牆裂建議你去做一些國外的計算機 lab,比如OS、Network。

等到畢業了,幾乎就不太可能從頭開始系統學習那些基礎知識了,除非你能自己閉關兩三年,啥也不做,待在一個地方專心修煉。

好好珍惜在學校大把的空閒時間,做一些讓在專業上讓自己受益一生的事情。

這裏我可以列舉幾個,國內不少喜歡 System 的同學都會去跟 MIT、CMU、UCB 這些計算機名校的課程。

比如 MIT 的 6.824 Distributed System6.830 Database SystemsMIT 6.828 Operating System Engineering .....

xv6

6.828 就是今天要介紹的主角:

MIT6.828:Operating System Engineering

官網主頁:https://pdos.csail.mit.edu/6.828/2020/index.html

在官網,包含了Schedule、Labs、xv6-book 等等。

尤其是 xv6-lab 包含了操作系統中最爲核心的模塊:

每個模塊都搭好了框架,留下最爲核心的部分給我們去實現,你可以把這個看做一種「完形填空」:

  • System Call、Page tables
  • Traps
  • Lazy allocation、Copy On-Write
  • Multithreading、Lock
  • File System、mmpa
  • network driver

如果想看視頻的話可以去 Youtube 或者 B站:

MIT 6.828: Operating System Engineering :https://www.bilibili.com/video/BV1px411E7ST

ucore

如果你想找一個國內的類似 xv6 的 lab,那麼這裏推薦清華大學 ucore OS。

它其實也是起源於MIT CSAIL PDOS課題組開發的 xv6 & jos、哈佛大學開發的 OS161教學操作系統、以及Linux-2.4 內核。

然後清華的老師在這個基礎上,增加、調整了一些代碼,爲清華大學 OS 課程設計的一個lab。

另外,這個課程的很多資料、文檔都是中文的,還有清華老師的配套視頻課程。

清華大學-操作系統:https://www.xuetangx.com/course/THU08091000267/5883104

順便推薦幾本經典的書籍吧:

書名(英文):Operating Systems : Design and Implementation (3rd Edition)

書名(中文):操作系統:設計及實現 (第三版)

原作者:Andrew S. Tanenbaum / Albert S. Woodhull

翻譯者:王鵬、尤晉元、朱鵬、敖青雲

Operating System (操作系統)

書名(英文):Operating System Concepts (7th Edition)

書名(中文):操作系統概念 (第七版)

原作者:Abraham Silberschatz / Peter Baer Galvin / Greg Gagne

另外還有諸如《現代操作系統》、《Operating Systems: Three Easy Pieces》之類的。

尤其是 《Operating Systems: Three Easy Pieces》,閱讀體驗比較好,討論問題由淺入深。

而書名也是很有意思,Three Easy Piece是爲了致敬費曼的關於物理學的書籍:《Six Easy Pieces: Essentials Of Physics Explained By Its Most Brilliant Teacher》。

用作者的話說,操作系統只有物理學一半難,那就叫 《Three Easy Pieces》好了。

Three 也是指代本書三個部分:

  • 虛擬化( Virtualization
  • 併發( Concurrency
  • 持久化( Persistence

操作系統這門課,易學難精,但是掌握到日常編程和麪試夠用還是比較容易的。

那麼畢業生或者說你去準備校招面試應該達到怎樣的水平:

  • OS 四大模塊的理論知識: 進程與線程管理、內存管理、IO與文件系統、設備管理
  • 瞭解 Linux 內核部分實現原理,如內存管理、進程管理、虛擬文件系統等
  • 瞭解和熟悉常用的系統調用已經 System API

其中內存、進程、IO 是重點,這幾塊也是和編程關係最密切的,這裏推薦先挑本偏理論的書看看,瞭解操作系統的全貌:

  • 《現代操作系統》
  • 《操作系統—精髓與設計原理》

不必全看,兩者任選一本都不錯,我自己是仔細看了第二本,因爲是我們教材,同時挑着看了現代操作系統部分章節。

操作系統包含的知識

這部分看完你應該對下面這些話題有一個清晰認知了:

  • 操作系統由哪些構成
  • 進程的狀態、切換、調度
  • 進程間通信方式(共享內存、管道、消息)
  • 進程和線程的區別
  • 線程的實現方式(一對一、多對一等)
  • 互斥與同步(信號量、管程、鎖)
  • 死鎖檢測與避免
  • 併發經典的問題:讀者寫者、哲學家就餐問題
  • 爲什麼需要虛擬內存,MMU 具體如何做地址轉換的
  • 內存爲什麼分段、分頁
  • 頁面置換算法
  • 文件系統是如何組織的
  • 虛擬文件系統(VFS)是如何抽象的
  • ...

但是這還不夠,看完偏理論的書,當面試官問「進程和線程的區別」時。

大概只能回答出「進程是資源分配的最小單位,線程是CPU調度的最小單位,balabala...」這樣正確卻普通的答案。

但是如果你瞭解 Linux 內核的實現,就可以實際出發,講講 Linux 中進程和線程是如何創建的,區別在哪裏。

比如在 Linux 中進程和線程實際上都是用一個結構體 task_struct來表示一個執行任務的實體。進程創建調用fork 系統調用,而線程創建則是 pthread_create 方法,但是這兩個方法最終都會調用到 do_fork 來做具體的創建操作 ,區別就在於傳入的參數不同。

深究下去,你會發現 Linux 實現線程的方式簡直太巧妙了,實際上根本沒有線程,它創建的就是進程,只不過通過參數指定多個進程之間共享某些資源(如虛擬內存、頁表、文件描述符等),函數調用棧、寄存器等線程私有數據則獨立。

這樣是不是非常符合理論書上的定義:同一進程內的多個線程共享該進程的資源,但線程並不擁有資源,只是使用他們。

這也算符合 Unix 的哲學了— KISS(Keep It Simple, Stupid)。

但是在其它提供了專門線程支持的系統中,則會在進程控制塊(PCB)中增加一個包含指向該進程所有線程的指針,然後再每個線程中再去包含自己獨佔的資源。

這算是非常正統的實現方式了,比如 Windows 就是這樣乾的。

但是相比之下 Linux 就顯得取巧很多,也很簡潔。

對於進程、線程這塊你還可以把 fork、vfork、clone 、pthread_create 這些模塊關係徹底搞清楚,對你理解 Linux 下的進程實現有非常大的幫助。

說了這麼多,就是想強調一下理論聯繫實際的重要性。

特別是操作系統,最好的實踐就是看下 Linux 內核是怎麼實現的,當然不是叫你直接去啃 Linux 源碼,那不是一般人能掌握的。

最好的方式是看書,書的脈絡給你理得很清晰。

書籍推薦:

  • 《Linux內核設計與實現》

這本書恰到好處,即講清楚了內核實現的要點,又不會通篇源碼。

這本書重點關注「第 3 章進程管理」、「第 5 章系統調用」、「第12章內存管理」、「第13章虛擬文件系統」、「第 15 章進程地址空間」

這些章節屬於操作系統核心部分,其它如中斷處理、塊 IO、設備管理根據你自己興趣選擇看下就可以了。

基本上做到這裏,操作系統就沒什麼大問題了。

自制OS

另外,如果你還想自己寫一個(模仿) mini os,那麼你需要一些前置依賴知識,否則估計會被很多硬件、彙編知識勸退:

  • 築基內功-- 需要學習計算機原理、C語言(需要熟練運用)、數據結構課程
  • 工欲善其事,必先利其器,掌握以下Linux 下常用命令行:

pwd、cd、find等,1-2 款趁手的編輯器,推薦掌握 vim 的基本操作

gcc、gdb、ld、make等編譯構建鏈、objdump、nm、readif、dd 等 ELF 文件分析、燒錄工具。

這裏只推薦一本我看過的書《操作系統真象還原》,作者實在太好了,所有需要前置依賴的部分他都會簡單的寫個教程,照着這本書就能擼一個屬於自己的 os。

這部分大家感興趣就自己去看好了,在公衆號發自制 OS 文章,我覺得不太合適,因爲實在太多細節了,公衆號不適合做這樣的教程。

截取其中一部分讀者也會看得雲裏霧裏,純碎作者自嗨。

關於自制 OS 後面可以單獨寫一篇文章~


好了,自學 OS 部分就到這裏了。

大家週末愉快~

記得幫我點個贊和在看喲~


本文分享自微信公衆號 - 程序員書單(CoderBooklist)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章