為什麼要學操作系統?

本人大三,自打進入大學,就聽師兄和老師們叮囑:學好操作系統! 可現在我處於的狀況是,是為了學好操作系統而學它,而且各大公司都很關注這方面的技能,並不是真正的清楚其中的意義何在。 相信很多同屆的朋友都有這疑問,因此提出,望大神指點,小弟深表感謝! ps:小菜正初學Android應用開發。
————————————————————
我們應用層程序猿,為什麼要去深入了解進程作業調度、存儲管理、IO驅動管理之類的這些操作系統層的細節呢?


1、開眼界

作為最常見的複雜軟體,操作系統包含了時序與分時等時間相關的經典案例,又是介面與抽象方面的極佳例子,涵蓋了常見軟體開發中所可能遇到的大部分場景。

弄懂了操作系統解決問題的思路,將來遇到問題就不至於兩眼一抹黑。

2、打基礎

真正做起工程就會知道,很多很多問題是操作系統相關的。

比如說,做一個網路代理軟體,不過是從socket上收一個包然後轉發給另一個socket而已,這好像和操作系統沒多大關係吧?

但真做了,你會發現,用一個線程處理網路IO,只要寫對了,那麼哪怕系統壓力很大,只要CPU頂得住,就可以保證引入的延遲總是在幾個毫秒之內;但如果用了多線程分別處理收/發,那麼只要網路壓力稍大,引入的延遲就會增加,很快額外延遲就可能突破幾十個毫秒(這實際上已經完全不能用了)。

想搞明白這是為什麼,對操作系統調度原理、時間片等概念沒有足夠深刻的理解,是不可能的。

尤其是,當你突然遇到類似「系統壓力一大網路延遲急劇升高」的bug時,如果對操作系統沒有深入理解,你連準確描述都做不到,連查資料、求幫助都不知道該往哪個方向努力,更不用說debug了。

——應用層開發的確只需要接觸冰山在海面上的可見部分;但這隻夠你開發一些蹩腳的軟體;冰山藏在海面下的9/10,和冰山的可見部分畢竟是一體的:浮於表面的軟體同樣會影響冰山的不可見部分、並被冰山的不可見部分影響。如果沒有基本了解,當冰山的不可見部分透過可見部分坑到你時,你絕沒能力為這些蹩腳軟體debug。

————————————————————

類似的,完全不懂何謂文件系統、何謂目錄樹的用戶,一樣可以用windows上網、辦公。但一旦出了問題,他就只能求人幫忙——而且必須上門,因為你給他說怎麼怎麼操作,他是不可能聽懂的(同樣的,如果不上門,只聽他描述,你也絕對聽不懂他遇到了什麼問題:我能說自己已經被這種人坑了無數次了嗎)。


比如多線程或者多進程編程,如果連進程調度的相關原理、同步和互斥都不知道,那多半會有兩種結果: 1. 寫出來的多線程或多進程程序出現各種奇奇怪怪的問題; 2. 不知道為什麼出了這些問題。

再比如由於I/O的限制,對及時性要求高的web應用有時需要用到非同步,理解非同步就需要對緩衝概念、用戶態、內核態等一些操作系統的原理有所了解。

這只是兩個栗子,操作系統管理著硬體資源、你寫出來的程序也是它在調度。換句話說,應用程序從創建到裝進內存、被cpu執行,以及讀取硬碟數據、使用印表機等設備,一切的操作都不可能自己獨立完成,都需要經過操作系統這層抽象。如果你都不懂操作系統在這過程中做了什麼,又怎麼可能寫出好的程序來呢?你說是吧?


一個真正的理科生也許只是從他的大學專業開始起步,但是一定會慢慢地把從物理學到數學中間所有的學術分支都去探索一遍的


當你設計一個:
業務複雜 OR 數據量大 OR 訪問量大 OR 響應時間短
的系統,你會發現你就是在設計一個操作系統。


師傅在教拳腳功夫,也在教練氣法門。

如上述某些答案所言,大俠沒那麼多,普通人也就是強身健體,別說練武了,能會一套花架子都能混個不錯的職位。

