瞭解作業系統的那些事兒,從這篇文章開始

飛天小牛肉發表於2021-02-23

 

? 盡人事,聽天命。博主東南大學碩士在讀,熱愛健身和籃球,樂於分享技術相關的所見所得,關注公眾號 @ 飛天小牛肉,第一時間獲取文章更新,成長的路上我們一起進步

? 本文已收錄於 CS-Wiki(Gitee 官方推薦專案,現已 1.0k+ star),致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習

不懂計算機系統也能寫程式,這是不爭的事實。但是我們學習作業系統並非是為了去創造一個作業系統,而是為了理解作業系統之後寫出更好的程式

全文脈絡思維導圖如下:

瞭解作業系統的那些事兒,從這篇文章開始

1. 什麼是作業系統

瞭解什麼是作業系統,作業系統是幹什麼用的,我們還需要從作業系統的需求起源開始說起。

1946 年,世界上第一臺通用計算機埃尼阿克(ENIAC)在美國賓夕法尼亞大學誕生,用了 18000 個電子管,佔地 170 平方米,重達 30 噸。最恐怖的是,ENIAC 或者說早期的計算機是沒有作業系統的,運轉這個 170 平方米的龐然大物全靠工程師們的手動操作。大概是種什麼感覺呢?請看下圖:

瞭解作業系統的那些事兒,從這篇文章開始

圖中遍佈整個房間的大機器就是 ENIAC,從照片中我們可以看到一名操作人員正在手動調整一個按鈕,而像這樣的按鈕,整個房間內有成千上萬個!可想而知,沒有作業系統的時代,工程師們都需要直接面對這種反人類的硬體皮膚進行操作,運轉並維護一個計算機付出的人力成本簡直無法想象。

由此,引出了作業系統最主要的功能之一:對計算機硬體資源進行管理、分配和排程。

有了作業系統之後,某個程式需要佔據多少記憶體,具體分配哪個記憶體空間;只有一個 CPU,如何同時執行多個程式等,使用者都無需關心,更不需要去學習那些晦澀難懂的底層專業知識比如數位電路邏輯、計算機組成原理等,這一切都交給作業系統就好!

也就是說,作業系統將所有的底層硬體封裝成一個黑盒子,使用者直接向作業系統傳送指令,即可完成與底層硬體的互動。

那麼,作業系統到底是何方神聖?我們先來看看早期的作業系統 Disk Operating System,DOS(磁碟作業系統) 長什麼樣:

瞭解作業系統的那些事兒,從這篇文章開始

有同學就說這不就是我們使用的 cmd 命令列,沒有錯,但是,它是整個螢幕都是這樣的介面,全屏都是!而不是某一個對話方塊裡面是這樣。

顯然,DOS 這種通過鍵盤輸入命令的操作方式已經比我們手動調整按鈕、連線線路要簡單得多。但是,這樣的命令列介面(CLI)必定無法符合大部分使用者的口味,於是後來擁有良好圖形介面(GUI)的作業系統比如 Windows 逐漸成為主流,畢竟只需通過滑鼠點選就能進行操作,門檻已經足夠的低。

瞭解作業系統的那些事兒,從這篇文章開始

由此可見,一個作業系統的操作方式和介面的美觀程度對於使用者來說是非常重要的。

這就引出了作業系統的第二個主要功能:為使用者提供一個友好、清晰且簡單的操作介面(專業的叫法是 殼 Shell),使用者通過 Shell 執行該作業系統提供的所有的功能。對於命令列來說,就需要提供足夠多的命令;對於圖形介面來說,就需要提供足夠多數量的按鈕。

⭐ 總結一下:作業系統本質上是執行在計算機上的軟體/程式,作為硬體基礎上的第一層軟體,作業系統是硬體和各種軟體溝通的橋樑。其功能大致可分為兩個部分:

  • 管理計算機硬體與軟體資源

  • 向使用者提供一個與系統互動的操作介面

瞭解作業系統的那些事兒,從這篇文章開始

2. 計算機硬體簡單介紹

