美團(tuán)校招開獎(jiǎng)了!
大家周末好,我是二哥呀。
昨天晚上,有個(gè)讀者私信給我說,他的一個(gè)師兄,校招拿到了美團(tuán)的 offer,昨天開獎(jiǎng)了,雖然美團(tuán)沒像去年那樣成為香水團(tuán),但師兄仍然感覺非常滿足。
我這個(gè)讀者也非常向往美團(tuán),他今年大三,就順帶問了問師兄有什么學(xué)習(xí)建議給他,師兄給了他一些非常誠(chéng)懇的建議,并叮囑他一定要學(xué)好操作系統(tǒng)。

有一說一,操作系統(tǒng)不管是對(duì)科班還是非科班,我認(rèn)為都是蠻重要的。這么說吧,操作系統(tǒng)是管理計(jì)算機(jī)硬件和軟件資源的程序,是計(jì)算機(jī)的基石。
舉個(gè)例子來講,像 Java 中的并發(fā)編程這塊,如果連進(jìn)程調(diào)度的相關(guān)原理、同步和互斥都搞不懂,那多半會(huì)有兩種結(jié)果:
寫出來的多線程程序出現(xiàn)了各種奇奇怪怪的問題; 不知道為什么出現(xiàn)這些問題。
另外一方面,操作系統(tǒng)的確是校招面試中經(jīng)??疾斓暮诵闹R(shí)點(diǎn)。
講真,大三學(xué)習(xí)操作系統(tǒng)剛剛好,大一大二學(xué)了編程語(yǔ)言、數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)據(jù)庫(kù)等等,有了編程的基礎(chǔ),再啃操作系統(tǒng)這塊硬骨頭就不那么難啃了!這次為了給讀者一個(gè)滿意的答案,我熬了一晚上,認(rèn)真地挑選出來了兩個(gè)操作系統(tǒng)的視頻課程,一個(gè)國(guó)內(nèi)的,一個(gè)國(guó)外的。
先看一門國(guó)內(nèi)的,再看一門國(guó)外的,中西合璧,藥效持久。
國(guó)內(nèi)的推薦哈工大的《操作系統(tǒng)》實(shí)驗(yàn)課,以下四部分最為重要。
1)操作系統(tǒng)基礎(chǔ)篇
https://mooc.study.163.com/course/1000002004?trace_c_p_k2=a79448e7966846a28cde039b6e1d0888#/info
2)操作系統(tǒng)之進(jìn)程與線程
https://mooc.study.163.com/course/1000002008?trace_c_p_k2=edac826e21bc4e5f9dfbccf8966f9727#/info
3)操作系統(tǒng)之內(nèi)存管理
https://mooc.study.163.com/course/1000003007?trace_c_p_k2=8ebbdbee5c764f1eac017d1bde87308e#/info
4)操作系統(tǒng)之外設(shè)與文件系統(tǒng)
https://mooc.study.163.com/course/1000002009?trace_c_p_k2=90017eef3d9e457a9303180d9efd5e6e#/info
哈工大的操作系統(tǒng)課是該校 CS 課程中含金量最高的,尤其是實(shí)驗(yàn)課。八個(gè)實(shí)驗(yàn)涉及到了操作系統(tǒng)的核心部分,雖然 lab 不是在哈工大自創(chuàng)的 HITOS 上,但 linux-0.11 確實(shí)是一個(gè)非常好的選擇。
Linux-0.11 這個(gè)版本能讓學(xué)生更加專注于實(shí)驗(yàn),而不是糾結(jié)于各種奇奇怪怪的問題,作為 OS 入門算是足夠了。
Linux 發(fā)展到現(xiàn)在,內(nèi)核源碼與 0.11 相比,幾乎是翻天覆地的變化,但這不代表研究 linux-0.11 就沒有意義,畢竟內(nèi)核這東西,你懂的。。。
多的不說,學(xué)完 linux-0.11 后,你至少能明白,原來一個(gè)最簡(jiǎn)單的完整的操作系統(tǒng),是這個(gè)樣子的:它是這樣一步步從 BIOS 開始加載程序加載數(shù)據(jù)的,它是這樣實(shí)現(xiàn)單 CPU 多任務(wù)多進(jìn)程調(diào)度和切換的。
Linux 內(nèi)核主要由 5 個(gè)模塊構(gòu)成,分別是:
進(jìn)程調(diào)度模塊,負(fù)責(zé)控制進(jìn)程對(duì) CPU 資源的使用。 內(nèi)存管理模塊,用于確保所有進(jìn)程能夠安全地共享主機(jī)內(nèi)存,同時(shí),內(nèi)存管理模塊還支持虛擬內(nèi)存管理方式,使得進(jìn)程所使用的內(nèi)存比實(shí)際的內(nèi)存更多。 文件系統(tǒng)模塊,用于支持對(duì)外部設(shè)備的驅(qū)動(dòng)和存儲(chǔ)。linux-0.95 版本又逐步實(shí)現(xiàn)了虛擬文件系統(tǒng),該模塊通過向所有的外部存儲(chǔ)設(shè)備提供一個(gè)通用的文件接口,隱藏了各種硬件設(shè)備的不同細(xì)節(jié),從而兼容其他操作系統(tǒng)。 進(jìn)程間通信模塊,用于支持多種進(jìn)程間的信息交換方式。 網(wǎng)絡(luò)接口模塊(linux-0.96 版本才有),提供對(duì)多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問并支持網(wǎng)絡(luò)硬件。
它們之間的依賴關(guān)系見下圖所示。其實(shí)連線代表它們之間的依賴關(guān)系,虛線代表 linux-0.11 中還未實(shí)現(xiàn)的部分。

