公衆号關注 “程式員遇見GitHub”
設為“ 星标”,重磅幹貨,第一時間送達。

在前文中,我們知道大多數作業系統都能夠為底層硬體提供抽象的作用,作為中間人進行上層應用軟體與下層硬體資源的管理,以及對下層硬體進行接口層面抽象以幫助上層應用軟體的調用。
在上下的資源和資訊的互動中,作業系統的必須要提供一種從抽象到具體的實際概念用來幫助建立更好的通信和交流。是以這篇文章也就是從作業系統的一些基本概念出發,介紹作業系統是如何在硬體與應用軟體中建立起準确的通信橋梁。
作業系統六大概念
1 程序
程序與程式
作業系統之中最為通用的概念就是「程序」。與此相關的面試題以及各種技術優化政策也層出不窮,足以夠證明它對于了解作業系統中舉足輕重的地位。事實上,通過「程序」,程式員可以更為直覺的了解自己所開發的軟體,并且能夠從中深刻的認識到作業系統在軟體運作做了些什麼。
簡單來講,程序就是正在執行的程式。每個程序都包含有屬于自己的一段位址空間,可以看作是一部分記憶體空間。在這樣的位址空間中,程序能夠根據需要進行記憶體的讀寫。
位址空間裡面一般包含可執行程式,以及對應程式的資料及其堆棧。與每個程序相關的還有一組資源,通常包括寄存器(包括程式計數器和堆棧指針)以及運作程式所需的所有其他資訊。從這可以看出,程式本身隻是指令、資料以及其組織形式的一種描述方式,而程式的實際的運作執行個體就是一個程序。
不過程序與程式也并不完全等同,他們不是簡單的一一對應的關系,而是在不同層面的表現形式。他們的主要差別在于:
- 程式是程序的靜态文本,而程序是執行程式的動态過程;
- 程序與程式不是一一對應,同一程式可在不同程序中運作,一個程序也可以執行多個程式;
- 程式是一種長期可儲存的文本,程序是暫時的一次執行過程;
- 程序是作業系統配置設定排程的獨立機關,而程式是作業系統層級之上的應用程式。
程序狀态
從上面我們知道,程序可看作是程式運作的動态過程。那麼為了更好的對程序進行描述,我們給運作中的程序定義了三種基本狀态,包括就緒、執行和阻塞。
這就是所謂的三态模型,描述了程序在整個運作周期中狀态變化。每個狀态的轉移過程可以通過下圖來表示。
三态模型
就緒狀态
是指程序已經被配置設定到了所有必需的資源,除了
CPU
。在這個狀态下,程序處于箭在弦上随時待發的狀态,隻要一獲得
CPU
的執行權限,程序便會立刻執行,進而進入執行狀态。
當有多個處于就緒狀态的程序時,不同的程序會根據優先級被劃分入不同的隊列。一個因為時間片用完而進入就緒狀态的程序會被劃分入低優先級隊列,而因為
I/O
操作完成而進入就緒狀态的程序,則會被劃分入高優先級隊列。
執行狀态
是指程序正常運作的狀态。而當處于執行狀态的程序由于需要等待某個事件發送(通常為等待
I/O
)時,就會放棄
CPU
,進而進入暫時的阻塞狀态。
CPU
這時一旦空出,通過不同的排程算法,
CPU
又會被配置設定給另一個就緒程序。
阻塞狀态
相當于就緒狀态和執行狀态的一個緩沖狀态。當處于執行狀态的程序無法正常執行時,會先進入阻塞狀态,等待需要的請求執行完成,再回到就緒狀态,等待下一次的
CPU
配置設定和執行。
三态模式是用來描述程序狀态轉移最為精簡的模型,實際上光這三種狀态是無法處理複雜的程序運作過程的。是以為了對程序進行更好的管理和排程,在三态模型的基礎上引入了兩種程序狀态,即
建立狀态
和
終止狀态
,這就有了五态模型。
五态模型
建立狀态
是指程序剛剛建立的狀态,在這個狀态下,需要等待作業系統完成建立和配置設定程序的各種所需資訊,包括建立
PCB(Process Control Block)
、加載程式并建立位址空間等。在完成這些準備工作後,該程序的狀态就會轉移為就緒狀态并劃分入就緒隊列中。
PCB:程序控制塊,用于存放程序的管理和控制資訊的資料結構
建立狀态看起來好像沒什麼太多用處,畢竟程序就緒的時候肯定完成了建立。但是之是以還是要引入,還是為了確定程序控制塊的完整。隻有在建立狀态完成了程序完整的準備工作(
PCB
生成建立及資源配置設定),才能進入就緒狀态。
這樣就保證了處于就緒狀态程序的正确性,同時也提升了作業系統對程序的管理的靈活性。作業系統可以從一開始就對程序的建立和資源配置設定進行管理,更大程度上節省了系統資源的調控。
終止狀态
代表着程序的結束,當程序執行完成後,需要作業系統在終止狀态對程序的運作結果進行善後處理。這樣的善後處理包括對程序所使用的資源進行回收,并将其它程序所需要的資訊傳遞出去。最後,作業系統還需要對終止的程序進行記憶體釋放,将其
PCB
中的内容清空,并将這部分記憶體返還給系統。
終止狀态意味着程序的執行周期的結束,但卻并不表示程序是正常結束的。當一個程序出現了無法預知的錯誤或者被作業系統或其它程序所終止時,它都會進入終止狀态,進行各種資源的回收。
事實上即使是程序的五态模型也不足以用來描述程序複雜的運作過程。由于系統内部資源的限制,并不是為所有程序運作的要求都能夠滿足,是以在這個基礎上,又引入了程序的挂起就緒狀态以及對應的挂起阻塞狀态。
程序的七态模型
在七态模型中,活躍就緒是指程序在主存并且可被排程的狀态。而靜止就緒狀态是指就緒程序被對換到輔存時的狀态,它是不能被直接排程的狀态,隻有當主存中沒有活躍就緒态程序,或者是挂起态程序具有更高的優先級時,系統才會把挂起就緒态程序調回主存并轉換為活躍就緒狀态。
活躍阻塞狀态是指程序在主存,一旦等待的事件産生便會進入活躍就緒狀态。靜止阻塞是指阻塞程序對換到輔存時的狀态,一旦等待的事件産生便進入靜止就緒狀态。
程序相關的知識點實在是太多了,包括
PCB
、程序間通信以及和線程相關的概念和基礎都是非常重要的知識。但是由于這篇文章的篇幅限制,不好在這裡過多展開。
隻是點到為止的介紹線程的狀态模型,具體程序和線程的内容将會在之後幾篇文章中詳細展開介紹。
之是以花大力氣來介紹線程模型,隻因為這是線程跟作業系統關系最為直覺的聯系所在。
不斷優化線程模型的目的就是為了使得作業系統能夠更好的去管理程式軟體和資源配置設定的問題。
通過對線程的管理來達到資源合理調配的目的。這本身也就是作業系統作用的重要展現之一,可謂是作業系統的第一大靈魂概念。
2 位址空間
位址空間的概念在程序的介紹中略有提及,實際上也與程序有不可分割的關系。一般上的了解上,每個程序擁有其對應的位址空間,存儲着該程序用于程式運作時所需的資訊和資料。
我們知道,每台計算機都有一些主記憶體,用于儲存正在執行的程式。在一個非常簡單的作業系統中,一次隻有一個程式在記憶體中運作。要運作第二個程式,必須删除第一個程式,然後将第二個程式放在記憶體中。
更複雜的作業系統就能夠解決這樣的問題,它們可以允許多個程式同時存儲在記憶體中。同時為了防止它們互相幹擾(以及與作業系統之間的串擾),會采取某種一般存在于硬體中的保護機制。
通常,每個程序都有其可以使用的一組位址,通常從
到某個位址最大值。在最簡單的情況下,程序具有的最大位址空間量小于主存儲器的總容量。這樣,程序可以填滿它的位址空間,并且在主記憶體中也有足夠的空間容納這些資訊。
但是,如果某個程序的位址空間大于計算機的主記憶體,并且該程序想全部使用它,該怎麼辦?
在最初的計算機中,這樣的要求是十分過分的。而如今,好在有一種稱為虛拟記憶體的技術,作業系統能夠将位址空間抽象化為程序可以引用的位址集,進而使得位址空間與計算機的實體記憶體分離。這樣一來,程序的位址空間就有可能大于計算機的實體記憶體。
位址空間和實體記憶體的管理是作業系統功能的重要組成部分,同樣也是深入了解作業系統進/線程管理的基礎。
3 檔案
幾乎所有作業系統都支援的另一個關鍵概念就是檔案系統。作業系統的主要功能是隐藏磁盤和其他
I/O
裝置的特性,并為程式員提供一個與裝置或硬體無關的檔案的簡潔漂亮的抽象模型。
顯然需要通過作業系統的調用來建立檔案,删除檔案,讀取檔案和寫入檔案。在讀取檔案之前,必須先将其放在磁盤上并打開,在讀取檔案後應将其關閉,以便能夠提供調用來執行這些操作。
層次結構
為了提供存放以及找到檔案的位置,大多數
PC
作業系統都具有目錄的概念,該目錄是将檔案分組在一起的一種方式。目錄是以檔案夾的形式進行展現,可以在檔案夾中嵌套多個目錄。
整個檔案系統的模型是一個層次結構,就像是一顆多叉樹。從最頂層的檔案夾依次以樹幹、樹枝的形式進行查找,就可以搜尋到最底部的檔案目錄。
檔案結構
目錄層次結構中的每個檔案都可以通過在目錄層次結構的頂部(根目錄)給出其路徑名來指定。這樣的絕對路徑名包含必須從根目錄周遊才能到達檔案的目錄清單,并用斜杠分隔各個元件。
D:/study/學習資源/個人/私は學ぶのが大好きです.mp4
每個程序都會有一個目前的工作目錄,在該目錄中查找不以斜杠開頭的路徑名。這就是所謂的相對路徑。此外,程序可以通過發出指定新工作目錄的系統調用來更改其工作目錄。
需要注意的一點是,在讀寫檔案之前,必須先打開該檔案,然後再檢查權限。如果允許通路,系統将傳回一個稱為檔案描述符的小整數,以用于後續操作。如果禁止通路,則傳回錯誤代碼。
挂載
在作業系統的檔案系統中,另一個重要概念就是挂載。大多數台式計算機都有一個或多個CD光牒驅動器,可以在其中插入
CD-ROM
,
DVD
和CD光牒。(下面以
Unix
系統為例進行介紹)
這些計算機以外的CD光牒驅動器實際上都可看作是一個檔案系統,并且與計算機本身硬碟上的根檔案系統是互相獨立,彼此無關的。為了提供一種優雅的方式來處理這些可移動媒體,作業系統允許将CD光牒上的檔案系統附加到根檔案系統的主樹上,這就是挂載。
但是,由于無法在
CD-ROM
上指定路徑名,是以無法使用該檔案系統。
UNIX
不允許使用驅動器名稱或數字作為路徑名的字首。這是作業系統應該消除的對于裝置的依賴性。取而代之的是,系統調用允許
CD-ROM
上的檔案系統附加到根檔案系統。
在下圖中,
CD-ROM
上的檔案系統已安裝在目錄
b
中,是以可以通路檔案
/b/x
和
/b/y
。如果目錄
b
包含其它檔案,則在安裝
CD-ROM
時将無法通路它們,因為
/b
将引用
CD-ROM
的根目錄。不過一般而言,檔案系統幾乎總是挂在空目錄上。如果系統包含多個硬碟,它們也都可以挂載到單個樹中。
挂載前的檔案系統
挂載後的檔案系統
專用檔案
檔案系統中的另一個重要概念是專用檔案。提供專用檔案的作用是為了使
I/O
裝置看起來像檔案。這樣,可以使用與讀寫檔案相同的系統調用來讀寫它們。
存在兩種專用檔案:塊特殊檔案和字元特殊檔案。塊特殊檔案用于對裝置進行模組化,這些裝置由一組可随機尋址的塊(例如磁盤)組成。通過打開一個塊專用檔案并讀取進行,這樣一來程式就可以直接通路裝置上相應的塊,而無需考慮其上包含的檔案系統的結構。
同樣,字元專用檔案可用于對列印機,數據機和其他接受或輸出字元流的裝置進行模組化。按照慣例,特殊檔案儲存在
/dev
目錄中。例如,
dev/lp
可能是列印機(曾經稱為行式列印機)。
除此之外,還有一個特殊的檔案,就是管道。沒錯,就是用來程序間通信的那個。事實上,管道是一種僞檔案,可用于連接配接兩個程序。如果程序
A
和
B
希望使用管道進行通話,則必須提前進行設定。
管道
當程序A想要将資料發送到程序B時,它将寫在管道上,就好像它是輸出檔案一樣。實際上,管道的實作與檔案的實作非常相似。程序B可以通過從管道讀取資料來讀取資料,就像它是輸入檔案一樣。
是以,程序之間的通信非常類似于普通檔案的讀寫。更強大的是,當程序發現正在寫入的輸出檔案不是真正的檔案,而是管道時,就會進行特殊的系統調用。當然具體的實作這裡就不展開了,之後在講程序間通信時再詳細介紹。持續關注,收獲更多哦~
4 輸入/輸出
所有計算機都具有用于擷取輸入和産生輸出的實體裝置,這就是所謂的
I/O
。畢竟,如果使用者在完成要求的工作後不知道該怎麼辦并且無法獲得結果,那麼計算機将有什麼用?
現代計算機中存在多種輸入和輸出裝置,包括鍵盤,滑鼠,顯示器,列印機等。這些裝置都是由作業系統進行管理和資源的配置設定。
是以,每個作業系統都有一個
I/O
子系統來管理其
I/O
裝置。某些
I/O
軟體與裝置無關,也就是說,它們同樣适用于許多或所有
I/O
裝置。其它的
I/O
軟體(例如裝置驅動程式)則會用于特定的
I/O
裝置。
依據
I/O
裝置工作方式的不同,通常進行如下分類:
(1)字元裝置
character device
,又叫做人機互動裝置。使用者通過這些裝置實作與計算機系統的通信。它們大多是以字元為機關發送和接受資料的,資料通信的速度比較慢。
例如,鍵盤和顯示器為一體的字元終端、列印機、掃描器、包括滑鼠等,還有早期的卡片和紙帶輸入和輸出機。含有顯示卡的圖形顯示器的速度相對較快,可以用來進行圖像進行中的複雜圖形的顯示。
(2)塊裝置
block device
,又叫外部存儲器,使用者通過這些裝置實作程式和資料的長期儲存。與字元裝置相比,它們是以塊為機關進行傳輸的,如磁盤、錄音帶和CD光牒等。塊的常見尺寸為
512~32768B
之間。
(3)網絡通信裝置。這類裝置主要有網卡、數據機等,主要用于與遠端裝置的通信。這類裝置的傳輸速度比字元裝置高,但比外部存儲器低。
5 保護
我們知道作業系統可以對程序和資源進行管理和控制,而在這個管理過程中,程序運作的正确性必須要得以保證。是以,作業系統内部需要提供一種保護機制來確定程序運作和擷取資源的正确性。
從概念上來說,作業系統的保護是指一種控制程式、程序或使用者對計算機系統資源進行通路的機制。作業系統中的程序必須加以保護,使其免受其他程序活動的幹擾。各種機制是為了確定隻有從作業系統中獲得了恰當授權的程序才可以操作相應的檔案、記憶體段、
CPU
和其他的資源。
通俗點說,計算機包含大量使用者經常希望保護和保密的資訊。這些資訊可能包括電子郵件,商業計劃書,納稅申報單等等。作業系統需要采取一些機制來管理系統的安全性。例如,某些重要檔案隻能由授權使用者通路。
通過為每個檔案配置設定一個
9
位的二進制保護代碼來保護系統中的檔案。保護代碼由三個
3
位字段組成,一個用于所有者,一個用于所有者組的其他成員,另一個用于其他所有者。
每個字段都有
3
位,一位表示讀權限,一位表示寫權限,一位表示執行權限,這
3
個位稱為
rwx
位。例如,保護代碼
rwxr-x--x
表示所有者可以讀取,寫入和執行檔案,其他組成員可以讀取或執行(但不能寫入)檔案,其他所有者都可以執行(但不能讀取或寫入)檔案。
除了檔案保護之外,作業系統還存在許多其他安全方面的保護機制。這些機制貫穿在作業系統的各個方面,進而能夠保證其在資源配置設定以及程式運作中的可靠性。
6 虛拟記憶體
虛拟記憶體想必都不會陌生,它主要是解決實體記憶體所帶來的一系列局限問題。虛拟記憶體能夠通過在
RAM
和磁盤之間快速來回移動程式來運作比計算機實體記憶體更大的程式。
因為虛拟記憶體的存在,使得應用程式以為它擁有了連續可用的記憶體,即一個連續完整的位址空間。而實際上,它在實體記憶體中可能并不連續,通常是被分隔成多個實體記憶體碎片,甚至還有部分暫時存儲在外部磁盤存儲器上,在需要時才進行資料交換。
總的來說,虛拟記憶體将主存看成是一個存儲在磁盤空間上的位址空間的高速緩存,主存中隻儲存活動的區塊,并根據需要在磁盤和主存之間來回傳送資料。同時,它為程序提供了一緻的位址空間,進而簡化了記憶體管理。
除此之外,作業系統為每個程序提供了一個獨立的虛拟位址空間,進而保護了每個程序的位址空間不被其他程序破壞。
由此可見,虛拟記憶體的提出解決了記憶體空間使用率問題、讀寫記憶體的安全性問題、程序間的通信安全問題以及記憶體讀寫的效率問題。現在大多數作業系統都使用了虛拟記憶體,已經成為作業系統中最為基礎的概念之一。
7 總結
這幾個概念在作業系統的學習體系中非常常見,是繞不開的了解點。當然了,如果将這幾個概念展開來說都不是幾篇萬字長文能夠介紹得完的。是以也不用慌,收藏起來慢慢了解,逐漸深入。
本文就是單從概念的角度來介紹這六個重要名詞在作業系統中的作用,進而展現出作業系統設計管理的思想。
關于作業系統的文章之後還會持續放出,讓大家循序漸進的了解這一門及其重要的學科領域。之後關于線程和程序關系、進線程的通信和同步、虛拟記憶體的實作機制、檔案系統等等方面的文章都會依次推送,還請持續關注支援哦~~
你們的支援就是我的動力鴨!下期見~
推薦閱讀:
我教你如何讀博!
牛逼!輕松高效處理文本資料神器
B站強化學習大結局!
如此神器,得之可得頂會!
兄弟們!神經網絡畫圖,有它不愁啊
太贊了!東北大學朱靖波,肖桐團隊開源《機器翻譯:統計模組化與深度學習方法》
當年畢業答辯!遺憾沒有它...
已開源!所有李航老師《統計學習方法》代碼實作
這個男人,驚為天人!手推PRML!
它來了!《深度學習》(花書) 數學推導、原理剖析與代碼實作
你們心心念念的MIT教授Gilbert Strang線性代數彩闆筆記!強烈推薦!
GitHub超過9800star!學習Pytorch,有這一份資源就夠了!強推!
你真的懂神經網絡?強推一個揭秘神經網絡的工具,ANN Visualizer
諸位!看我如何白嫖2020 icassp!
這個時代研究情感分析,是最好也是最壞!
BERT雄霸天下!
玩轉Pytorch,搞懂這個教程就可以了,從GAN到詞嵌入都有執行個體
是他,是他,就是他!寶藏部落客讓你秒懂Transformer、BERT、GPT!
fitlog!複旦邱錫鵬老師組内部調參工具!一個可以節省一篇論文的調參利器
Github開源!查閱arXiv論文新神器,一行代碼比較版本差别,我愛了!
開源!資料結構與算法必備的 50 個代碼實作
他來了!吳恩達帶着2018機器學習入門高清視訊,還有習題解答和課程拓展來了!
太贊了!複旦邱錫鵬老師NLP實戰code解讀開源!
這塊酷炫的Python神器!我真的愛了,幫助你深刻了解語言本質!實名推薦!
論文神器!易搜搭
不瞞你說!這可能是世界上最好的線性代數教程
W10系統matlab無法儲存對該路徑的更改 pathdef_超幹貨 | 這些概念可是作業系統的靈魂,你弄懂了幾個?...