為了能夠工作,作業系統必須瞭解大量的硬體,至少需要了解硬體如何面對程式設計師。出於這個原因,這裡我們先簡單介紹現代個人計算機中的硬體,然後再討論作業系統中的細節。

一臺簡單的個人計算機可以抽象為類似於下圖中的模型:

瞭解作業系統的那些事兒,從這篇文章開始

CPU、記憶體以及 I/O 裝置都由一條系統匯流排連線起來並通過匯流排與其他裝置通訊。

處理器

所謂處理器也就是我們常說的 CPU,它是計算機的大腦。CPU 從記憶體中提取指令並執行它。一個 CPU 的執行週期是從記憶體中提取一條指令、解碼並決定它的型別和運算元,接著執行之,然後再提取、解碼並執行下一條指令。重複該迴圈直到程式執行完畢。

簡單來說,大家記住這句話就行:一個程式需要放入記憶體並給它分配 CPU 才能執行

瞭解作業系統的那些事兒,從這篇文章開始

儲存器

計算機中第二個主要的元件就是儲存器。理想情況下,儲存器應該非常快速,比執行一條指令要快,從而使得 CPU 的執行效率不會收到儲存器的影響,而且足夠大且非常便宜

但是目前的技術手段無法同時滿足這三個目標,於是出現了不同的處理方式。儲存器系統採用一種分層次的結構,如下圖所示,頂層的儲存器速度最快、容量最小、成本最高,越往下層儲存器的速度越慢、容量越大、成本也越低

瞭解作業系統的那些事兒,從這篇文章開始

為什麼訪問暫存器的速度這麼快呢?那是因為暫存器的材料和 CPU 是相同的,所以和訪問 CPU 比起來幾乎是沒有時延的。

暫存器的下一個層次是快取,想必大家並不陌生,通常快取的使用會帶來效能上的改善。作業系統一直都在使用快取,比如說在記憶體中保留頻繁使用的檔案,以避免從磁碟上重複地調取這些檔案。

再往下一層就是記憶體,也稱主存,通常被稱為隨機訪問儲存器(Random Access Memory,RAM)。所有不能在快取中得到滿足的訪問請求都會轉往記憶體。

除了記憶體 RAM 之外,許多計算機還具有少量的非易失性隨機存取儲存器(Read Only Memory,ROM)。它們與 RAM 不同,在電源斷電後,ROM 並不會丟失內容,其中的內容一旦儲存後就不會再被修改。而且 ROM 非常快而且便宜。

下一個層次是磁碟,其容量更大,磁碟唯一的問題就是隨機訪問資料的時間比記憶體大約慢了三個數量級,其低速的原因是因為磁碟是一種機械裝置並且擁有一種特殊的構造,如下圖所示:

瞭解作業系統的那些事兒,從這篇文章開始

在一個磁碟中有一個或多個金屬碟片,它們以 5400、7200、10800 rpm 或更高的速度旋轉。從邊緣開始有一個機械臂懸橫在盤面上,這種情形大夥可以回想一下老式的播放塑料唱片機。資訊會寫在磁碟一系列的同心圓上。在任意一個給定臂的位置,每個磁頭可以讀取一段環形區域,稱為磁軌(track)。把一個給定臂的位置上的所有磁軌合併起來,就組成了一個柱面(cylinder)。

每個磁軌劃分若干扇區,扇區的值是 512 位元組。在現代磁碟中,較外部的柱面比較內部的柱面有更多的扇區。機械臂從一個柱面移動到相鄰的柱面大約需要 1ms。而隨機移到一個柱面的典型時間為 5ms 至 10ms,其具體時間取決於驅動器。磁臂到達正確的磁軌上後,驅動器必須等待所需的扇區旋轉到磁頭之下(這大概需要 5ms 至 10ms 的時延),再開始讀寫,低端硬碟的速率是 50MB/s,而高速磁碟的速率是 160MB/s

瞭解作業系統的那些事兒,從這篇文章開始

I/O 裝置