但這不妨礙老師孜孜不倦地告訴學生們,有年少得意和大器晚成兩種英雄,你們喜歡哪一個?

這就是選擇的自由:你不喜歡底層,照樣可以畢業;你不喜歡本專業,照樣可以去干自己想乾的工作;甚至你不喜歡自己老婆了,還可以離婚。

這是選擇的自由,當然選擇也必然有諸多後果和擔當。

個人很喜歡當初實習單位的一句標語,做最擅長的,其餘的外包


如果你真心喜歡什麼東西,不需要別人催促,自己都會求知若渴,這才是真愛。


看你想當什麼樣的程序員了。如果只想當一個普通的程序員其實很多課都不用上。這個問題從兩個角度來看吧,不懂技術的馬雲也能在網際網路業成功,所以說技術和在工業界的成就不等價。挺多技術和工業界相距甚遠,導致很多人覺得空有一身屠龍術也是事實。不過如果想做一個技術上過硬的程序員的話OS還是挺必要的。別人都說的挺好的了,我就不展開講了,因為也算不上什麼高手。

update: 開發一個flappy bird一樣的app確實不需要上OS。


1.操作系統還是比較重要的,舉個不恰當的梨子,人在地球上跑,還是要了解地球的
2.學操作系統最好的辦法不是跟課堂,而是自己去實現一個,此理適用於編譯原理等系列計算機課程
3.造輪子太花時間的話就去調用系統給的各種介面,調著調著,也許就懂了

最後總結一下,學技術多實踐,搞研究多看別人的東西(怎麼感覺自己一點都不贊同後面一句呢?為了對稱寫的,嗯,一定是的)


你以後寫應用層的程序是運行在操作系統之上的,操作系統內部是一個很複雜的環境,不管寫的程序再怎麼好,都將要面對各種系統級問題出現的可能,而面對這些系統層級的問題減少畏懼、快速定位的好辦法,就是把操作系統的內部操清楚。總之,掌握一些操作系統層相關知識,對你以後程序猿進化絕對是有好處的。 至於會遇到什麼樣的問題,學習了,實踐了之後自然會接觸到。經歷才會知道痛,那時將悔不該當初,所以題主花點時間學習學習是沒有壞處,除了操作系統方面,還有再掌握一些TCP/IP協議的知識等等等。對你寫出好的應用層的程序很有幫助。總之……覺得沒有幫助,摺疊我吧233333333!


個人理解。
構建操作系統的方法論(尤其是對資源和時間的平衡,效率和穩定性的平衡)對構建任何應用層的架構設計都是極為重要的參考原則,尤其是大規模的企業級應用。


如果你只是想成為一個只會寫寫 Java、寫很挫的應用層業務邏輯、折騰折騰應用 UI 的 Low B 碼農。Okay,你當然不用去學 操作系統。現在安卓這麼缺人,隨便找個工作不成難事。
一切都只是個人選擇而已嘛。
有些人發自內心地喜歡這件事,就去精通它,摸透它的一切,或是無法容忍自己從事的領域竟然有自己不會的東西,成為一名 Full Stack Developer。
搞計算機的,跟操作系統脫不了干係,即便是做應用的。就看你希望自己做到什麼程度了。


只說一句話,你可以不造輪子,但是你要知道怎麼造輪子。等你懂這句話的時候發現真他娘的對。


學習OS的目的並不是讓你手寫內核(當然能手寫那更好),而是當你的應用需要跟系統api打交道的時候,例如進程/線程、網路,你知道它怎麼回事,並且能運用正確。

還有,如果你的應用規模變大之後,也會變成一個系統,其中的一些設計就可以借鑒操作系統中的一些設計。系統不僅僅包含操作系統,還有資料庫或者分散式系統。操作系統中的設計也是從其它系統中借鑒的。


因為學操作系統的時候,你會遇到一些很實際的問題,會見識到一些很精妙的解決方案。然後你的眼界就開闊了,然後就不會被所謂的熱門技術所蒙蔽。等你遇到網路非同步處理,什麼事件驅動等名詞的時候你就可以輕輕一笑,不就是像epol/kqueuel一樣的搞嘛,你以為你還真能像微軟搞個IOCP啊。


