大家好,我是小北。
今天單獨討論下,如何學習操作系統這個話題。
操作系統發展到今天,已經非常複雜了,像 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 System、6.830 Database Systems、MIT 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源創計劃”,歡迎正在閱讀的你也加入,一起分享。