CPU 和儲存器並不是作業系統唯一需要管理的資源,I/O 裝置與作業系統同樣密不可分。如下圖所示,I/O 裝置一般包括兩個部分:裝置控制器和裝置本身,比如鍵盤控制器和鍵盤。

裝置控制器其實就是一塊晶片或者一組晶片,它能夠接收作業系統的指令並控制物理裝置。例如,從裝置中讀取資料並完成資料的處理。

在許多情況下,實際控制裝置的過程是非常複雜而且存在諸多細節。因此控制器的工作就是為作業系統提供一個更簡單(但仍然非常複雜)的介面。

I/O 裝置另一部分是裝置本身,裝置本身有一個相對簡單的介面,這是因為介面既不能做很多工作,而且也已經被標準化了,標準化後任何一個磁碟控制器就可以適配任意一種磁碟,所以標準化是非常必要的。

3. 作業系統的四個特徵

作業系統擁有 4 個鮮明的特徵:併發、共享、虛擬和非同步。其中,併發和共享是作業系統的最基本特徵,沒有併發和共享,就談不上虛擬和非同步。

下面我們來簡單的瞭解一下這 4 個特徵,其中涉及的很多詳細概念不會在本文做出解釋,後續會陸續開更。

① 併發

併發和並行這兩個孿生兄弟,經常會讓初學者摸不著頭腦。

  • 併發:併發是指巨集觀上在一段時間內能同時執行多個程式。當然,這些程式巨集觀上是同時發生的,但微觀上是交替發生的。作業系統通過引入程式和執行緒,使得程式能夠併發執行。

  • 並行:並行則指同一時刻能執行多個指令,指兩個或多個事件在同一時刻同時發生。並行需要硬體支援,如多流水線、多核處理器或者分散式計算系統。

配合下圖形象的理解下:

瞭解作業系統的那些事兒,從這篇文章開始

說到併發與並行,不得不提 CPU,作為計算機的大腦, CPU 主要和記憶體進行互動,從記憶體中提取指令並執行。而一個程式需要放入記憶體並給它分配 CPU 才能執行,所以併發並行的能力與 CPU 的效能息息相關:

  • 單核 CPU同一時刻只能執行一個程式,各個程式只能併發地執行 ;

  • 多核 CPU同一時刻可以同時執行多個程式,多個程式可以並行地執行。

比如 Intel 的第八代 i3 處理器就是 4 核 CPU,意味著可以並行地執行 4 個程式。當然,即使是對於 4 核 CPU 來說,只要有 4 個以上的程式需要 “同時” 執行,那麼併發性依然是必不可少的,因此併發性是作業系統一個最基本的特徵

② 共享

共享即資源共享,是指系統中的資源可供記憶體中多個併發執行的程式共同使用。

主要有兩種共享方式:

1)互斥共享

所謂互斥共享,就是說雖然這個資源是共享的,所有程式都能夠使用,但是同一個資源在某一時刻只允許一個程式訪問,也稱為互斥訪問,需要用同步機制來實現互斥訪問。互斥共享/訪問的資源稱為臨界資源

舉個互斥共享的例子:

如果我們同時使用 QQ 和微信視訊,同一時間段內攝像頭資源只能分配給其中的一個程式。

2)同時共享

同時共享與互斥共享相反,允許一個時間段內多個程式 “同時” 對系統中的某些資源進行訪問。當然,所謂的 “同時” 往往是巨集觀上的,而在微觀上,這些程式可能是交替地對該資源進行訪問(即分時共享)

舉個同時共享的例子:

使用 QQ 傳送硬碟上的檔案 A,同時使用微信傳送硬碟上的檔案 B。巨集觀上看,兩邊在同時讀取併傳送檔案, 都在訪問硬碟資源,並從中讀取資料。微觀上看,QQ 和微信這兩個程式是交替訪問硬碟資源的。