昨天我在看tcpip實現,我對象問我,你們工作用這個么,為什麼看?我說不用,裡面好多思想工作中都可以借鑒,還有你知道了底層是怎麼實現的,你的程序有問題了,你可以很輕鬆的知道問題出在哪裡。


如果你寫的應用程序如果不是單機版,而是需要用到網路連接和多用戶場景。那麼你需要考慮:
1-你的應用程序如何處理用戶和伺服器通信;
2-是如何建立連接?
3-是基於進程還是線程為客戶端提供服務?
4-大量的鏈接過來你的內存是否夠用,如果不夠用你會怎麼辦,是直接加內存,不管用機制去處理(就像1+2+3+……100,你是一個個的累加,還是用高斯公式呢?)還是學習原理然後看自己能否在優化他呢?
5-CPU是否能夠更快處理任務?你會等一個網頁載入20秒還沒有出來等等一大波問題-----比如你老闆人讓你寫個內存池,你會怎麼辦?
這一系列的問題你能夠回答麽?如果不能,學os原理可以可以告訴你,畢竟你還是希望寫出來的東西讓更多的人用才會有意義和價值吧!所以呢?堅持學下去吧!會有很大的收穫的


只搞搞簡單的android應用開發那去個培訓機構就行了,何必去上大學呢
等你想深入研究android framework,研究ndk的實現的時候,你就知道操作系統,編譯原理,網路這些的作用了。
知乎上有知友說過,計算機知識具有網狀特性,需要穩紮穩打,融會貫通。
ps:搞android開發的連android源碼都看不懂你還好意思說自己是搞android開發的么


能找到一份好工作。

其實比較推薦有目的性的學習,當你不知道為什麼要學的時候就不要去學,不要聽什麼先打基礎再搞開發,感覺這句話好扯,難道人人都要數學,物理,電路,演算法,彙編,c,計算機組成,操作系統,網路,資料庫……哪來那麼多鳥東西,當你覺得你缺什麼知識時就學什麼,或者你意識到哪裡不足時,這樣學習才有效率。

欣賞這句話,借來一用。——通往真理的道路千千萬,世界上根本沒有什麼必學,也沒有什麼操作系統,你所需要的,只是在前進的道路上保持一顆不屈的決心。


就一句話,為什麼張無忌能夠輕鬆練就 乾坤大挪移 這種常人需要幾十年才能練到2,3層, 就因為他之前用幾年時間學會了 九陽神功 ,你現在就在練 九陽神功的路上,等你九陽神功練就了,乾坤大挪移在別人需要幾十年才能練成的 你也可以練會,加油!


你在編程的時候不斷的使用操作系統給你提供的介面,如果不了解操作系統的工作原理怎麼可以胸有成竹的使用這些調用呢,你的程序使用的一起資源都是操作系統管理的,知道操作系統如何管理才能編出正確,更重要的是,高效的程序。
就像操作系統程序員一定要懂硬體一個道理,最基本的你要搞懂上層本層和下層的東西。
有時你還想讓自己的軟體更具競爭力,比如你希望自己的app的service更堅挺,那一定要知道安卓如何管理進程和內存,甚至可能的話你還會想能不能走i/o的空子。
其實,不需要知道為什麼要學。因為你編程時反覆在用操作系統的知識時,自然就知道要學,是吧?


我就舉個最簡單的例子,不懂 OS,你是理解不了 https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript 之中 METAL 那個東西的槽點的。學 OS 的作用是爲了讓你站在更高的角度,更全面地去理解計算機系統。這不能保證讓你寫出更好的程序,而且「增加瞭解」本身也不是易於量化的指標。所以除了看不懂別人講的笑話,如果你只寫 Ring 3 或者 Web App 的話,不懂 OS 當然沒有影響咯。


推薦閱讀:

什麼系統更適合數值計算?
編寫 Windows 操作系統的工作量有多大?
VirtualBox 與 VMware 應如何選擇?
vMotion的實現原理是怎樣的?
OS X Yosemite 正式版目前有哪些問題(bug)?

TAG:互聯網 | 程序員 | 操作系統 | Android開發 | 計算機科學 |