操作系統(tǒng)沒啥用,不用學了
程序員張大胖學了幾天操作系統(tǒng),感覺模模糊糊的,說它有用吧,又不知道哪里有用,說它沒用吧,但是它確實很重要。于是他決定對操作系統(tǒng)做一次采訪。
操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu),計算機網(wǎng)絡(luò)這些大V都住在郊區(qū)的一座座別墅中,前來拜訪的程序員很多,但是只有操作系統(tǒng)的門前冷冷清清。
張大胖按了門鈴,說明來意,操作系統(tǒng)把他請進客廳,張大胖環(huán)顧四周,只見客廳懸掛著一個巨幅的毛筆字:抽象和接口的最佳范例
張大胖搞不懂這是什么意思, 問道:“操作系統(tǒng)先生,你這副字是什么意思啊,太抽象了吧。”
操作系統(tǒng)很得意:這個嘛,還是計算機網(wǎng)絡(luò)懂我,把我的精華都寫到這副字中了:文件是對I/O設(shè)備的抽象, 虛擬存儲器是對內(nèi)存+文件的抽象,進程是對CPU+虛擬存儲器的抽象, socket是對TCP/IP的抽象。
張大胖心想 socket應(yīng)該是計算機網(wǎng)絡(luò)的東西,也被操作系統(tǒng)給霸占了,不過TCP/IP棧是在操作系統(tǒng)內(nèi)核實現(xiàn)的,也說得過去。
操作系統(tǒng):接口就是open ,create, write,allocate這些東西了, 我把一切都當作文件來處理了,非常精妙吧!
(詳情參見:《上帝托夢給我說:一切皆文件》)
張大胖:可是這些東西都是一些概念,和實際的編程關(guān)聯(lián)不大啊!
操作系統(tǒng)有些不滿:你們現(xiàn)在這些程序員,只知道去隔壁刷LeetCode,刷面經(jīng),哦對了,還會學個什么爪哇,派森,做幾個項目,然后就去面試了,這樣下去是要壞事的。
張大胖心中不爽:這不是很正常的操作嗎!
“這樣吧,我讓看看我操作系統(tǒng)到底有什么東西,到底有什么用處!” 操作系統(tǒng)請張大胖上了二樓。
上了二樓,第一個房間上寫著“進程管理”,里邊堆著進程,線程,競爭條件,屏蔽終端,TSL指令, XCHG指令 優(yōu)先級反轉(zhuǎn)問題,信號量,互斥量,有限緩沖問題,哲學家進餐問題,讀者-寫者問題,死鎖問題,進程調(diào)度算法等一大堆資料。
操作系統(tǒng):你看看,如果你不懂我的線程,不懂搶占/調(diào)度,怎么可能寫出高質(zhì)量的并發(fā)程序?
張大胖反駁:我在JVM中也學了線程的狀態(tài)和調(diào)度, 如何加鎖,如何避免死鎖,我覺得寫Java程序足夠了啊!
操作系統(tǒng):別提JVM那小子,把我都給屏蔽了!讓程序員變得越來越懶,都不看底層了。你不看底層,怎么知道鎖是怎么實現(xiàn)的?Java 的CAS是怎么實現(xiàn)的?用了什么硬件指令?
張大胖笑道:面經(jīng)里都有啊!不過我一直好奇,類似哲學家進餐問題,讀者寫者問題有啥用啊?
操作系統(tǒng):這些看起來沒用的東西展示的都是進程同步原語的精髓啊,哲學家進餐問題,對于互斥訪問有限資源的競爭問題,在多進程之間分配多個資源不會出現(xiàn)死鎖和饑餓的問題,非常有用。讀者-寫者問題,為一個共享數(shù)據(jù)的讀寫建立了模型。你是程序員,如果你理解了這些,工作中的很多類似的并發(fā)問題你自己就可以解決了,不用再看網(wǎng)上那些云里霧里的文章了。
張大胖:我工作中遇不到這樣的問題,如果遇到了,我就到網(wǎng)上搜類庫,調(diào)用類庫!誰還自己寫啊!還有,這進程調(diào)度算法,什么輪轉(zhuǎn)調(diào)度,先到先服務(wù),最短任務(wù)優(yōu)先,優(yōu)先級調(diào)度...... 到底有啥用?
操作系統(tǒng):你要學習其中的思想啊, 你做Web服務(wù)器負載均衡的時候,是不是也要用到輪轉(zhuǎn),最少鏈接,按優(yōu)先級這些方法? 沒有最好的策略,關(guān)鍵是平衡,要在有限的資源和有限的時間內(nèi)做出平衡,這也是設(shè)計大型系統(tǒng)的基本思想,你覺得沒用?
張大胖:我從來不設(shè)計大型系統(tǒng)!
操作系統(tǒng)已經(jīng)面露怒色,但他還是耐著性子,帶著張大胖來到了隔壁房間:存儲管理。
張大胖探頭一看,這里邊堆著內(nèi)存保護,虛擬地址空間,分頁,頁表,頁面置換算法,系統(tǒng)顛簸,工作集,寫時復(fù)制,內(nèi)存映射文件..... 一大堆讓人看不懂的東西。
張大胖撇撇嘴:沒有一個有用的!
操作系統(tǒng)隨手拿起一個虛擬地址空間的圖片:你看看,這個進程的虛擬地址空間,多重要啊,理解了它才可能去理解可執(zhí)行文件的格式,程序的鏈接,程序的裝載..... 我為了給每個進程都營造一個假象,讓他們有一個虛擬的地址空間,可是費了很大的勁,在背后又分段又分頁,做虛擬內(nèi)存和物理內(nèi)存的映射......
張大胖:操作系統(tǒng)先生,你說的這些我在編程中都用不到。
操作系統(tǒng)很無奈,又拿起內(nèi)存映射的資料和寫時復(fù)制的資料,說到:Kafka在消費消息的時候會用到零Copy,很多Web服務(wù)器(如nginx)利用sendfile來實現(xiàn)文件快速發(fā)送, Redis在持久化的時候,使用寫時復(fù)制技術(shù), 難道它們都沒用嗎?
張大胖:會用Kafka,Nginx,Redis不就行了,了解這么深干嘛?
操作系統(tǒng)氣不打一出來:那你在性能監(jiān)控的時候用過Linux 上的命令vmstat吧,你不懂得存儲管理,進程管理,肯定看不懂吧。
張大胖:我沒用過這個命令哦!
操作系統(tǒng):作為一個程序員,你難道連一點好奇心都沒有嗎,難道你就不愿意了解一下系統(tǒng)的工作原理?
張大胖:實話實說,好奇心肯定是有滴,只是這些東西吧,太枯燥,我看不下去。
操作系統(tǒng)說:唉!我在一樓還有兩間房子,分別是文件系統(tǒng),I/O系統(tǒng),你這么渾渾噩噩,不看也罷。我直接帶你到地下一層吧。
地下一層的大廳燈火通明,雖說有不少人,但是很安靜,每個人都非常專注地盯著自己眼前的屏幕。
張大胖問道:他們在干嘛?
操作系統(tǒng):這是一群操作系統(tǒng)的愛好者,他們都在自制屬于自己的操作系統(tǒng)。
張大胖吐了下舌頭,說到:我的媽呀,這事兒我可干不了,我上個廁所先。
然后他一溜煙地溜走了。
操作系統(tǒng)看著他逃跑的背影,嘆了一口氣,在一個小本上寫到:今天接待了第39868個CRUD程序員。
操作系統(tǒng)看著他逃跑的背影,嘆了一口氣,在一個小本上寫到:今天接待了第39868個CRUD程序員。
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】