併發和共享作為作業系統的兩大最基本特徵,其實是互為存在條件的。為什麼這麼說呢?這樣,我們繼續通過上述傳送檔案的例子來看併發與共享的關係(使用 QQ 傳送硬碟上的檔案 A,同時使用微信傳送硬碟上的檔案 B):

  • 併發性的體現:兩個程式正在併發執行。

    如果失去併發性,系統中只有一個程式正在執行,則共享性失去存在的意義

  • 共享性的體現:兩個程式需要共享地訪問硬碟資源。

    如果失去共享性,則 QQ 和微信不能同時訪問硬碟資源,就無法實現同時傳送檔案,併發也就無從談起

③ 虛擬

先上定義:虛擬是指把一個物理上的實體變為若干個邏輯上的對應物。物理實體(前者)是實際存在的,而邏輯上對應物(後者)是使用者感受到的。

這麼說是有點虛無縹緲了,用一個例子來理解:

上文說過,一個程式需要放入記憶體並給它分配 CPU 才能執行。那比如說 GTA5 需要 4GB 的執行記憶體,QQ 需要256MB 的記憶體,Chrome 需要 512MB 的記憶體,網易雲音樂需要 256MB 的記憶體…… 假設我們的電腦只有 4GB 記憶體且 CPU 是單核的。那麼這裡就存在如下兩個問題:

問題 1:這些程式同時執行需要的記憶體遠大於 4 GB,那麼為什麼它們還可以在我的電腦上同時執行呢?

答:這得益於虛擬記憶體技術的空間多工技術。雖然我們的電腦實際上只有 4GB 的記憶體,但是卻可以完美的同時執行這些遠大於 4G 記憶體的程式,在使用者看來似乎我們的電腦記憶體遠遠大於 4GB

問題 2:既然一個程式需要被分配 CPU 才能正常執行,那為什麼單核 CPU 的電腦中也能同時執行這麼多個程式呢?

答:這得益於虛擬記憶體技術的分時多工技術。雖然實際上只有一個單核 CPU,無法同時並行執行這麼多個程式,但是微觀上 CPU 在各個微小的時間段內交替著為各個程式服務,在使用者看來似乎我們的 CPU 是多核的

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

1)空間多工技術

空間多工技術的原理就是把記憶體作為快取記憶體來使用,只用來儲存最頻繁使用的部分程式,而把程式的大部分放在磁碟上。這種機制需要快速的映像記憶體地址,以便把程式生成的地址轉換為有關位元組在記憶體中的實體地址。這種映像由 CPU 中的一個部件,稱為儲存器管理單元(Memory Management Unit,MMU)來完成,這張圖上面我們也看過了,回顧一遍:

瞭解作業系統的那些事兒,從這篇文章開始

2)分時多工技術

多個程式能在同一個 CPU 上併發執行就是因為使用了分時多工技術,讓每個程式輪流佔用處理器,每次只執行一小個時間片並快速切換。

顯然,如果失去了併發性,一個時間段內系統中只能執行一道程式,那也就失去了實現虛擬性的意義了。因此,沒有併發性,就談不上虛擬性

④ 非同步

非同步是指:在多道程式環境下,允許多個程式併發執行,但由於資源有限,程式的執行不是一貫到底的, 而是走走停停,以不可預知的速度向前推進,這就是程式的非同步性。

舉個例子:老渣在 8 點 和 12 點要和兩個女孩併發約會,每個女孩的約會時間是 2 小時,與一、二號的約會就是兩道併發執行的程式,而老渣的心則是有限的系統資源。

由於併發執行的程式會爭搶使用系統資源,而系統中的資源有限,那麼老渣同一號或二號的 2 小時約會時間就可能無法一次性結束,而是斷斷續續的。可能 8 點到 9 點和一號約會,9 點到10 點和二號約會,然後 10 點到 11 點再和一號約會,最後 11 點到 12 點和二號約會。

瞭解作業系統的那些事兒,從這篇文章開始

如果失去了併發性,即系統只能序列地執行各個程式,那麼每個程式的執行會一貫到底。因此,只有系統擁有併發性,才有可能導致非同步性

4. 學習作業系統的核心內容

本系列的核心內容主要有以下:

  • 程式管理

  • 儲存管理

  • 檔案系統管理

  • I/O 裝置管理

① 程式管理

