<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          了解操作系統(tǒng)的那些事兒,從這篇文章開始

          共 10068字,需瀏覽 21分鐘

           ·

          2021-02-17 08:21

          不懂計(jì)算機(jī)系統(tǒng)也能寫程序,這是不爭的事實(shí)。但是我們「學(xué)習(xí)操作系統(tǒng)并非是為了去創(chuàng)造一個(gè)操作系統(tǒng),而是為了理解操作系統(tǒng)之后寫出更好的程序」

          全文脈絡(luò)思維導(dǎo)圖如下:

          1. 什么是操作系統(tǒng)

          了解什么是操作系統(tǒng),操作系統(tǒng)是干什么用的,我們還需要從操作系統(tǒng)的需求起源開始說起。

          1946 年,「世界上第一臺(tái)通用計(jì)算機(jī)埃尼阿克(ENIAC)「在美國賓夕法尼亞大學(xué)誕生,用了 18000 個(gè)電子管,占地 170 平方米,重達(dá) 30 噸。最恐怖的是,ENIAC 或者說」早期的計(jì)算機(jī)是沒有操作系統(tǒng)的」,運(yùn)轉(zhuǎn)這個(gè) 170 平方米的龐然大物全靠工程師們的手動(dòng)操作。大概是種什么感覺呢?請(qǐng)看下圖:

          圖中遍布整個(gè)房間的大機(jī)器就是 ENIAC,從照片中我們可以看到一名操作人員正在手動(dòng)調(diào)整一個(gè)按鈕,而像這樣的按鈕,整個(gè)房間內(nèi)有成千上萬個(gè)!可想而知,沒有操作系統(tǒng)的時(shí)代,工程師們都需要直接面對(duì)這種反人類的硬件面板進(jìn)行操作,運(yùn)轉(zhuǎn)并維護(hù)一個(gè)計(jì)算機(jī)付出的人力成本簡直無法想象。

          由此,引出了操作系統(tǒng)最主要的功能之一:「對(duì)計(jì)算機(jī)硬件資源進(jìn)行管理、分配和調(diào)度?!?/strong>

          有了操作系統(tǒng)之后,某個(gè)程序需要占據(jù)多少內(nèi)存,具體分配哪個(gè)內(nèi)存空間;只有一個(gè) CPU,如何同時(shí)運(yùn)行多個(gè)程序等,用戶都無需關(guān)心,更不需要去學(xué)習(xí)那些晦澀難懂的底層專業(yè)知識(shí)比如數(shù)字電路邏輯、計(jì)算機(jī)組成原理等,這一切都交給操作系統(tǒng)就好!

          也就是說,「操作系統(tǒng)將所有的底層硬件封裝成一個(gè)黑盒子」,用戶直接向操作系統(tǒng)發(fā)送指令,即可完成與底層硬件的交互。

          那么,操作系統(tǒng)到底是何方神圣?我們先來看看「早期的操作系統(tǒng) Disk Operating System,DOS」(磁盤操作系統(tǒng)) 長什么樣:

          有同學(xué)就說這不就是我們使用的 cmd 命令行,沒有錯(cuò),但是,它是整個(gè)屏幕都是這樣的界面,全屏都是!而不是某一個(gè)對(duì)話框里面是這樣。

          顯然,DOS 這種通過鍵盤輸入命令的操作方式已經(jīng)比我們手動(dòng)調(diào)整按鈕、連接線路要簡單得多。但是,這樣的命令行界面(CLI)必定無法符合大部分用戶的口味,于是后來擁有良好圖形界面(GUI)的操作系統(tǒng)比如 Windows 逐漸成為主流,畢竟只需通過鼠標(biāo)點(diǎn)擊就能進(jìn)行操作,門檻已經(jīng)足夠的低。

          由此可見,一個(gè)操作系統(tǒng)的操作方式和界面的美觀程度對(duì)于用戶來說是非常重要的。

          這就引出了操作系統(tǒng)的第二個(gè)主要功能:「為用戶提供一個(gè)友好、清晰且簡單的操作界面」(專業(yè)的叫法是 「殼 Shell」),用戶通過 Shell 執(zhí)行該操作系統(tǒng)提供的所有的功能。對(duì)于命令行來說,就需要提供足夠多的命令;對(duì)于圖形界面來說,就需要提供足夠多數(shù)量的按鈕。

          ? 總結(jié)一下:操作系統(tǒng)本質(zhì)上是運(yùn)行在計(jì)算機(jī)上的軟件/程序,作為硬件基礎(chǔ)上的第一層軟件,操作系統(tǒng)是硬件和各種軟件溝通的橋梁。其功能大致可分為兩個(gè)部分:

          • 「管理計(jì)算機(jī)硬件與軟件資源」
          • 「向用戶提供一個(gè)與系統(tǒng)交互的操作界面」

          2. 計(jì)算機(jī)硬件簡單介紹

          為了能夠工作,操作系統(tǒng)必須了解大量的硬件,至少需要了解硬件如何面對(duì)程序員。出于這個(gè)原因,這里我們先簡單介紹現(xiàn)代個(gè)人計(jì)算機(jī)中的硬件,然后再討論操作系統(tǒng)中的細(xì)節(jié)。

          一臺(tái)簡單的個(gè)人計(jì)算機(jī)可以抽象為類似于下圖中的模型:

          CPU、內(nèi)存以及 I/O 設(shè)備都由一條系統(tǒng)總線連接起來并通過總線與其他設(shè)備通信。

          處理器

          所謂處理器也就是我們常說的 CPU,它是計(jì)算機(jī)的「大腦」。CPU 從內(nèi)存中提取指令并執(zhí)行它。一個(gè) CPU 的執(zhí)行周期是從內(nèi)存中提取一條指令、解碼并決定它的類型和操作數(shù),接著執(zhí)行之,然后再提取、解碼并執(zhí)行下一條指令。重復(fù)該循環(huán)直到程序運(yùn)行完畢。

          簡單來說,大家記住這句話就行:「一個(gè)程序需要放入內(nèi)存并給它分配 CPU 才能執(zhí)行」

          存儲(chǔ)器

          計(jì)算機(jī)中第二個(gè)主要的組件就是存儲(chǔ)器。「理想情況下」,存儲(chǔ)器應(yīng)該「非??焖佟?/strong>,比執(zhí)行一條指令要快,從而使得 CPU 的執(zhí)行效率不會(huì)收到存儲(chǔ)器的影響,而且「足夠大且非常便宜」

          但是目前的技術(shù)手段無法同時(shí)滿足這三個(gè)目標(biāo),于是出現(xiàn)了不同的處理方式。存儲(chǔ)器系統(tǒng)采用一種分層次的結(jié)構(gòu),如下圖所示,「頂層的存儲(chǔ)器速度最快、容量最小、成本最高,越往下層存儲(chǔ)器的速度越慢、容量越大、成本也越低」

          為什么訪問「寄存器」的速度這么快呢?那是因?yàn)榧拇嫫鞯牟牧虾?CPU 是相同的,所以和訪問 CPU 比起來幾乎是沒有時(shí)延的。

          寄存器的下一個(gè)層次是「緩存」,想必大家并不陌生,通常緩存的使用會(huì)帶來性能上的改善。操作系統(tǒng)一直都在使用緩存,比如說在內(nèi)存中保留頻繁使用的文件,以避免從磁盤上重復(fù)地調(diào)取這些文件。

          再往下一層就是「內(nèi)存」,也稱「主存」,通常被稱為「隨機(jī)訪問存儲(chǔ)器」(Random Access Memory,「RAM」)。所有不能在緩存中得到滿足的訪問請(qǐng)求都會(huì)轉(zhuǎn)往內(nèi)存。

          除了內(nèi)存 RAM 之外,許多計(jì)算機(jī)還具有少量的「非易失性隨機(jī)存取存儲(chǔ)器」(Read Only Memory,「ROM」)。它們與 RAM 不同,在電源斷電后,ROM 并不會(huì)丟失內(nèi)容,其中的內(nèi)容一旦存儲(chǔ)后就不會(huì)再被修改。而且 ROM 非??於冶阋?。

          下一個(gè)層次是「磁盤」,其容量更大,磁盤唯一的問題就是隨機(jī)訪問數(shù)據(jù)的時(shí)間比內(nèi)存大約慢了三個(gè)數(shù)量級(jí),其低速的原因是因?yàn)?strong style="color: rgb(239, 112, 80);">「磁盤是一種機(jī)械裝置并且擁有一種特殊的構(gòu)造」,如下圖所示:

          在一個(gè)磁盤中有一個(gè)或多個(gè)金屬「盤片」,它們以 5400、7200、10800 rpm 或更高的速度旋轉(zhuǎn)。從邊緣開始有一個(gè)「機(jī)械臂」懸橫在盤面上,這種情形大伙可以回想一下老式的播放塑料唱片機(jī)。信息會(huì)寫在磁盤一系列的同心圓上。在任意一個(gè)給定臂的位置,每個(gè)「磁頭」可以讀取一段環(huán)形區(qū)域,稱為「磁道」(track)。把一個(gè)給定臂的位置上的所有磁道合并起來,就組成了一個(gè)「柱面」(cylinder)。

          每個(gè)磁道劃分若干「扇區(qū)」,扇區(qū)的值是 512 字節(jié)。在現(xiàn)代磁盤中,較外部的柱面比較內(nèi)部的柱面有更多的扇區(qū)。機(jī)械臂從一個(gè)柱面移動(dòng)到相鄰的柱面大約需要 1ms。而隨機(jī)移到一個(gè)柱面的典型時(shí)間為 5ms 至 10ms,其具體時(shí)間取決于驅(qū)動(dòng)器。磁臂到達(dá)正確的磁道上后,驅(qū)動(dòng)器必須等待所需的扇區(qū)旋轉(zhuǎn)到磁頭之下(這大概需要 5ms 至 10ms 的時(shí)延),再開始讀寫,低端硬盤的速率是 50MB/s,而高速磁盤的速率是   160MB/s。

          I/O 設(shè)備

          CPU 和存儲(chǔ)器并不是操作系統(tǒng)唯一需要管理的資源,I/O 設(shè)備與操作系統(tǒng)同樣密不可分。如下圖所示,I/O 設(shè)備一般包括兩個(gè)部分:設(shè)備控制器和設(shè)備本身,比如鍵盤控制器和鍵盤。

          「設(shè)備控制器」其實(shí)就是一塊芯片或者一組芯片,它能夠接收操作系統(tǒng)的指令并控制物理設(shè)備。例如,從設(shè)備中讀取數(shù)據(jù)并完成數(shù)據(jù)的處理。

          在許多情況下,實(shí)際控制設(shè)備的過程是非常復(fù)雜而且存在諸多細(xì)節(jié)。因此控制器的工作就是為操作系統(tǒng)提供一個(gè)更簡單(但仍然非常復(fù)雜)的接口。

          I/O 設(shè)備另一部分是「設(shè)備本身」,設(shè)備本身有一個(gè)相對(duì)簡單的接口,這是因?yàn)榻涌诩炔荒茏龊芏喙ぷ?,而且也已?jīng)被「標(biāo)準(zhǔn)化」了,標(biāo)準(zhǔn)化后任何一個(gè)磁盤控制器就可以適配任意一種磁盤,所以標(biāo)準(zhǔn)化是非常必要的。

          3. 操作系統(tǒng)的四個(gè)特征

          操作系統(tǒng)擁有 4 個(gè)鮮明的特征:并發(fā)、共享、虛擬和異步。其中,「并發(fā)和共享是操作系統(tǒng)的最基本特征」,沒有并發(fā)和共享,就談不上虛擬和異步。

          下面我們來簡單的了解一下這 4 個(gè)特征,其中涉及的很多詳細(xì)概念不會(huì)在本文做出解釋,后續(xù)會(huì)陸續(xù)開更。

          ① 并發(fā)

          并發(fā)和并行這兩個(gè)孿生兄弟,經(jīng)常會(huì)讓初學(xué)者摸不著頭腦。

          • 「并發(fā)」:并發(fā)是指宏觀上在「一段時(shí)間內(nèi)」能同時(shí)運(yùn)行多個(gè)程序。當(dāng)然,這些程序宏觀上是同時(shí)發(fā)生的,但微觀上是交替發(fā)生的。操作系統(tǒng)通過引入進(jìn)程和線程,使得程序能夠并發(fā)運(yùn)行。

          • 「并行」:并行則指「同一時(shí)刻」能運(yùn)行多個(gè)指令,指兩個(gè)或多個(gè)事件在「同一時(shí)刻同時(shí)發(fā)生」。并行需要硬件支持,如多流水線、多核處理器或者分布式計(jì)算系統(tǒng)。

          配合下圖形象的理解下:

          說到并發(fā)與并行,不得不提 CPU,作為計(jì)算機(jī)的大腦, CPU 主要和內(nèi)存進(jìn)行交互,從內(nèi)存中提取指令并執(zhí)行。而一個(gè)程序需要放入內(nèi)存并給它分配 CPU 才能執(zhí)行,所以并發(fā)并行的能力與 CPU 的性能息息相關(guān):

          • 「單核 CPU」同一時(shí)刻只能執(zhí)行一個(gè)程序,各個(gè)程序只能「并發(fā)」地執(zhí)行 ;
          • 「多核 CPU」同一時(shí)刻可以同時(shí)執(zhí)行多個(gè)程序,多個(gè)程序可以「并行」地執(zhí)行。

          比如 Intel 的第八代 i3 處理器就是 4 核 CPU,意味著可以并行地執(zhí)行 4 個(gè)程序。當(dāng)然,即使是對(duì)于 4 核 CPU 來說,只要有 4 個(gè)以上的程序需要 “同時(shí)” 運(yùn)行,那么并發(fā)性依然是必不可少的,因此「并發(fā)性是操作系統(tǒng)一個(gè)最基本的特征」。

          ② 共享

          共享即「資源共享」,是指系統(tǒng)中的資源可供內(nèi)存中多個(gè)「并發(fā)」執(zhí)行的進(jìn)程共同使用。

          主要有兩種共享方式:

          1)「互斥共享」

          所謂互斥共享,就是說雖然這個(gè)資源是共享的,所有進(jìn)程都能夠使用,但是「同一個(gè)資源在某一時(shí)刻只允許一個(gè)進(jìn)程訪問」,也稱為互斥訪問,需要用同步機(jī)制來實(shí)現(xiàn)互斥訪問?;コ夤蚕?訪問的資源稱為「臨界資源」。

          舉個(gè)互斥共享的例子:

          如果我們同時(shí)使用 QQ 和微信視頻,同一時(shí)間段內(nèi)攝像頭資源只能分配給其中的一個(gè)進(jìn)程。

          2)「同時(shí)共享」

          同時(shí)共享與互斥共享相反,「允許一個(gè)時(shí)間段內(nèi)多個(gè)進(jìn)程 “同時(shí)” 對(duì)系統(tǒng)中的某些資源進(jìn)行訪問」。當(dāng)然,所謂的 “同時(shí)” 往往是宏觀上的,而在微觀上,這些進(jìn)程可能是交替地對(duì)該資源進(jìn)行訪問(即分時(shí)共享)

          舉個(gè)同時(shí)共享的例子:

          使用 QQ 發(fā)送硬盤上的文件 A,同時(shí)使用微信發(fā)送硬盤上的文件 B。宏觀上看,兩邊在同時(shí)讀取并發(fā)送文件, 都在訪問硬盤資源,并從中讀取數(shù)據(jù)。微觀上看,QQ 和微信這兩個(gè)進(jìn)程是交替訪問硬盤資源的。

          「并發(fā)和共享作為操作系統(tǒng)的兩大最基本特征,其實(shí)是互為存在條件的」。為什么這么說呢?這樣,我們繼續(xù)通過上述發(fā)送文件的例子來看并發(fā)與共享的關(guān)系(使用 QQ 發(fā)送硬盤上的文件 A,同時(shí)使用微信發(fā)送硬盤上的文件 B):

          • 并發(fā)性的體現(xiàn):兩個(gè)進(jìn)程正在并發(fā)執(zhí)行。

            如果失去并發(fā)性,系統(tǒng)中只有一個(gè)程序正在運(yùn)行,則共享性失去存在的意義

          • 共享性的體現(xiàn):兩個(gè)進(jìn)程需要共享地訪問硬盤資源。

            如果失去共享性,則 QQ 和微信不能同時(shí)訪問硬盤資源,就無法實(shí)現(xiàn)同時(shí)發(fā)送文件,并發(fā)也就無從談起

          ③ 虛擬

          先上定義:虛擬是指「把一個(gè)物理上的實(shí)體變?yōu)槿舾蓚€(gè)邏輯上的對(duì)應(yīng)物」。物理實(shí)體(前者)是實(shí)際存在的,而邏輯上對(duì)應(yīng)物(后者)是用戶感受到的。

          這么說是有點(diǎn)虛無縹緲了,用一個(gè)例子來理解:

          上文說過,一個(gè)程序需要放入內(nèi)存并給它分配 CPU 才能執(zhí)行。那比如說 GTA5 需要 4GB 的運(yùn)行內(nèi)存,QQ 需要256MB 的內(nèi)存,Chrome 需要 512MB 的內(nèi)存,網(wǎng)易云音樂需要 256MB 的內(nèi)存…… 假設(shè)我們的電腦只有 4GB 內(nèi)存且 CPU 是單核的。那么這里就存在如下兩個(gè)問題:

          「問題 1」:這些程序同時(shí)運(yùn)行需要的內(nèi)存遠(yuǎn)大于 4 GB,那么為什么它們還可以在我的電腦上同時(shí)運(yùn)行呢?

          答:這得益于虛擬內(nèi)存技術(shù)的「空分復(fù)用技術(shù)」。雖然我們的電腦實(shí)際上只有 4GB 的內(nèi)存,但是卻可以完美的同時(shí)運(yùn)行這些遠(yuǎn)大于 4G 內(nèi)存的程序,「在用戶看來似乎我們的電腦內(nèi)存遠(yuǎn)遠(yuǎn)大于 4GB」。

          「問題 2」:既然一個(gè)程序需要被分配 CPU 才能正常執(zhí)行,那為什么單核 CPU 的電腦中也能同時(shí)運(yùn)行這么多個(gè)程序呢?

          答:這得益于虛擬內(nèi)存技術(shù)的「時(shí)分復(fù)用技術(shù)」。雖然實(shí)際上只有一個(gè)單核 CPU,無法同時(shí)并行執(zhí)行這么多個(gè)程序,但是微觀上 CPU 在各個(gè)微小的時(shí)間段內(nèi)交替著為各個(gè)進(jìn)程服務(wù),「在用戶看來似乎我們的 CPU 是多核的」

          下面我們來解釋一下上述兩種虛擬技術(shù):

          1)「空分復(fù)用技術(shù)」

          空分復(fù)用技術(shù)的原理就是把內(nèi)存作為高速緩存來使用,只用來保存最頻繁使用的部分程序,而把程序的大部分放在磁盤上。這種機(jī)制需要快速的映像內(nèi)存地址,以便把程序生成的地址轉(zhuǎn)換為有關(guān)字節(jié)在內(nèi)存中的物理地址。這種映像由 CPU 中的一個(gè)部件,稱為「存儲(chǔ)器管理單元」(Memory Management Unit,「MMU」)來完成,這張圖上面我們也看過了,回顧一遍:

          2)「時(shí)分復(fù)用技術(shù)」

          多個(gè)進(jìn)程能在同一個(gè) CPU 上并發(fā)執(zhí)行就是因?yàn)槭褂昧藭r(shí)分復(fù)用技術(shù),讓每個(gè)進(jìn)程輪流占用處理器,每次只執(zhí)行一小個(gè)時(shí)間片并快速切換。

          顯然,如果失去了并發(fā)性,一個(gè)時(shí)間段內(nèi)系統(tǒng)中只能運(yùn)行一道程序,那也就失去了實(shí)現(xiàn)虛擬性的意義了。因此,「沒有并發(fā)性,就談不上虛擬性」

          ④ 異步

          異步是指:在多道程序環(huán)境下,允許多個(gè)程序并發(fā)執(zhí)行,但「由于資源有限,進(jìn)程的執(zhí)行不是一貫到底的, 而是走走停停,以不可預(yù)知的速度向前推進(jìn)」,這就是進(jìn)程的異步性。

          舉個(gè)例子:老渣在 8 點(diǎn) 和 12 點(diǎn)要和兩個(gè)女孩并發(fā)約會(huì),每個(gè)女孩的約會(huì)時(shí)間是 2 小時(shí),與一、二號(hào)的約會(huì)就是兩道并發(fā)執(zhí)行的程序,而老渣的心則是有限的系統(tǒng)資源。

          由于并發(fā)運(yùn)行的程序會(huì)爭搶使用系統(tǒng)資源,而系統(tǒng)中的資源有限,那么老渣同一號(hào)或二號(hào)的 2 小時(shí)約會(huì)時(shí)間就可能無法一次性結(jié)束,而是斷斷續(xù)續(xù)的。可能 8 點(diǎn)到 9 點(diǎn)和一號(hào)約會(huì),9 點(diǎn)到10 點(diǎn)和二號(hào)約會(huì),然后 10 點(diǎn)到 11 點(diǎn)再和一號(hào)約會(huì),最后 11 點(diǎn)到 12 點(diǎn)和二號(hào)約會(huì)。

          如果失去了并發(fā)性,即系統(tǒng)只能串行地運(yùn)行各個(gè)程序,那么每個(gè)程序的執(zhí)行會(huì)一貫到底。因此,「只有系統(tǒng)擁有并發(fā)性,才有可能導(dǎo)致異步性」。

          4. 學(xué)習(xí)操作系統(tǒng)的核心內(nèi)容

          本系列的核心內(nèi)容主要有以下:

          • 進(jìn)程管理
          • 存儲(chǔ)管理
          • 文件系統(tǒng)管理
          • I/O 設(shè)備管理

          ① 進(jìn)程管理

          進(jìn)程(Process)這個(gè)概念在上文中已經(jīng)多次出現(xiàn)了,為了能更好地實(shí)現(xiàn)操作系統(tǒng)的并發(fā)性和共享性,遂引入了進(jìn)程。

          「進(jìn)程就是程序的一次執(zhí)行過程,它是暫時(shí)的。不僅包含正在運(yùn)行的程序?qū)嶓w,并且包括這個(gè)運(yùn)行的程序中占據(jù)的所有系統(tǒng)資源,比如說 CPU、內(nèi)存、網(wǎng)絡(luò)資源等」。很多小伙伴在回答進(jìn)程的概念的時(shí)候,往往只會(huì)說它是一個(gè)運(yùn)行的實(shí)體,而會(huì)忽略掉進(jìn)程所占據(jù)的資源。比如說,同樣一個(gè)程序,同一時(shí)刻被兩次運(yùn)行了,那么他們就是兩個(gè)獨(dú)立的進(jìn)程。

          講到進(jìn)程不得不說一嘴線程,「一個(gè)進(jìn)程中可以有多個(gè)線程,它們共享進(jìn)程資源。」

          舉個(gè)例子,QQ 和 Chrome 瀏覽器是兩個(gè)進(jìn)程,Chrome 進(jìn)程里面有很多線程,例如 HTTP 請(qǐng)求線程、事件響應(yīng)線程、渲染線程等等,線程的并發(fā)執(zhí)行使得在瀏覽器中點(diǎn)擊一個(gè)新鏈接從而發(fā)起 HTTP 請(qǐng)求時(shí),瀏覽器還可以響應(yīng)用戶的其它事件。

          我們所說的進(jìn)程管理其實(shí)主要包含兩個(gè)內(nèi)容:

          • 進(jìn)程通信
          • 進(jìn)程調(diào)度

          「進(jìn)程通信」顧名思義,就是進(jìn)程之間的相互交流。CPU 作為計(jì)算機(jī)最寶貴的資源,一個(gè)進(jìn)程需要放入內(nèi)存并給它分配 CPU 才能執(zhí)行,而一個(gè)程序可能包含多個(gè)進(jìn)程,這就需要進(jìn)程之間進(jìn)行相互交流,彼此同步,共同完成這個(gè)程序。舉個(gè)例子,如果進(jìn)程 A 產(chǎn)生數(shù)據(jù)而進(jìn)程 B 打印數(shù)據(jù),那么 B 在 A 產(chǎn)生數(shù)據(jù)之前就必須等待,那么 A 是不是就得給 B 發(fā)消息,告訴 B 我生產(chǎn)了數(shù)據(jù),你可以打印了。

          「進(jìn)程調(diào)度」就是說,通常情況下,會(huì)有多個(gè)進(jìn)程或線程同時(shí)競爭 CPU,如果恰好只有一個(gè) CPU 可用,這就導(dǎo)致 CPU 必須對(duì)下一個(gè)運(yùn)行的進(jìn)程或線程做出選擇,這個(gè)選擇的過程就是進(jìn)程調(diào)度。

          ② 內(nèi)存管理

          高速緩存作為除寄存器外最底層的存儲(chǔ)器,其管理是由硬件完成的,所以我們學(xué)習(xí)的內(nèi)容集中在對(duì)內(nèi)存的管理。

          其實(shí)這個(gè)話題在上文操作系統(tǒng)的四個(gè)特征中虛擬這個(gè)特征時(shí)我們就說過了,內(nèi)存一般用來保存正在執(zhí)行的程序,在非常簡單的操作系統(tǒng)中,內(nèi)存中每次只能運(yùn)行一個(gè)程序,如果要運(yùn)行第二個(gè)程序,第一個(gè)程序就必須被移除內(nèi)存,再把第二個(gè)程序裝入內(nèi)存。

          顯然這樣非常低效的,為此引入了虛擬內(nèi)存技術(shù),把內(nèi)存作為高速緩存來使用,只用來保存最頻繁使用的部分程序,而把程序的大部分放在磁盤上。

          那么內(nèi)存管理做的事情大概就是:

          • 把使用頻繁的部分程序放入內(nèi)存
          • 當(dāng)內(nèi)存滿的時(shí)候,替換掉內(nèi)存中的某些部分

          ③ 文件系統(tǒng)管理

          文件其實(shí)是進(jìn)程創(chuàng)建的信息邏輯單元,一個(gè)磁盤可能含有幾千甚至幾百萬個(gè)文件,每個(gè)文件都是獨(dú)立于其他文件的,事實(shí)上,把每個(gè)文件看成一種地址空間更容易理解文件的本質(zhì)。

          文件同樣是受操作系統(tǒng)管理的,有關(guān)文件的構(gòu)造、命名、存取、使用、保護(hù)、實(shí)現(xiàn)和管理方法都是操作系統(tǒng)設(shè)計(jì)的內(nèi)容,這就是文件系統(tǒng)的主題。

          ④ I/O 設(shè)備管理

          操作系統(tǒng)必須高效的管理 I/O 設(shè)備,它需要向 I/O 設(shè)備發(fā)送命令,捕捉中斷,并處理設(shè)備的各種錯(cuò)誤,它還應(yīng)該在設(shè)備和系統(tǒng)的其他部分之間提供簡單且易用的接口。

          5. 內(nèi)核態(tài)和用戶態(tài)

          內(nèi)核這個(gè)專有名詞可能會(huì)讓大家有點(diǎn)懵逼。這里解釋一下?,F(xiàn)代操作系統(tǒng)都采用進(jìn)程的概念,為了更好的處理系統(tǒng)的并發(fā)性、共享性等,并使進(jìn)程能夠協(xié)調(diào)地工作,僅依靠計(jì)算機(jī)硬件提供的功能是遠(yuǎn)遠(yuǎn)不夠的。例如,進(jìn)程的調(diào)度就不能用硬件來實(shí)現(xiàn),必須使用一組基本軟件對(duì)硬件資源進(jìn)行改造,以便為進(jìn)程的執(zhí)行提供良好的運(yùn)行環(huán)境,這個(gè)軟件就是內(nèi)核(kernel)。

          簡單來說,「內(nèi)核就是操作系統(tǒng)中的一組程序模塊」,作為可信軟件來提供支持進(jìn)程并發(fā)執(zhí)行的基本功能和基本操作,「具有訪問硬件設(shè)備和所有內(nèi)存空間的權(quán)限」。不夸張的說,內(nèi)核是操作系統(tǒng)的核心。

          當(dāng)然,操作系統(tǒng)除了內(nèi)核程序外,還有包括其他一些基本組件,如文本編輯器、編譯器、用來與用戶進(jìn)行交互的程序比如桌面系統(tǒng)等。

          ① 什么是內(nèi)核態(tài)和用戶態(tài)

          那么既然內(nèi)核是程序,它需要運(yùn)行,就必須被分配 CPU。因此,CPU 上會(huì)運(yùn)行兩種程序,一種是操作系統(tǒng)的內(nèi)核程序(也稱為系統(tǒng)程序),一種是應(yīng)用程序。前者完成系統(tǒng)任務(wù),后者實(shí)現(xiàn)應(yīng)用任務(wù)。兩者之間有控制和被控制的關(guān)系,前者有權(quán)管理和分配資源,而后者只能向系統(tǒng)申請(qǐng)使用資源。

          顯然,我們應(yīng)該把在 CPU 上運(yùn)行的這兩類程序加以區(qū)分,這就是內(nèi)核態(tài)和用戶態(tài)出現(xiàn)的原因。

          • 「內(nèi)核態(tài)」(kernel mode):當(dāng) CPU 處于內(nèi)核態(tài)時(shí),這是操作系統(tǒng)管理程序(也就是內(nèi)核)運(yùn)行時(shí)所處的狀態(tài)。運(yùn)行在內(nèi)核態(tài)的程序可以訪問計(jì)算機(jī)的任何資源,不受限制,為所欲為,例如協(xié)調(diào) CPU 資源,分配內(nèi)存資源,提供穩(wěn)定的環(huán)境供應(yīng)用程序運(yùn)行等。
          • 「用戶態(tài)」(user mode):應(yīng)用程序基本都是運(yùn)行在用戶態(tài)的,或者說用戶態(tài)就是提供應(yīng)用程序運(yùn)行的空間。運(yùn)行在用戶態(tài)的程序只能訪問當(dāng)前 CPU 上執(zhí)行程序所在的地址空間,這樣有效地防止了操作系統(tǒng)程序受到應(yīng)用程序的侵害。

          對(duì)操作系統(tǒng)來說,「什么樣的程序應(yīng)該放在內(nèi)核態(tài)呢」?這取決于對(duì)資源的需求、時(shí)間的緊迫和效率高低等因素。比如 CPU、內(nèi)存、設(shè)備等資源管理器程序應(yīng)該在內(nèi)核態(tài)運(yùn)行,否則安全性沒有保證。對(duì)于文件系統(tǒng)和數(shù)據(jù)來說,文件系統(tǒng)數(shù)據(jù)和管理必須放在內(nèi)核態(tài),但是用戶的數(shù)據(jù)和管理可以放在用戶態(tài)。

          ② 中斷機(jī)制

          在合適的情況下,操作系統(tǒng)的內(nèi)核會(huì)把 CPU 的使用權(quán)主動(dòng)讓給應(yīng)用程序,也就是使 CPU 從內(nèi)核態(tài)轉(zhuǎn)換到用戶態(tài)。而 CPU 要想從用戶態(tài)回到內(nèi)核態(tài),只能通過中斷機(jī)制完成,如果沒有中斷機(jī)制,那么一旦應(yīng)用程序上 CPU 運(yùn)行(用戶態(tài)),CPU 就會(huì)一直運(yùn)行這個(gè)應(yīng)用程序。也就是說,「中斷是讓操作系統(tǒng)內(nèi)核奪回 CPU 使用權(quán)的唯一途徑」??梢哉f,「操作系統(tǒng)是由中斷驅(qū)動(dòng)的」

          當(dāng)然,這里的中斷機(jī)制非常廣義,包含了三種手段,也就是說從用戶態(tài)轉(zhuǎn)換到內(nèi)核態(tài)有三種手段:

          • 1)程序請(qǐng)求操作系統(tǒng)服務(wù),執(zhí)行系統(tǒng)調(diào)用
          • 2)程序運(yùn)行時(shí)產(chǎn)生外中斷事件(比如 I/O 操作完成),運(yùn)行程序被中斷,轉(zhuǎn)向中斷程序處理
          • 3)在程序運(yùn)行時(shí)發(fā)生內(nèi)中斷(異常)事件,運(yùn)行程序被打斷,轉(zhuǎn)向異常處理程序工作

          以上這三種手段都是通過中斷機(jī)制來發(fā)生的,那么接下來我們就來看看中斷到底有哪些類型。

          按照中斷信號(hào)來源于CPU 的外部還是內(nèi)部,將中斷類型分為外中斷和內(nèi)中斷:

          • 「外中斷」 (也稱中斷,狹義上的中斷)

            外中斷與當(dāng)前執(zhí)行的指令無關(guān), 中斷信號(hào)來源于 CPU 外部。如 I/O 完成中斷,表示設(shè)備輸入/輸出處理已經(jīng)完成,CPU 能夠發(fā)送下一個(gè)輸入/輸出請(qǐng)求。此外還有時(shí)鐘中斷、控制臺(tái)中斷等。

          • 「內(nèi)中斷」(也稱 異常、例外)

            內(nèi)中斷與當(dāng)前執(zhí)行的指令有關(guān), 中斷信號(hào)來源于 CPU 內(nèi)部。如非法操作碼、地址越界、算術(shù)溢出,除數(shù)為 0 等。

          這里簡單解釋一下「中斷機(jī)制的基本原理」:不同的中斷信號(hào),肯定是需要用不同的中斷處理程序來處理的。那么當(dāng) CPU 檢測到中斷信號(hào)后,就會(huì)根據(jù)中斷信號(hào)的類型去查詢「中斷向量表」,以此來找到相應(yīng)的中斷處理程序在內(nèi)存中的存放位置。

          ③ 系統(tǒng)調(diào)用

          如上文所說,程序通過執(zhí)行系統(tǒng)調(diào)用,也可以使得 CPU 從用戶態(tài)轉(zhuǎn)向內(nèi)核態(tài)。那么系統(tǒng)調(diào)用和中斷有啥關(guān)系呢?為什么說這種方式也屬于中斷機(jī)制的一種呢?那是因?yàn)?strong style="color: rgb(239, 112, 80);">「系統(tǒng)調(diào)用是通過陷入指令完成的」,該指令會(huì)引發(fā)內(nèi)中斷。

          說的更詳細(xì)點(diǎn),操作系統(tǒng)作為計(jì)算機(jī)硬件之上的第一層軟件,需要向上層提供一些簡單易用的服務(wù),這個(gè)上層包括用戶和應(yīng)用程序:

          給用戶提供的接口有圖形界面 GUI 和命令接口,給應(yīng)用程序提供的是「程序接口」,這個(gè)程序接口就是由一組系統(tǒng)調(diào)用組成的,是操作系統(tǒng)提供給開發(fā)人員使用的??梢岳斫鉃橐环N可供應(yīng)用程序調(diào)用的特殊函數(shù),「應(yīng)用程序可以通過系統(tǒng)調(diào)用來請(qǐng)求獲得操作系統(tǒng)內(nèi)核的服務(wù)」。

          「系統(tǒng)調(diào)用的過程」簡略版大致如下:

          1)在用戶態(tài),應(yīng)用程序傳遞系統(tǒng)調(diào)用參數(shù)

          2)執(zhí)行陷入指令,引發(fā)一個(gè)內(nèi)中斷,使 CPU 進(jìn)入內(nèi)核態(tài)

          3)在內(nèi)核態(tài),執(zhí)行相應(yīng)的請(qǐng)求,內(nèi)核程序處理系統(tǒng)調(diào)用

          4)返回應(yīng)用程序

          思考一下「為什么系統(tǒng)調(diào)用是必須的」?

          舉個(gè)例子:我們?nèi)W(xué)校打印店打印論文,你按下了 WPS 的 “打印” 選項(xiàng),于是打印機(jī)開始工作。 你的論文打印到一半時(shí),另一位同學(xué)按下了 Word 的 “打印” 按鈕,開始打印他自己的論文。想象一下如果兩個(gè)進(jìn)程可以隨意的、并發(fā)的共享打印機(jī)資源,會(huì)發(fā)生什么情況?

          顯然,兩個(gè)進(jìn)程并發(fā)運(yùn)行,導(dǎo)致打印機(jī)設(shè)備交替的收到 WPS 和 Word 兩個(gè)進(jìn)程發(fā)來的打印請(qǐng)求,結(jié)果兩篇論文的內(nèi)容混雜在一起了

          如何解決這個(gè)問題?這就需要操作系統(tǒng)內(nèi)核對(duì)共享資源進(jìn)行統(tǒng)一的管理,并向上層提供 “系統(tǒng)調(diào)用” ,運(yùn)行在用戶態(tài)的應(yīng)用程序或者進(jìn)程想要使用打印機(jī)這種共享資源,只能通過系統(tǒng)調(diào)用向操作系統(tǒng)內(nèi)核發(fā)出請(qǐng)求,然后內(nèi)核會(huì)對(duì)各個(gè)請(qǐng)求進(jìn)行協(xié)調(diào)處理(進(jìn)程調(diào)度)。

          通過上面這個(gè)例子,我們就可以總結(jié)出什么功能會(huì)用到系統(tǒng)調(diào)用:「凡是與共享資源有關(guān)的操作(比如內(nèi)存分配、I/O 操作、文件管理等),都必須通過系統(tǒng)調(diào)用的方式向操作系統(tǒng)內(nèi)核提出請(qǐng)求,由操作系統(tǒng)內(nèi)核代為完成」。這樣可以保證系統(tǒng)的穩(wěn)定性和安全性,防止用戶進(jìn)行非法操作。這些系統(tǒng)調(diào)用按功能大致可分為如下幾類:

          • 設(shè)備管理。完成設(shè)備的請(qǐng)求或釋放,以及設(shè)備啟動(dòng)等功能。
          • 文件管理。完成文件的讀、寫、創(chuàng)建及刪除等功能。
          • 進(jìn)程控制。完成進(jìn)程的創(chuàng)建、撤銷、阻塞及喚醒等功能。
          • 進(jìn)程通信。完成進(jìn)程之間的消息傳遞或信號(hào)傳遞等功能。
          • 內(nèi)存管理。完成內(nèi)存的分配、回收以及獲取作業(yè)占用內(nèi)存區(qū)大小及地址等功能。

          6. 總結(jié)

          縫縫補(bǔ)補(bǔ)終于寫完了,說實(shí)話,這種系列綜述類的文章真的難寫,既要照顧知識(shí)體系完整度,保證每個(gè)模塊都能涉及,又不能講的太深太細(xì),還需要循序漸進(jìn),防止陡然出現(xiàn)一個(gè)并未介紹的專有名詞。

          OK,抓住春節(jié)的尾巴,祝大家新年快樂,牛年大吉 ??,操作系統(tǒng)系列就此開篇了~

          參考資料

          • 《現(xiàn)代操作系統(tǒng) — 第 3 版》
          • 《王道考研 — 計(jì)算機(jī)網(wǎng)絡(luò)》
          • 百度百科 — 進(jìn)程管理
          • 知乎 — 什么是操作系統(tǒng)?https://www.zhihu.com/question/61861692/answer/575287870


          ?? 下方點(diǎn)擊卡片關(guān)注公眾號(hào)「飛天小牛肉」(專注于分享計(jì)算機(jī)基礎(chǔ)、Java 基礎(chǔ)和面試指南的相關(guān)原創(chuàng)技術(shù)好文,幫助讀者快速掌握高頻重點(diǎn)知識(shí),有的放矢),與小牛肉一起成長、共同進(jìn)步    

          ?? 并向大家強(qiáng)烈推薦我維護(hù)的 Gitee 倉庫 「CS-Wiki」(Gitee 推薦項(xiàng)目,目前已 0.9k star。面向全棧,致力于構(gòu)建完善的知識(shí)體系:數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、算法、數(shù)據(jù)庫、設(shè)計(jì)模式、Java 技術(shù)棧、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、強(qiáng)化學(xué)習(xí)等),相比公眾號(hào),該倉庫擁有更健全的知識(shí)體系,歡迎前來 star,倉庫地址 https://gitee.com/veal98/CS-Wiki。也可直接下方掃碼訪問


                                原創(chuàng)不易,讀完有收獲不妨點(diǎn)贊|分享|在看支持哦

          瀏覽 39
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  A级无码| 91aV影院在线播放 | 国产主播91 | A一级日黄片 | 4438全国最大无码视频 |