本文首發於微信公衆號【程序員黃小斜】c++
本文做者:黃小斜程序員
轉載請務必在文章開頭註明出處和做者。面試
本文思惟導圖)本文思惟導圖算法
簡介)簡介編程
學習編程,操做系統是你必需要掌握的基礎知識,那麼操做系統究竟是什麼呢?瀏覽器
這還用說麼,操做系統不就是Windows、Linux、Mac、IOS、Android、IOS這類咱們每天都在用的東西麼?微信
此話不假,可是操做系統做爲計算機科學裏的一門基礎學科,確定不能這麼接地氣對不對,總的來點高大上的概念,震懾一下大家吧。網絡
根據百度百科的介紹,操做系統是管理計算機硬件與軟件資源的計算機程序,同時也是計算機系統的內核與基石。操做系統須要處理如管理與配置內存、決定系統資源供需的優先次序、控制輸入設備與輸出設備、操做網絡與管理文件系統等基本事務。操做系統也提供一個讓用戶與系統交互的操做界面。
這個介紹足夠高大上了吧,那麼到底啥是操做系統呢,簡單來講,操做系統就是管理計算機硬件和軟件資源的一種軟件,計算機裏的硬盤、鼠標鍵盤、顯示器等設備,都要由它來管理,你打開遊戲、打開瀏覽器或者是看電影,也都要經過操做系統來執行。多線程
沒有了操做系統,電腦就失去了靈魂,只是一堆硬件而已。併發
爲何要學操做系統)爲何要學操做系統
瞭解了操做系統的基本概念以後,接下來咱們再來看看,爲何咱們要學習操做系統呢?
首先,固然是由於面試要考啦。
其次,不管你學習什麼編程語言,和都避免不了和操做系統打交道,好比你學習Java,用到多線程技術,實際上操做系統纔是負責管理進程和線程的,因此Java裏的線程經常要和操做系統的線程或者進程一一對應。
此外,你會學習到內存分配的知識,好比c++裏能夠直接分配一段內存,此時其實是調用操做系統提供的API進行內存分配。
操做系統不只負責管理進程和線程的調度、內存的分配和管理,以及設備和IO的處理,還要負責管理文件系統和網絡。
最重要的是,操做系統要負責把代碼從硬盤加載到內存,再告訴cpu去讀取內存代碼,這是一切計算機運行的基礎。
若是不懂操做系統,你在將來學習編程語言的高級特效,涉及到線程進程調度,內存分配,或者是學習Linux相關的知識時,都會一頭霧水,因此,只有學會了操做系統,我麼纔可以更好地學習其餘語言和技術。
如何學習操做系統)如何學習操做系統
第一次接觸)第一次接觸
第一次接觸操做系統一樣是在我研究生的時候,當時自學計算機網絡已經受到了驚嚇(被大部頭教科書勸退),因而學習操做系統時也更加的當心翼翼,當時我找了一本體量稍微小一點的《操做系統》教科書來學習。
用了大概一週左右的時間,我把這本書翻了一遍,隱隱約約還記得一些概念,進程和線程,進程調度算法、內存管理的分頁和分段,頁面置換算法,但其實當時壓根沒有理解這些東西,再過了一週以後也就忘得差很少了。
因爲我當時找的可能是Java方面的實習,不少公司對於操做系統的考察並很少,偶爾就問問線程和進程的區別,
因而對於操做系統的學習我當時並無多大的重視,畢竟還有一堆Java的書要啃呢,先都啃到位再說。
入門學習階段)入門學習階段
就這樣,我一直保留着只看過一本教科書的操做系統水平,全情投入到複習Java的偉業中了,然而當我學到Java併發編程和JVM的時候,總感受有哪裏不對勁:Java中的線程和操做系統的線程是什麼關係,JVM的內存管理和操做系統的內存管理又是什麼關係。
我抱着這個疑問學完了Java併發原理和JVM,固然也是隻知其一;不知其二的那種。過後證實,在沒有操做系統基礎的狀況下,越往上層學,摔得越慘,勿用浮沙築高臺,說的即是這個道理,底子打好了,才能往上爬,不然都是浮雲。
我在百度實習的那段時間裏,再次意識到了操做系統這門課程的重要性,因而我找來了某乎強烈推薦的《深刻理解計算機系統》這本史詩級大部頭,這本書其實並非一本純粹的操做系統書籍,而是結合了計算機組成原理和操做系統兩方面的內容,基本上把計算機內部工做的那些原理都給講清楚了。
第一次看這本書的時候,我堅持了不到三天就放棄了,因而第二次看這本書,我在公司花了快一個月的時間才總算看得差很少。
在之前,我連什麼是x64什麼x86都搞不清楚,看完這本書以後,我好歹對CPU、內存、硬盤的工做方式,以及處理器的工做方式等內容有了一些理解,不得不說,這個時候我纔算是對操做系統入了門。
強化學習階段)強化學習階段
光看書還不足以應對大廠的面試,大公司對操做系統的考察是很嚴格的,好比百度、騰訊和頭條,對於操做系統的要求仍是比較高的。
除了進程和線程區別這種最簡單的面試題以外,還會有一些比較複雜的問題,好比」進程調度算法有哪些,講一下FIFO和LRU算法「、」內存中的分頁和分段有什麼區別,分頁裏的頁面置換算法有哪些,LRU是怎麼實現的「、」產生死鎖的必要條件,解決死鎖的辦法「、」線程間通訊和進程間通訊的方法都有哪些,具體怎麼使用「
此類問題,也算是比較常見的操做系統面試題,可是要回答清楚的話仍是須要必定功力的。
當時我應對這類問題,基本上就是經過刷面經和背答案,對於不少原理性的東西理解得並不深入,可是也沒有找到什麼解決辦法。
衝刺階段)衝刺階段
既然本身學了半天效果都不佳,那不如直接向大佬學習吧,因而我展轉各大博客,技術社區,技術公衆號,看了不少關於操做系統的文章,發現確實有不少講的不錯的內容,看起來比本身死記硬背要靠譜的多了。
最先看的優質內容是《碼農翻身》做者劉欣老師的文章,真的是相見恨晚,他有十幾篇文章是專門講解操做系統的,從CPU開始,講到內存、硬盤、線程、進程,每篇文章都是用故事化的文字介紹這些計算機裏最硬核的觀念,能夠說是四兩撥千斤了。
看完這個系列的操做系統文章以後,我對於操做系統中的一些疑惑基本上也都消除了,再回去看一看那些面試題,以爲也沒那麼複雜了。
固然了,對於面試題咱們仍是要認真準備的,該翻的面經要翻,該搞懂的面試題一個也不能放過,有了以前的基礎以後,再去搞懂這些面試題就簡單不少了,至此,我對於操做系統的學習也算是告一段落。
推薦資源)推薦資源
書籍)書籍
《深刻理解計算機系統》 《操做系統導論》
總結)總結
關於操做系統的學習,咱們就講到這裏了,若是還有什麼疑問也能夠到我公衆號裏找我探討。
對了,你想問我文章裏提到的書籍和視頻去哪找?我已經給你準備好了
以上資源均可以避免費領取,在個人公衆號【程序員黃小斜】回覆「操做系統」便可領取對應的資源。