大家好,我是軒轅。
操作系統(tǒng)是計(jì)算機(jī)類(lèi)專(zhuān)業(yè)都會(huì)學(xué)習(xí)的一門(mén)課程,但很多人都反饋,大學(xué)里面學(xué)不了什么,基本都是靠自學(xué)。
今天跟大家深度聊一下,操作系統(tǒng)這門(mén)課,怎么學(xué),才能更牛逼?
一、做好前置功課
千萬(wàn)不要一上來(lái)就啃書(shū),學(xué)任何課程之前,都需要做好功課:
位于整個(gè)計(jì)算機(jī)技術(shù)知識(shí)體系的哪個(gè)位置,有哪些相關(guān)聯(lián)的課程?
學(xué)了這門(mén)課有什么用?如果一上來(lái)直接就啃書(shū),一不小心就會(huì)掉入枯燥的技術(shù)名詞海洋中,什么也學(xué)不進(jìn)去。
操作系統(tǒng)這門(mén)課程,講的就是這個(gè)計(jì)算機(jī)的大管家,是如何管理程序的運(yùn)行,以及如何管理計(jì)算機(jī)硬件資源并提供接口給程序使用的一門(mén)計(jì)算機(jī)基礎(chǔ)課程!
因此,操作系統(tǒng)的核心,就是由下面這些東西構(gòu)成的:
管理程序運(yùn)行:線程管理、進(jìn)程管理
管理網(wǎng)卡資源:網(wǎng)絡(luò)協(xié)議棧
為應(yīng)用程序提供接口:系統(tǒng)調(diào)用
看到了嗎,操作系統(tǒng)書(shū)上每一部分東西都不是憑空而來(lái)的,大家在學(xué)習(xí)到操作系統(tǒng)每一個(gè)章節(jié)的時(shí)候,都要清楚的知道,學(xué)的這一部分東西是做啥的?只有清楚自己在操作系統(tǒng)學(xué)習(xí)海洋中的位置,才不會(huì)迷失方向。
二、選擇幾本好書(shū)
準(zhǔn)備工作做好了,接下來(lái)就是要選擇幾本好的學(xué)習(xí)教材。
在這里我一定要說(shuō)幾句了!?。?/span>
大家一定要區(qū)分好一個(gè)概念:操作系統(tǒng)理論和具體的操作系統(tǒng)實(shí)現(xiàn),這是兩碼事情!
同一個(gè)操作系統(tǒng)機(jī)制,不同的操作系統(tǒng)實(shí)現(xiàn)可能完全不同,一定要弄清楚書(shū)上寫(xiě)的那些東西是操作系統(tǒng)的理論,還是某個(gè)操作系統(tǒng)(比如UNIX)中的實(shí)現(xiàn),不要以為UNIX是這么做的,所有操作系統(tǒng)就都是這樣,這就走入誤區(qū)了!
操作系統(tǒng)理論書(shū)籍中也會(huì)捎帶介紹一些操作系統(tǒng)具體的實(shí)現(xiàn),但是只是蜻蜓點(diǎn)水式的,不會(huì)太深入。想要真正了解某一個(gè)系統(tǒng),最好是深入學(xué)習(xí)這個(gè)操作系統(tǒng)的實(shí)現(xiàn)。
如果是偏后端開(kāi)發(fā)的,建議以Linux為重點(diǎn),重點(diǎn)研究Linux下的實(shí)現(xiàn),可順便看一些Windows。
如果是網(wǎng)絡(luò)安全(尤其是二進(jìn)制方向)、客戶端開(kāi)發(fā)的,重點(diǎn)研究下Windows的實(shí)現(xiàn),可順便看一些Linux。
比如同樣是線程,Linux和Windows的實(shí)現(xiàn)有著巨大的差異,比較posix線程和win32線程的實(shí)現(xiàn)差異,從內(nèi)核數(shù)據(jù)結(jié)構(gòu)到應(yīng)用編程接口,學(xué)習(xí)原理和使用的差異,理解線程這個(gè)東西在操作系統(tǒng)中到底是一個(gè)什么樣的存在。
比如內(nèi)存管理,同樣是基于x86下的段頁(yè)式內(nèi)存管理機(jī)制,對(duì)比Linux和Windows的管理實(shí)現(xiàn)差異,缺頁(yè)異常處理、寫(xiě)時(shí)拷貝機(jī)制有哪些異同之處。
又比如系統(tǒng)調(diào)用,線程調(diào)度、中斷處理、異常處理、鎖等等,通過(guò)對(duì)比學(xué)習(xí)二者的差異,你會(huì)對(duì)這些操作系統(tǒng)概念了解的更加深刻,也會(huì)更加體會(huì),理論與實(shí)際的差異所在。
看書(shū)的時(shí)候,不一定非要從第一頁(yè)看到最后一頁(yè),不要這么死腦筋,學(xué)會(huì)靈活應(yīng)對(duì)。如果進(jìn)程管理看不下去,可以先看內(nèi)存管理,同步與異步看不下去就先放著,等其他方面的知識(shí)儲(chǔ)備夠了,再回頭來(lái)看,可能就會(huì)事半功倍。
三、學(xué)習(xí)閱讀源碼
除了看書(shū),另外一項(xiàng)非常重要不可或缺的工作就是閱讀源碼!
大學(xué)里面 很多老師,自己都 沒(méi) 研究過(guò)操作系統(tǒng)實(shí)際 的源碼,你怎么能奢求他們能教會(huì)你呢?
一邊看書(shū),一邊對(duì)照著源碼學(xué)習(xí),這是最直接最高效的學(xué)習(xí)方式。
不要覺(jué)得看操作系統(tǒng)源碼是個(gè)很龐大的工程,自己可能看不下去。首先克服自己心里的恐懼,操作系統(tǒng)也是人寫(xiě)的,又不是讓你一口氣看完,你學(xué)哪一部分,就看那一部分的,沒(méi)有那么遙不可及,等你通過(guò)閱讀源碼get到了書(shū)上寫(xiě)的某個(gè)知識(shí)點(diǎn),那種感覺(jué)是非常舒適的。而一旦你習(xí)慣了這種舒適,就會(huì)形成正向反饋,推動(dòng)你不斷學(xué)習(xí)更多知識(shí),也會(huì)養(yǎng)成通過(guò)源碼學(xué)習(xí)和解決問(wèn)題的良好習(xí)慣。
Linux是開(kāi)源的這地球人都知道,去下載一份源碼到自己電腦上,然后用sourceinsight這個(gè)工具打開(kāi),這個(gè)工具便于查看定位各種數(shù)據(jù)結(jié)構(gòu)、函數(shù)的定義。
比如我用它來(lái)查看Windows XP的源代碼:
閱讀源碼一定要帶著目的性,畢竟,操作系統(tǒng)源碼的規(guī)模是幾千萬(wàn)行級(jí)別。不可能從頭看到尾,學(xué)哪部分就看哪部分。
四、一定要?jiǎng)邮謱?shí)踐
紙上得來(lái)終覺(jué)淺,絕知此事要躬行!
對(duì)于大部分人來(lái)說(shuō),能做到結(jié)合看書(shū)+源碼分析,就已經(jīng)足夠了,對(duì)于操作系統(tǒng)的理解就已經(jīng)達(dá)到一定的深度。
但如果你想有更進(jìn)深一步的學(xué)習(xí),這還不夠!
畢竟,看書(shū)也好,看源碼也好,都是看來(lái)的,操作系統(tǒng)真的就如書(shū)上和源碼中描述的那樣嗎?
我學(xué)習(xí)一個(gè)東西,絕不聽(tīng)信書(shū)上所言,一定要親自驗(yàn)證才為真,這樣留下的印象想忘也忘不了。
那什么叫親自驗(yàn)證?
可以通過(guò)內(nèi)核級(jí)別工具,觀察內(nèi)核中的數(shù)據(jù)結(jié)構(gòu),如系統(tǒng)調(diào)用表、內(nèi)存管理中的全局描述符表GDT、中斷管理中的IDT。去看一下里面到底裝了什么東西,然后嘗試用書(shū)上講解的知識(shí),去解讀這些數(shù)據(jù)結(jié)構(gòu),看看是不是書(shū)上寫(xiě)的那樣。
還通過(guò)內(nèi)核級(jí)調(diào)試工具,跟蹤操作系統(tǒng)系統(tǒng)調(diào)用流程、文件創(chuàng)建過(guò)程、數(shù)據(jù)包處理流程···
甚至更進(jìn)一步,自己手?jǐn)]一個(gè)操作系統(tǒng)!
說(shuō)起來(lái)容易,但是手?jǐn)]操作系統(tǒng)這件事我們真的能做到嗎?當(dāng)然可以,如果我們只是實(shí)現(xiàn)一個(gè)「微型」的操作系統(tǒng)的話,那還是可以實(shí)現(xiàn)的。
都說(shuō)操作系統(tǒng)(簡(jiǎn)稱(chēng) OS ),是 程序員的三大浪漫之一 ,我們經(jīng)常會(huì)用“靈魂、大腦、內(nèi)核、基石”等詞來(lái)形容它,足以見(jiàn)得它對(duì)計(jì)算機(jī)而言有多么重要。最近,我用 3 天的時(shí)間,自己寫(xiě)了個(gè)操作系統(tǒng)。
在手寫(xiě) OS 的過(guò)程中,之前遇到的很多和操作系統(tǒng)密切相關(guān)的疑難雜癥,都找到了答案。比如:
內(nèi)存為什么會(huì)泄漏、服務(wù)進(jìn)程為什么會(huì) dang 掉、文件為什么打不開(kāi)?
網(wǎng)絡(luò)服務(wù)為什么會(huì)掉線?模式靠什么技術(shù)支撐?
Node.js 的 I/O 模型長(zhǎng)什么模樣?
除此之外,在做高性能服務(wù)端編程的時(shí)候,經(jīng)常會(huì)用到內(nèi)存、進(jìn)程、線程、IO 相關(guān)的知識(shí)。
“學(xué)好操作系統(tǒng),能直接解決你在工作中遇到的這些問(wèn)題”。就這一個(gè)原因,它就已經(jīng)是每個(gè)程序員必須好好修煉的“基本功”了。
事實(shí)也確實(shí)如此,作為每個(gè)程序員必須好好修煉的 “基本功 ”, 它能直接解決我們?cè)诠ぷ髦械暮芏嘁呻y雜癥 , 比如做高性能服務(wù)端編程時(shí) ,經(jīng)常會(huì)用到內(nèi)存、進(jìn)程、線程、IO 等相關(guān)知識(shí)。
而且,我一直認(rèn)為,花大量時(shí)間研究 OS 這些底層知識(shí),是很有必要的,雖然短期看不到效果,但卻是 從 0 到 1 必然的過(guò)程 。
學(xué)懂了這些基本功,再去琢磨那些被“追捧”的流行技術(shù)啊、demo 啊,都能輕松地理解背后高級(jí)的設(shè)計(jì),理解系統(tǒng)中的性能瓶頸。
我也很喜歡研究操作系統(tǒng),作為 程序員的三大浪漫之一 , 它雖然枯燥無(wú)聊,卻又存在無(wú)限可能。對(duì)技術(shù)人來(lái)說(shuō),即便為此消耗了大把時(shí)光,費(fèi)盡心力,也是值得。
正如我的偶像 “計(jì)算機(jī)鬼才”彭東 所說(shuō) : "生活可以一地雞毛,但操作系統(tǒng)卻是心中的光" 。
彭東在操作系統(tǒng)上的成就,讓我頗為佩服,他被稱(chēng)為“計(jì)算機(jī)鬼才”,是有原因的。非科班出身,卻憑借驚人的意志與熱愛(ài),自學(xué)微機(jī)原理,編程語(yǔ)言,數(shù)據(jù)結(jié)構(gòu)與算法,翻遍了操作系統(tǒng)和硬件書(shū)籍,獨(dú)立開(kāi)發(fā)了 x86 平臺(tái)下的 LMOS 和 arm 平臺(tái)下的 LMOSEM 兩個(gè)操作系統(tǒng)。
LMOS 現(xiàn)在已經(jīng)發(fā)布 8 個(gè)測(cè)試版本,是多進(jìn)程、多線程、多 CPU、支持虛擬內(nèi)存的全 64 位操作系統(tǒng)內(nèi)核,代碼量足足有 10 萬(wàn)多行。 如此浩大的項(xiàng)目,沒(méi)點(diǎn)“程序員的浪漫”精神,想必很難堅(jiān)持下來(lái) 。
他的書(shū)《深度探索嵌入式操作系統(tǒng):從零開(kāi)始設(shè)計(jì)、架構(gòu)和開(kāi)發(fā)》也曾給了我很多啟發(fā)。
數(shù)十年深入研究操作系統(tǒng),他對(duì) Linux、BSD、SunOS 等開(kāi)源操作系統(tǒng),以及 Windows 的 NT 內(nèi)核都非常熟悉,在編譯器,數(shù)據(jù)庫(kù)等基礎(chǔ)架構(gòu)方面也頗有研究。
可以說(shuō) , 在操作系統(tǒng)領(lǐng)域,他是當(dāng)之無(wú)愧的 KOL,非常有發(fā)言權(quán) 。這條路上,會(huì)有哪些難點(diǎn)和阻礙,會(huì)踩哪些坑,他都了如指掌。
所以,去年聽(tīng)說(shuō)彭東在極客時(shí)間寫(xiě)了一個(gè) 《操作系統(tǒng)實(shí)戰(zhàn)45講》 專(zhuān)欄,非常意外,當(dāng)時(shí)我第一時(shí)間就訂閱了。
最近又開(kāi)始二刷了,再學(xué)一遍還是有很多收獲。最讓我驚喜的是,彭東把 “學(xué)操作系統(tǒng)不要死看書(shū)” 的主張貫穿到專(zhuān)欄里,通過(guò) 配套實(shí)驗(yàn)帶你完成一個(gè)OS ,當(dāng)你真的動(dòng)手寫(xiě)了一個(gè) OS 的時(shí)候,對(duì)操作系統(tǒng)的理解會(huì)是質(zhì)的飛躍。
下圖是彭東梳理的 「簡(jiǎn)化版操作系統(tǒng)知識(shí)體系」 ,圖中的每一小塊,都會(huì)隨著課程的進(jìn)行,逐一展開(kāi),建議先馬后看。
操作系統(tǒng)簡(jiǎn)化知識(shí)體系圖
他會(huì)帶你從 0 到 1,一步步實(shí)現(xiàn)一個(gè)基于 x86 平臺(tái)的 64 位多進(jìn)程的操作系統(tǒng)—— Cosmos,你將 擁有一個(gè)屬于自己的操作系統(tǒng)內(nèi)核 ,對(duì) Linux 內(nèi)核的理解也會(huì)更加透徹。
跟著學(xué)下來(lái),操作系統(tǒng)架構(gòu)設(shè)計(jì)能力會(huì)大幅提升,還可以學(xué)到系統(tǒng)級(jí)別的軟件編程技巧,這對(duì)我們拓展技術(shù)深度和廣度是大有裨益的。
最重要的是, 求職面試也會(huì)成為加分項(xiàng) ,自己動(dòng)手寫(xiě)過(guò)操作系統(tǒng),真有“飄”的資本,簡(jiǎn)歷自然脫穎而出。
原價(jià) ¥199,限時(shí)特惠 ¥139
記得當(dāng)時(shí)這門(mén)課程 上線兩個(gè)月,訂閱量就超 10000 訂閱了,現(xiàn)在已經(jīng) 65000 多人學(xué)習(xí)了 ,這個(gè)結(jié)果其實(shí)并不意外,畢竟,業(yè)界大牛手把手帶著寫(xiě) OS 的機(jī)會(huì)實(shí)在太難得。
我在追更的同時(shí),也不禁佩服,彭東海量的知識(shí)儲(chǔ)備和極佳的表達(dá)能力。要知道,越是底層的知識(shí)越不好講透:要用通俗易懂的語(yǔ)言,把復(fù)雜的操作系統(tǒng)“講”出來(lái);要注意細(xì)節(jié)與重點(diǎn)的把握和梳理;要把復(fù)雜的內(nèi)容,交付給各個(gè)不同思想層次,不同思維方式的人。
隨便截了幾個(gè)評(píng)價(jià),供參考:
不得不說(shuō),彭東太會(huì)講了,不僅把枯燥的原理講得明明白白,講述中還充滿魔力,吸引我深挖下去,這門(mén)課還有幾個(gè)不得不提的特色。
為了方便“計(jì)算機(jī)小白”理解,快速上手實(shí)操,課程中加入了大量的圖示和詳細(xì)的代碼注釋?zhuān)阋钥闯雠頄|的用心,也能感受到他的“內(nèi)功深厚”。
比如下面的虛擬內(nèi)存數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)圖,計(jì)算機(jī)結(jié)構(gòu)示意圖,文件系統(tǒng)框架圖和進(jìn)程狀態(tài)切換流程圖等,篇幅限制,這里僅是冰山一角,專(zhuān)欄中還有大量圖示和知識(shí)導(dǎo)圖。
再比如,課程中的代碼示例,這個(gè)詳細(xì)程度的代碼注釋?zhuān)潜容^少見(jiàn)的。
摘自《操作系統(tǒng)實(shí)戰(zhàn) 45講》第9講
瞧一瞧-Linux的自旋鎖和信號(hào)量如何實(shí)現(xiàn)?
2. 邊學(xué)邊練,對(duì)比分析,強(qiáng)化理解 Linux
在介紹每個(gè)內(nèi)核組件實(shí)現(xiàn)時(shí),都會(huì)先講清原理,再帶你基于設(shè)計(jì)理解去動(dòng)手實(shí)現(xiàn);然后與 Linux內(nèi)核的實(shí)現(xiàn)做前后對(duì)比。既能邊學(xué)邊練,又能幫你從“上帝視角”審視 Linux 內(nèi)核。
3. 配套源碼,真正動(dòng)手“run”起來(lái)
專(zhuān)欄中的每一講,都會(huì)匹配可以工作的代碼,傳在 gitee 上;可以跟著課程一步步實(shí)現(xiàn),也可以直接使用每節(jié)課提供的代碼進(jìn)行調(diào)試,直到最終實(shí)現(xiàn)一個(gè)操作系統(tǒng)。
實(shí)際上,動(dòng)手“run”起來(lái),哪怕只是讀和 clone 老師的代碼,也會(huì)對(duì)操作系統(tǒng)有更深一層的理解。
4. 開(kāi)源計(jì)劃,新的挑戰(zhàn)
為了把課程內(nèi)容實(shí)踐得更好,最近彭東還整了個(gè)“大計(jì)劃” —— 籌備建立一個(gè) 開(kāi)源社區(qū),把 Cosmos 運(yùn)作成一個(gè)開(kāi)源項(xiàng)目 , 專(zhuān)欄的讀者都有望優(yōu)先成為第一批 contributer。
為拋棄歷史包袱,未來(lái)完整的 Cosmos 會(huì)同時(shí)開(kāi)源系統(tǒng)和 CPU 源碼,還會(huì)考慮根據(jù)需求定制芯片。據(jù)彭東透露,他邀請(qǐng)到了非常優(yōu)秀的芯片架構(gòu)師,來(lái)根據(jù)操作系統(tǒng)架構(gòu)特點(diǎn)設(shè)計(jì) CPU,想想就很“浪漫”了!
此外,專(zhuān)欄讀者都可以免費(fèi)加入彭東的 「操作系統(tǒng)交流群」 ,他經(jīng)常在群里答疑解惑,這里還有很多技術(shù)內(nèi)功深厚的大佬,相互交流探討,光看聊天記錄,都能學(xué)到不少。
訂閱后在課程詳情頁(yè),點(diǎn)擊鏈接即可入群
編輯小姐姐也經(jīng)常在群里出沒(méi),鼓勵(lì)督促,可以說(shuō)是伴隨式的學(xué)習(xí)了,我加過(guò)的交流群不少,這個(gè)群確實(shí)非常難得,大佬云集,知識(shí)密度高,氣氛活躍,學(xué)習(xí)體驗(yàn)也很好。
說(shuō)了這么多,來(lái)看看課程各章節(jié)的知識(shí)點(diǎn)和精彩看點(diǎn)吧。
再?gòu)?qiáng)調(diào)一點(diǎn):
原價(jià) ¥199,限時(shí)特惠 ¥139
都說(shuō)程序員 35 歲是個(gè)坎,但其實(shí),有坎的是不上不下、“半瓶水”的人。只要扎實(shí)基礎(chǔ),勤修內(nèi)功,那么無(wú)論是上層開(kāi)發(fā),還是理解前沿技術(shù),都等于加了天然 buff 。
聽(tīng)說(shuō)最近《操作系統(tǒng)實(shí)戰(zhàn) 45 講》的彭東老師又發(fā)起了新一輪的“手寫(xiě) OS 打卡行動(dòng)”,60 天帶你實(shí)現(xiàn)自己的操作系統(tǒng),訂閱專(zhuān)欄即可免費(fèi)參與。
點(diǎn)擊 「 閱讀全文 」, 新人 68 元就能拿下,從 0 開(kāi)始實(shí)現(xiàn)一個(gè)操作系統(tǒng)的夢(mèng)吧!