由上圖可以看得出,所有模塊都與進(jìn)程調(diào)度模塊存在依賴關(guān)系,因?yàn)樗鼈兌夹枰M(jìn)程調(diào)度程序來掛起或重新運(yùn)行它們的進(jìn)程。
linux-0.11 的學(xué)習(xí)推薦《Linux 內(nèi)核完全注釋》,該書對(duì) linux-0.11 的全部代碼文件進(jìn)行了詳細(xì)全面的注釋和說明,能夠讓大家在盡量短的時(shí)間內(nèi)對(duì) Linux 的工作機(jī)制有一個(gè)全面而深刻的理解,為進(jìn)一步學(xué)習(xí) Linux 系統(tǒng)打下堅(jiān)實(shí)的基礎(chǔ)。

高清 PDF 版在 GitHub 上的一個(gè)開源倉(cāng)庫(kù)里可以找得到(附 linux-0.11 內(nèi)核的源碼):
https://github.com/itwanger/JavaBooks#Linux%E5%86%85%E6%A0%B8
我在逛 GitHub 的時(shí)候發(fā)現(xiàn)了這樣一個(gè)倉(cāng)庫(kù):
https://github.com/hoverwinter/HIT-OSLab
作者大四,他的這門操作系統(tǒng)實(shí)驗(yàn)課滿分,打算自己寫一個(gè) OS,就順帶把之前的代碼給開源了出來,希望對(duì)學(xué)習(xí)操作系統(tǒng),以及對(duì)哈工大這門實(shí)驗(yàn)課感興趣的同學(xué)一些參考。
其中 lab1-lab7 給出了修改的部分,lab 8 給出了完整的修改后的 linux-0.11 的代碼。雖然這個(gè)倉(cāng)庫(kù)已經(jīng)有好多年沒有更新了,但仍然有參考的價(jià)值。
作者的那句:“Just coding system,it’s fantastic!”我覺得也蠻給力的。
國(guó)外的強(qiáng)烈推薦 MIT 6.268 這門課(主要研究生級(jí)別),是一門公認(rèn)的硬核課程,一直以來都有很高的知名度,廣受好評(píng),是理論與實(shí)踐相結(jié)合的經(jīng)典。
https://pdos.csail.mit.edu/6.828/2018/schedule.html
不過,在學(xué)習(xí)這門課之前,最好之前有過一些操作系統(tǒng)的基礎(chǔ),比如說上過本校的 OS 課,比如說閱讀過《操作系統(tǒng)導(dǎo)論》這本書,比如說熟悉 C語(yǔ)言和匯編,對(duì)計(jì)算機(jī)組成原理也有一定的了解。
這門課有多牛逼呢?
舉個(gè)例子,以陳波老師為首的上海交通大學(xué)的 IPADS 實(shí)驗(yàn)室可以說是國(guó)內(nèi)最強(qiáng)的操作系統(tǒng)相關(guān)實(shí)驗(yàn)室之一了,而陳波老師等人在讀博階段就完成了 6.828 課程的學(xué)習(xí),并且在此基礎(chǔ)上開發(fā)了 corey 操作系統(tǒng),并發(fā)表了一篇被廣泛引用的論文:Corey——An operating system for many cores。
如果覺得這門課的難度有點(diǎn)大,可以選擇 MIT 的 6.S081(Introduction to Operating System,操作系統(tǒng)導(dǎo)論)這門課,主要針對(duì)本科生級(jí)別。
https://pdos.csail.mit.edu/6.S081/2020/schedule.html
穿插個(gè)小故事,蠕蟲病毒大家有聽說過???他的發(fā)明者 Robert Morris 是 6.S081 的一位授課老師,當(dāng)年 Morris 是康奈爾大學(xué)的一名學(xué)生,寫了一個(gè)小的實(shí)驗(yàn)程序,即蠕蟲病毒,想“測(cè)量互聯(lián)網(wǎng)的規(guī)模”,但怕被抓,為了掩蓋真相,就選擇了在 MIT(麻省理工學(xué)院)釋放蠕蟲病毒,沒想到這個(gè)病毒造成了巨大的影響,Morris 也受到了審判,也許是覺得自己坑了 MIT,Morris 后來就去了 MIT 任教。
6.S081 這門課是基于一個(gè)類似于 Unix,但比 Unix 簡(jiǎn)單得多的一個(gè)教學(xué)操作系統(tǒng) XV6 來講解的,雖然不是原汁原味的 Linux,但對(duì)于理解 Linux 的工作方式和結(jié)構(gòu)是足夠了。
這門課是全英文的形式,video 鏈接里甚至沒有英文字幕,對(duì)于國(guó)內(nèi)的同學(xué)來說,如果英文功底一般的話,很難較好的理解這門課程。
下圖是課程表,里面有 PDF 和 video 鏈接??。

