操作系統(tǒng),你到底能干點(diǎn)啥?
大家好呀,我是大白。在這篇文章開始前,先想說一個(gè)事,最近看到有人在知乎上問,不會(huì)操作系統(tǒng)是否耽誤他 CRUD?。我本來想立即反駁他,但是仔細(xì)想了下好像確實(shí)不耽誤!不過由于近幾年互聯(lián)網(wǎng)行業(yè)越來越卷,雖然大部分程序員的實(shí)際工作都是在 CRUD,但是現(xiàn)在只會(huì) CRUD 也不太行了。目前互聯(lián)網(wǎng)行業(yè)追求的高并發(fā)、高可用、高性能的場(chǎng)景下還是需要你有很好的操作系統(tǒng)基礎(chǔ)的,比如高性能服務(wù)端開發(fā)時(shí),內(nèi)存、進(jìn)程、線程、IO 相關(guān)知識(shí)就經(jīng)常用到;再比如做 SRE 也需要對(duì)操作系統(tǒng)有很好的理解才能排查清楚問題到底出在哪。如果你做偏內(nèi)核的,更離不開了。所以,如果你想在程序員的道路上走得更遠(yuǎn),建議還是好好學(xué)下呀!話再說重點(diǎn)就是如果你不希望你做出來得系統(tǒng)和西安一碼通一樣訪問量一上去就崩,建議還是把基礎(chǔ)打牢固。
Part1操作系統(tǒng)到底能做什么?
好了,接下來言歸正傳。本篇文章是操作系統(tǒng)課程預(yù)備知識(shí)的第二篇,文章講下操作系統(tǒng)到底做了什么事情!本篇文章算是一個(gè)科普,讓大家先了解操作系統(tǒng)是在做什么,以后詳細(xì)學(xué)習(xí)各章就不會(huì)暈。
不知道大家是否還記得上一篇文章中的幾個(gè)細(xì)節(jié)。計(jì)算機(jī)是如何工作的
1.CPU 每一瞬間只能執(zhí)行一個(gè)進(jìn)程(好吧,這個(gè)我之前沒說)
2.為了加快運(yùn)行速度,會(huì)把可能要用到的硬盤上的數(shù)據(jù)加載到內(nèi)存。
3.計(jì)算機(jī)上的信息都是以二進(jìn)制文件的形式存在硬盤上的。
這幾個(gè)細(xì)節(jié)其實(shí)就隱含了操作系統(tǒng)主要做的事情。咱們一個(gè)個(gè)的看。
CPU每一瞬間只能執(zhí)行一個(gè)進(jìn)程
CPU 是計(jì)算機(jī)最重要的資源,運(yùn)算速度很快,可即使 CPU 算的再快,每一瞬間也只能執(zhí)行一個(gè)進(jìn)程。但是我們知道目前單進(jìn)程計(jì)算機(jī)已經(jīng)很難滿足我們對(duì)計(jì)算機(jī)使用的要求了。就比如你開著電腦一邊在直播軟件看 CBA,一邊還要在微信上和人聊天,這時(shí)后臺(tái)很多軟件同時(shí)也在運(yùn)行著。
為了滿足并發(fā)的需求,操作系統(tǒng)把每個(gè)程序的運(yùn)行虛擬化成進(jìn)程,CPU 在一個(gè)進(jìn)程上運(yùn)行幾十毫秒后快速切換到另一個(gè)進(jìn)程,一兩秒鐘內(nèi)就把所有進(jìn)程都運(yùn)行了一遍。這樣就把一個(gè) CPU 變成了多個(gè)虛擬的 CPU。注意,虛擬化是操作系統(tǒng)一大特性,操作系統(tǒng)在很多環(huán)節(jié)都用到這一特性,一會(huì)在內(nèi)存管理部分也會(huì)用到。
為了虛擬化,CPU 要快速的在不同進(jìn)程間切換。于是,在這一環(huán)節(jié),操作系統(tǒng)要做好進(jìn)程和線程的創(chuàng)建并且在后續(xù)運(yùn)行中管理好進(jìn)程和線程,并且做好進(jìn)程間通信的管理。另外進(jìn)程間的同步和互斥也要注意。由同步和互斥引發(fā)的死鎖也要由操作系統(tǒng)去解決。幾乎每時(shí)每刻都會(huì)產(chǎn)生多個(gè)進(jìn)程或線程同時(shí)競(jìng)爭(zhēng) CPU 的現(xiàn)象,CPU 也要去協(xié)調(diào)。
為了加快運(yùn)行速度,會(huì)把可能要用到的硬盤上的數(shù)據(jù)加載到內(nèi)存。
上一篇文章講到了,為了加快計(jì)算機(jī)運(yùn)行速度,會(huì)把可能要用到的硬盤上的數(shù)據(jù)加載到內(nèi)存。內(nèi)存雖然讀寫速度快,可造價(jià)高呀,所以內(nèi)存的空間都很小,一個(gè) 4G 或者 8G 的內(nèi)存條就不便宜了。我們自然要想辦法把內(nèi)存好好利用起來。所以我們?cè)趦?nèi)存管理上,要盡量做好以下幾件事。
擴(kuò)充內(nèi)存
咱們先看下一個(gè)應(yīng)用程序是如何放到內(nèi)存里的。目前應(yīng)用程序都是經(jīng)過編譯、鏈接和裝入三步。大家在編程時(shí)都是把一個(gè)數(shù)值賦值給一個(gè)變量或者一個(gè)地址,編譯程序?qū)δ愕拇a進(jìn)行編譯時(shí)也是不知道實(shí)際物理地址的,只能從 0 開始編號(hào)邏輯地址。經(jīng)過鏈接后,裝入程序會(huì)把編譯產(chǎn)生的邏輯地址映射到內(nèi)存的實(shí)際物理地址。但是這就有麻煩了,內(nèi)存一共才幾 G 的空間,這都是高配了,一些大的作業(yè)根本裝不下呀。于是操作系統(tǒng)就用了虛擬內(nèi)存技術(shù)把程序的一部分裝入內(nèi)存,而其余部分還在磁盤,用的時(shí)候再將程序調(diào)入,這就從邏輯上擴(kuò)充了內(nèi)存的大小。
地址變換
上面也說了,編譯階段產(chǎn)生的都是邏輯地址。邏輯地址也使得每個(gè)程序從自己的角度來看有一塊完整的空間。這極大的簡(jiǎn)化了編程人員的工作量。當(dāng)然邏輯地址和物理地址轉(zhuǎn)化時(shí)的一系列操作都要麻煩操作系統(tǒng)了。
內(nèi)存的分配和回收
這里說的內(nèi)存分配回收和 c 語言用 malloc 申請(qǐng)一塊空間然后 free 釋放了不太一樣。這里講的是針對(duì)作業(yè)的內(nèi)存分配。一涉及到內(nèi)存分配,總會(huì)出現(xiàn)碎片的問題,這也是由操作系統(tǒng)來解決。在這里操作系統(tǒng)會(huì)用到段表、頁表等技術(shù)。
計(jì)算機(jī)上的信息都是以二進(jìn)制文件的形式存在硬盤上的
這里解釋下文件的定義。文件是具有文件名的一組相關(guān)元素的合集。所以電腦上的一些應(yīng)用程序(微信,QQ等),或者一些 word或者excel表格,都可以被看做文件。操作系統(tǒng)為了管理文件,還要做以下幾件事情。
文件存儲(chǔ)空間管理
既然要把文件存儲(chǔ)在硬盤上,肯定要按序存儲(chǔ),否則雜亂的存儲(chǔ)會(huì)造成很多的空間碎片,其次想要取數(shù)據(jù)時(shí)也取不出來。這個(gè)時(shí)候操作系統(tǒng)需要找到可用的空間,然后采用合適的分配方式把文件存下來。
目錄管理
既然我們把文件存了下來,我們肯定希望在我們要用的時(shí)候能快速的把文件取出來。所以我們必須用某種形式把這些文件組織起來,最有效的方式自然就是建目錄。那建立目錄時(shí)你要思考你時(shí)用單級(jí)目錄結(jié)構(gòu)、二級(jí)目錄結(jié)構(gòu)還是樹形目錄結(jié)構(gòu)。還是圖形目錄結(jié)構(gòu)。
共享文件
文件系統(tǒng)中的文件很可能會(huì)被不同用戶使用,我們肯定不可能給每個(gè)用戶準(zhǔn)備一份同樣的獨(dú)立數(shù)據(jù),太消耗空間了,自然需要文件共享。那么我們要思考用何種方式實(shí)現(xiàn)文件共享。我們時(shí)該用硬鏈接,還是軟連接?
文件保護(hù)
既然文件是可以被不同用戶訪問的,那有的用戶可能水平不太行,不小心把你重要的文件刪了就芭比Q了。所以你要給他限制權(quán)限,比如只能讀不能寫。
上面把操縱系統(tǒng)比較重要的三大塊內(nèi)容做了一個(gè)科普。講的比較通俗,主要想讓大家了解一下操作系統(tǒng)做了什么。后續(xù)也會(huì)在這三大塊內(nèi)容上展開進(jìn)行詳細(xì)講解。操作系統(tǒng)的設(shè)計(jì)很巧妙,大家一起學(xué)習(xí)呀。最后我仿照極客時(shí)間的《趣談 Linux 操作系統(tǒng)》畫了一幅 Linux操作系統(tǒng)的總體架構(gòu)圖,順便說下我最近也學(xué)了下這個(gè)課程。我的感覺是如果你操作系統(tǒng)基礎(chǔ)不太好,建議先跟我學(xué),如果基礎(chǔ)好的話十分建議看看這個(gè)課程呀!