
本文思維導(dǎo)圖

簡介學(xué)習(xí)編程,操作系統(tǒng)是你必須要掌握的基礎(chǔ)知識,那么操作系統(tǒng)到底是什么呢? 這還用說么,操作系統(tǒng)不就是Windows、Linux、Mac、IOS、Android、IOS這類我們天天都在用的東西么? 此話不假,但是操作系統(tǒng)作為計(jì)算機(jī)科學(xué)里的一門基礎(chǔ)學(xué)科,肯定不能這么接地氣對不對,總的來點(diǎn)高大上的概念,震懾一下你們吧。 根據(jù)百度百科的介紹,操作系統(tǒng)是管理計(jì)算機(jī)硬件與軟件資源的計(jì)算機(jī)程序,同時(shí)也是計(jì)算機(jī)系統(tǒng)的內(nèi)核與基石。操作系統(tǒng)需要處理如管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序、控制輸入設(shè)備與輸出設(shè)備、操作網(wǎng)絡(luò)與管理文件系統(tǒng)等基本事務(wù)。操作系統(tǒng)也提供一個(gè)讓用戶與系統(tǒng)交互的操作界面。
這個(gè)介紹足夠高大上了吧,那么到底啥是操作系統(tǒng)呢,簡單來說,操作系統(tǒng)就是管理計(jì)算機(jī)硬件和軟件資源的一種軟件,計(jì)算機(jī)里的硬盤、鼠標(biāo)鍵盤、顯示器等設(shè)備,都要由它來管理,你打開游戲、打開瀏覽器或者是看電影,也都要通過操作系統(tǒng)來執(zhí)行。 沒有了操作系統(tǒng),電腦就失去了靈魂,只是一堆硬件而已。 為什么要學(xué)操作系統(tǒng)了解了操作系統(tǒng)的基本概念之后,接下來我們再來看看,為什么我們要學(xué)習(xí)操作系統(tǒng)呢?首先,當(dāng)然是因?yàn)槊嬖囈祭病?/section>其次,無論你學(xué)習(xí)什么編程語言,和都避免不了和操作系統(tǒng)打交道,比如你學(xué)習(xí)Java,用到多線程技術(shù),實(shí)際上操作系統(tǒng)才是負(fù)責(zé)管理進(jìn)程和線程的,所以Java里的線程常常要和操作系統(tǒng)的線程或者進(jìn)程一一對應(yīng)。此外,你會學(xué)習(xí)到內(nèi)存分配的知識,比如c++里可以直接分配一段內(nèi)存,此時(shí)實(shí)際上是調(diào)用操作系統(tǒng)提供的API進(jìn)行內(nèi)存分配。操作系統(tǒng)不僅負(fù)責(zé)管理進(jìn)程和線程的調(diào)度、內(nèi)存的分配和管理,以及設(shè)備和IO的處理,還要負(fù)責(zé)管理文件系統(tǒng)和網(wǎng)絡(luò)。最重要的是,操作系統(tǒng)要負(fù)責(zé)把代碼從硬盤加載到內(nèi)存,再告訴cpu去讀取內(nèi)存代碼,這是一切計(jì)算機(jī)運(yùn)行的基礎(chǔ)。如果不懂操作系統(tǒng),你在未來學(xué)習(xí)編程語言的高級特效,涉及到線程進(jìn)程調(diào)度,內(nèi)存分配,或者是學(xué)習(xí)Linux相關(guān)的知識時(shí),都會一頭霧水,所以,只有學(xué)會了操作系統(tǒng),我么才能夠更好地學(xué)習(xí)其他語言和技術(shù)。如何學(xué)習(xí)操作系統(tǒng)第一次接觸第一次接觸操作系統(tǒng)同樣是在我研究生的時(shí)候,當(dāng)時(shí)自學(xué)計(jì)算機(jī)網(wǎng)絡(luò)已經(jīng)受到了驚嚇(被大部頭教科書勸退),于是學(xué)習(xí)操作系統(tǒng)時(shí)也更加的小心翼翼,當(dāng)時(shí)我找了一本體量稍微小一點(diǎn)的《操作系統(tǒng)》教科書來學(xué)習(xí)。 用了大概一周左右的時(shí)間,我把這本書翻了一遍,隱隱約約還記得一些概念,進(jìn)程和線程,進(jìn)程調(diào)度算法、內(nèi)存管理的分頁和分段,頁面置換算法,但其實(shí)當(dāng)時(shí)壓根沒有理解這些東西,再過了一周之后也就忘得差不多了。 由于我當(dāng)時(shí)找的多是Java方面的實(shí)習(xí),很多公司對于操作系統(tǒng)的考察并不多,偶爾就問問線程和進(jìn)程的區(qū)別, 于是對于操作系統(tǒng)的學(xué)習(xí)我當(dāng)時(shí)并沒有多大的重視,畢竟還有一堆Java的書要啃呢,先都啃到位再說。 入門學(xué)習(xí)階段就這樣,我一直保留著只看過一本教科書的操作系統(tǒng)水平,全情投入到復(fù)習(xí)Java的偉業(yè)中了,然而當(dāng)我學(xué)到Java并發(fā)編程和JVM的時(shí)候,總感覺有哪里不對勁:Java中的線程和操作系統(tǒng)的線程是什么關(guān)系,JVM的內(nèi)存管理和操作系統(tǒng)的內(nèi)存管理又是什么關(guān)系。 我抱著這個(gè)疑問學(xué)完了Java并發(fā)原理和JVM,當(dāng)然也是一知半解的那種。事后證明,在沒有操作系統(tǒng)基礎(chǔ)的情況下,越往上層學(xué),摔得越慘,勿用浮沙筑高臺,說的便是這個(gè)道理,底子打好了,才能往上爬,否則都是浮云。 我在百度實(shí)習(xí)的那段時(shí)間里,再次意識到了操作系統(tǒng)這門課程的重要性,于是我找來了某乎強(qiáng)烈推薦的《深入理解計(jì)算機(jī)系統(tǒng)》這本史詩級大部頭,這本書其實(shí)并不是一本純粹的操作系統(tǒng)書籍,而是結(jié)合了計(jì)算機(jī)組成原理和操作系統(tǒng)兩方面的內(nèi)容,基本上把計(jì)算機(jī)內(nèi)部工作的那些原理都給講清楚了。 第一次看這本書的時(shí)候,我堅(jiān)持了不到三天就放棄了,于是第二次看這本書,我在公司花了快一個(gè)月的時(shí)間才總算看得差不多。 在以前,我連什么是x64什么x86都搞不清楚,看完這本書之后,我好歹對CPU、內(nèi)存、硬盤的工作方式,以及處理器的工作方式等內(nèi)容有了一些理解,不得不說,這個(gè)時(shí)候我才算是對操作系統(tǒng)入了門。 強(qiáng)化學(xué)習(xí)階段光看書還不足以應(yīng)對大廠的面試,大公司對操作系統(tǒng)的考察是很嚴(yán)格的,比如百度、騰訊和頭條,對于操作系統(tǒng)的要求還是比較高的。除了進(jìn)程和線程區(qū)別這種最簡單的面試題之外,還會有一些比較復(fù)雜的問題,比如”進(jìn)程調(diào)度算法有哪些,講一下FIFO和LRU算法“、”內(nèi)存中的分頁和分段有什么區(qū)別,分頁里的頁面置換算法有哪些,LRU是怎么實(shí)現(xiàn)的“、”產(chǎn)生死鎖的必要條件,解決死鎖的辦法“、”線程間通信和進(jìn)程間通信的方法都有哪些,具體怎么使用“此類問題,也算是比較常見的操作系統(tǒng)面試題,但是要回答清楚的話還是需要一定功力的。當(dāng)時(shí)我應(yīng)對這類問題,基本上就是通過刷面經(jīng)和背答案,對于很多原理性的東西理解得并不深刻,但是也沒有找到什么解決辦法。沖刺階段既然自己學(xué)了半天效果都不佳,那不如直接向大佬學(xué)習(xí)吧,于是我輾轉(zhuǎn)各大博客,技術(shù)社區(qū),技術(shù)公眾號,看了很多關(guān)于操作系統(tǒng)的文章,發(fā)現(xiàn)確實(shí)有很多講的不錯(cuò)的內(nèi)容,看起來比自己死記硬背要靠譜的多了。最早看的優(yōu)質(zhì)內(nèi)容是《碼農(nóng)翻身》作者劉欣老師的文章,真的是相見恨晚,他有十幾篇文章是專門講解操作系統(tǒng)的,從CPU開始,講到內(nèi)存、硬盤、線程、進(jìn)程,每篇文章都是用故事化的文字介紹這些計(jì)算機(jī)里最硬核的觀念,可以說是四兩撥千斤了。看完這個(gè)系列的操作系統(tǒng)文章之后,我對于操作系統(tǒng)中的一些疑惑基本上也都消除了,再回去看一看那些面試題,覺得也沒那么復(fù)雜了。當(dāng)然了,對于面試題我們還是要認(rèn)真準(zhǔn)備的,該翻的面經(jīng)要翻,該搞懂的面試題一個(gè)也不能放過,有了之前的基礎(chǔ)之后,再去搞懂這些面試題就簡單很多了,至此,我對于操作系統(tǒng)的學(xué)習(xí)也算是告一段落。
|