程式(Process)這個概念在上文中已經多次出現了,為了能更好地實現作業系統的併發性和共享性,遂引入了程式。

程式就是程式的一次執行過程,它是暫時的。不僅包含正在執行的程式實體,並且包括這個執行的程式中佔據的所有系統資源,比如說 CPU、記憶體、網路資源等。很多小夥伴在回答程式的概念的時候,往往只會說它是一個執行的實體,而會忽略掉程式所佔據的資源。比如說,同樣一個程式,同一時刻被兩次執行了,那麼他們就是兩個獨立的程式。

講到程式不得不說一嘴執行緒,一個程式中可以有多個執行緒,它們共享程式資源。

舉個例子,QQ 和 Chrome 瀏覽器是兩個程式,Chrome 程式裡面有很多執行緒,例如 HTTP 請求執行緒、事件響應執行緒、渲染執行緒等等,執行緒的併發執行使得在瀏覽器中點選一個新連結從而發起 HTTP 請求時,瀏覽器還可以響應使用者的其它事件。

我們所說的程式管理其實主要包含兩個內容:

  • 程式通訊

  • 程式排程

程式通訊顧名思義,就是程式之間的相互交流。CPU 作為計算機最寶貴的資源,一個程式需要放入記憶體並給它分配 CPU 才能執行,而一個程式可能包含多個程式,這就需要程式之間進行相互交流,彼此同步,共同完成這個程式。舉個例子,如果程式 A 產生資料而程式 B 列印資料,那麼 B 在 A 產生資料之前就必須等待,那麼 A 是不是就得給 B 發訊息,告訴 B 我生產了資料,你可以列印了。

程式排程就是說,通常情況下,會有多個程式或執行緒同時競爭 CPU,如果恰好只有一個 CPU 可用,這就導致 CPU 必須對下一個執行的程式或執行緒做出選擇,這個選擇的過程就是程式排程。

② 記憶體管理

快取記憶體作為除暫存器外最底層的儲存器,其管理是由硬體完成的,所以我們學習的內容集中在對記憶體的管理。

其實這個話題在上文作業系統的四個特徵中虛擬這個特徵時我們就說過了,記憶體一般用來儲存正在執行的程式,在非常簡單的作業系統中,記憶體中每次只能執行一個程式,如果要執行第二個程式,第一個程式就必須被移除記憶體,再把第二個程式裝入記憶體。

顯然這樣非常低效的,為此引入了虛擬記憶體技術,把記憶體作為快取記憶體來使用,只用來儲存最頻繁使用的部分程式,而把程式的大部分放在磁碟上。

那麼記憶體管理做的事情大概就是:

  • 把使用頻繁的部分程式放入記憶體

  • 當記憶體滿的時候,替換掉記憶體中的某些部分

③ 檔案系統管理

檔案其實是程式建立的資訊邏輯單元,一個磁碟可能含有幾千甚至幾百萬個檔案,每個檔案都是獨立於其他檔案的,事實上,把每個檔案看成一種地址空間更容易理解檔案的本質。

檔案同樣是受作業系統管理的,有關檔案的構造、命名、存取、使用、保護、實現和管理方法都是作業系統設計的內容,這就是檔案系統的主題。

④ I/O 裝置管理

作業系統必須高效的管理 I/O 裝置,它需要向 I/O 裝置傳送命令,捕捉中斷,並處理裝置的各種錯誤,它還應該在裝置和系統的其他部分之間提供簡單且易用的介面。

5. 核心態和使用者態

核心這個專有名詞可能會讓大家有點懵逼。這裡解釋一下。現代作業系統都採用程式的概念,為了更好的處理系統的併發性、共享性等,並使程式能夠協調地工作,僅依靠計算機硬體提供的功能是遠遠不夠的。例如,程式的排程就不能用硬體來實現,必須使用一組基本軟體對硬體資源進行改造,以便為程式的執行提供良好的執行環境,這個軟體就是核心(kernel)。