為了減輕大家的學(xué)習(xí)壓力,我在嗶哩嗶哩上找到了這門課的克隆版,但中英文字幕的那種。

哇,有了中英文字幕,學(xué)起來就舒服多了。課程地址我貼一下:
https://www.bilibili.com/video/BV19k4y1C7kA
除了這個(gè),我還找到了一份中文版的在線閱讀文檔,總共有 35 萬字左右,據(jù)作者說,他大概花費(fèi)了 200 個(gè)小時(shí),辛苦勞作的結(jié)果是不僅作者自己的知識(shí)盲區(qū)補(bǔ)全了,也為后來者留下了一筆不可多得的學(xué)習(xí)資料。害,除了能蹦出“牛逼”兩個(gè)字外,我想不到更驚艷的詞匯了!
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/

這門課的一部分會(huì)講操作系統(tǒng)的基本概念,一部分是 lab,幾乎每周都會(huì)有一些編程實(shí)驗(yàn)。
我們都知道,操作系統(tǒng)很重要,那操作系統(tǒng)的學(xué)習(xí)單靠看和聽肯定是不行的,必須配合實(shí)戰(zhàn)來。做實(shí)驗(yàn)的意義就在于能幫我們獲得一些使用和實(shí)現(xiàn)操作系統(tǒng)的實(shí)際動(dòng)手經(jīng)驗(yàn)。
還有xiaofan 的學(xué)習(xí)筆記也是非常值得參考的:
https://fanxiao.tech/posts/MIT-6S081-notes/#11-processes-and-memory

學(xué)習(xí) 6.S081 這門課的目的有三個(gè):
理解操作系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 能動(dòng)手?jǐn)U展一個(gè)小型 OS 能動(dòng)手實(shí)現(xiàn)系統(tǒng)應(yīng)用
我之前有整理過一份操作系統(tǒng)的核心知識(shí)點(diǎn),大家也可以拿來作為參考資料。
有一說一,操作系統(tǒng)確實(shí)難刷,大家在刷的過程中一定要記得多喝水,因?yàn)檫@門課實(shí)在是太干了。說實(shí)話,光是整理這兩門課的過程,我就又 get 到了不少新鮮的知識(shí)點(diǎn)。希望我推薦的這兩門課算是拋磚引玉吧,大家一起沖!
記住一點(diǎn),動(dòng)手很重要,動(dòng)手做 lab 很重要。
參考資料:
https://zhuanlan.zhihu.com/p/251366985
《Linux 內(nèi)核完全注釋》
https://github.com/hoverwinter/HIT-OSLab
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/
http://xiongchen.cc/posts/6.s081-lab-2/

沒有什么使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧?kù)o的港灣,我是不系之舟。
推薦閱讀:
