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


