簡單來說,核心就是作業系統中的一組程式模組,作為可信軟體來提供支援程式併發執行的基本功能和基本操作,具有訪問硬體裝置和所有記憶體空間的許可權。不誇張的說,核心是作業系統的核心。

當然,作業系統除了核心程式外,還有包括其他一些基本元件,如文字編輯器、編譯器、用來與使用者進行互動的程式比如桌面系統等。

瞭解作業系統的那些事兒,從這篇文章開始

① 什麼是核心態和使用者態

那麼既然核心是程式,它需要執行,就必須被分配 CPU。因此,CPU 上會執行兩種程式,一種是作業系統的核心程式(也稱為系統程式),一種是應用程式。前者完成系統任務,後者實現應用任務。兩者之間有控制和被控制的關係,前者有權管理和分配資源,而後者只能向系統申請使用資源。

顯然,我們應該把在 CPU 上執行的這兩類程式加以區分,這就是核心態和使用者態出現的原因。

  • 核心態(kernel mode):當 CPU 處於核心態時,這是作業系統管理程式(也就是核心)執行時所處的狀態。執行在核心態的程式可以訪問計算機的任何資源,不受限制,為所欲為,例如協調 CPU 資源,分配記憶體資源,提供穩定的環境供應用程式執行等。

  • 使用者態(user mode):應用程式基本都是執行在使用者態的,或者說使用者態就是提供應用程式執行的空間。執行在使用者態的程式只能訪問當前 CPU 上執行程式所在的地址空間,這樣有效地防止了作業系統程式受到應用程式的侵害。

對作業系統來說,什麼樣的程式應該放在核心態呢?這取決於對資源的需求、時間的緊迫和效率高低等因素。比如 CPU、記憶體、裝置等資源管理器程式應該在核心態執行,否則安全性沒有保證。對於檔案系統和資料來說,檔案系統資料和管理必須放在核心態,但是使用者的資料和管理可以放在使用者態。

② 中斷機制

在合適的情況下,作業系統的核心會把 CPU 的使用權主動讓給應用程式,也就是使 CPU 從核心態轉換到使用者態。而 CPU 要想從使用者態回到核心態,只能通過中斷機制完成,如果沒有中斷機制,那麼一旦應用程式上 CPU 執行(使用者態),CPU 就會一直執行這個應用程式。也就是說,中斷是讓作業系統核心奪回 CPU 使用權的唯一途徑。可以說,作業系統是由中斷驅動的

當然,這裡的中斷機制非常廣義,包含了三種手段,也就是說從使用者態轉換到核心態有三種手段:

  • 1)程式請求作業系統服務,執行系統呼叫

  • 2)程式執行時產生外中斷事件(比如 I/O 操作完成),執行程式被中斷,轉向中斷程式處理

  • 3)在程式執行時發生內中斷(異常)事件,執行程式被打斷,轉向異常處理程式工作

以上這三種手段都是通過中斷機制來發生的,那麼接下來我們就來看看中斷到底有哪些型別。

按照中斷訊號來源於CPU 的外部還是內部,將中斷型別分為外中斷和內中斷:

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

    外中斷與當前執行的指令無關, 中斷訊號來源於 CPU 外部。如 I/O 完成中斷,表示裝置輸入/輸出處理已經完成,CPU 能夠傳送下一個輸入/輸出請求。此外還有時鐘中斷、控制檯中斷等。

  • 內中斷(也稱 異常、例外)

    內中斷與當前執行的指令有關, 中斷訊號來源於 CPU 內部。如非法操作碼、地址越界、算術溢位,除數為 0 等。

瞭解作業系統的那些事兒,從這篇文章開始

這裡簡單解釋一下中斷機制的基本原理:不同的中斷訊號,肯定是需要用不同的中斷處理程式來處理的。那麼當 CPU 檢測到中斷訊號後,就會根據中斷訊號的型別去查詢中斷向量表,以此來找到相應的中斷處理程式在記憶體中的存放位置。

瞭解作業系統的那些事兒,從這篇文章開始

③ 系統呼叫

如上文所說,程式通過執行系統呼叫,也可以使得 CPU 從使用者態轉向核心態。那麼系統呼叫和中斷有啥關係呢?為什麼說這種方式也屬於中斷機制的一種呢?那是因為系統呼叫是通過陷入指令完成的,該指令會引發內中斷。

說的更詳細點,作業系統作為計算機硬體之上的第一層軟體,需要向上層提供一些簡單易用的服務,這個上層包括使用者和應用程式:

瞭解作業系統的那些事兒,從這篇文章開始

給使用者提供的介面有圖形介面 GUI 和命令介面,給應用程式提供的是程式介面,這個程式介面就是由一組系統呼叫組成的,是作業系統提供給開發人員使用的。可以理解為一種可供應用程式呼叫的特殊函式,應用程式可以通過系統呼叫來請求獲得作業系統核心的服務

瞭解作業系統的那些事兒,從這篇文章開始

 

系統呼叫的過程簡略版大致如下:

1)在使用者態,應用程式傳遞系統呼叫引數

2)執行陷入指令,引發一個內中斷,使 CPU 進入核心態

3)在核心態,執行相應的請求,核心程式處理系統呼叫

4)返回應用程式

思考一下為什麼系統呼叫是必須的

舉個例子:我們去學校列印店列印論文,你按下了 WPS 的 “列印” 選項,於是印表機開始工作。 你的論文列印到一半時,另一位同學按下了 Word 的 “列印” 按鈕,開始列印他自己的論文。想象一下如果兩個程式可以隨意的、併發的共享印表機資源,會發生什麼情況?

顯然,兩個程式併發執行,導致印表機裝置交替的收到 WPS 和 Word 兩個程式發來的列印請求,結果兩篇論文的內容混雜在一起了

如何解決這個問題?這就需要作業系統核心對共享資源進行統一的管理,並向上層提供 “系統呼叫” ,執行在使用者態的應用程式或者程式想要使用印表機這種共享資源,只能通過系統呼叫向作業系統核心發出請求,然後核心會對各個請求進行協調處理(程式排程)。

通過上面這個例子,我們就可以總結出什麼功能會用到系統呼叫:凡是與共享資源有關的操作(比如記憶體分配、I/O 操作、檔案管理等),都必須通過系統呼叫的方式向作業系統核心提出請求,由作業系統核心代為完成。這樣可以保證系統的穩定性和安全性,防止使用者進行非法操作。這些系統呼叫按功能大致可分為如下幾類:

  • 裝置管理。完成裝置的請求或釋放,以及裝置啟動等功能。

  • 檔案管理。完成檔案的讀、寫、建立及刪除等功能。

  • 程式控制。完成程式的建立、撤銷、阻塞及喚醒等功能。

  • 程式通訊。完成程式之間的訊息傳遞或訊號傳遞等功能。

  • 記憶體管理。完成記憶體的分配、回收以及獲取作業佔用記憶體區大小及地址等功能。

6. 總結

縫縫補補終於寫完了,說實話,這種系列綜述類的文章真的難寫,既要照顧知識體系完整度,保證每個模組都能涉及,又不能講的太深太細,還需要循序漸進,防止陡然出現一個並未介紹的專有名詞。

OK,抓住春節的尾巴,祝大家新年快樂,牛年大吉 ?,作業系統系列就此開篇了~

參考資料

? 關注公眾號 | 飛天小牛肉,即時獲取更新

  • 博主東南大學碩士在讀,利用課餘時間運營一個公眾號『 飛天小牛肉 』,2020/12/29 日開通,專注分享計算機基礎(資料結構 + 演算法 + 計算機網路 + 資料庫 + 作業系統 + Linux)、Java 基礎和麵試指南的相關原創技術好文。本公眾號的目的就是讓大家可以快速掌握重點知識,有的放矢。希望大家多多支援哦,和小牛肉一起成長 ?

  • 並推薦個人維護的開源教程類專案: CS-Wiki(Gitee 推薦專案,現已 1.0k+ star), 致力打造完善的後端知識體系,在技術的路上少走彎路,歡迎各位小夥伴前來交流學習 ~ ?

相關文章