超乾貨 | 這些概念但是操做系統的靈魂,你弄懂了幾個?

前文中,咱們知道大多數操做系統都可以爲底層硬件提供抽象的做用,做爲中間人進行上層應用軟件與下層硬件資源的管理,以及對下層硬件進行接口層面抽象以幫助上層應用軟件的調用。程序員

在上下的資源和信息的交互中,操做系統的必需要提供一種從抽象到具體的實際概念用來幫助創建更好的通訊和交流。因此這篇文章也就是從操做系統的一些基本概念出發,介紹操做系統是如何在硬件與應用軟件中創建起準確的通訊橋樑。web

操做系統六大概念

1 進程

進程與程序

操做系統之中最爲通用的概念就是「進程」。與此相關的面試題以及各類技術優化策略也層出不窮,足以夠證實它對於理解操做系統中舉足輕重的地位。事實上,經過「進程」,程序員能夠更爲直觀的理解本身所開發的軟件,而且可以從中深入的認識到操做系統在軟件運行作了些什麼。面試

簡單來說,進程就是正在執行的程序。每一個進程都包含有屬於本身的一段地址空間,能夠看做是一部份內存空間。在這樣的地址空間中,進程可以根據須要進行內存的讀寫。算法

地址空間裏面通常包含可執行程序,以及對應程序的數據及其堆棧。與每一個進程相關的還有一組資源,一般包括寄存器(包括程序計數器和堆棧指針)以及運行程序所需的全部其餘信息。從這能夠看出,程序自己只是指令、數據以及其組織形式的一種描述方式,而程序的實際的運行實例就是一個進程。緩存

不過進程與程序也並不徹底等同,他們不是簡單的一一對應的關係,而是在不一樣層面的表現形式。他們的主要區別在於:安全

  • 程序是進程的靜態文本,而進程是執行程序的動態過程;
  • 進程與程序不是一一對應,同一程序可在不一樣進程中運行,一個進程也能夠執行多個程序;
  • 程序是一種長期可保存的文本,進程是暫時的一次執行過程;
  • 進程是操做系統分配調度的獨立單位,而程序是操做系統層級之上的應用程序。

進程狀態

從上面咱們知道,進程可看做是程序運行的動態過程。那麼爲了更好的對進程進行描述,咱們給運行中的進程定義了三種基本狀態,包括就緒、執行和阻塞。微信

這就是所謂的三態模型,描述了進程在整個運行週期中狀態變化。每一個狀態的轉移過程能夠經過下圖來表示。網絡

三態模型

就緒狀態 是指進程已經被分配到了全部必需的資源,除了CPU。在這個狀態下,進程處於箭在弦上隨時待發的狀態,只要一得到CPU的執行權限,進程便會馬上執行,從而進入執行狀態。數據結構

當有多個處於就緒狀態的進程時,不一樣的進程會根據優先級被劃分入不一樣的隊列。一個由於時間片用完而進入就緒狀態的進程會被劃分入低優先級隊列,而由於I/O操做完成而進入就緒狀態的進程,則會被劃分入高優先級隊列。架構

執行狀態 是指進程正常運行的狀態。而當處於執行狀態的進程因爲須要等待某個事件發送(一般爲等待I/O)時,就會放棄CPU,從而進入暫時的阻塞狀態。CPU這時一旦空出,經過不一樣的調度算法,CPU又會被分配給另外一個就緒進程。

阻塞狀態 至關於就緒狀態和執行狀態的一個緩衝狀態。當處於執行狀態的進程沒法正常執行時,會先進入阻塞狀態,等待須要的請求執行完成,再回到就緒狀態,等待下一次的CPU分配和執行。

三態模式是用來描述進程狀態轉移最爲精簡的模型,實際上光這三種狀態是沒法處理複雜的進程運行過程的。因此爲了對進程進行更好的管理和調度,在三態模型的基礎上引入了兩種進程狀態,即建立狀態終止狀態,這就有了五態模型。

五態模型

建立狀態 是指進程剛剛建立的狀態,在這個狀態下,須要等待操做系統完成建立和分配進程的各類所需信息,包括創建PCB(Process Control Block)、加載程序並建立地址空間等。在完成這些準備工做後,該進程的狀態就會轉移爲就緒狀態並劃分入就緒隊列中。

PCB:進程控制塊,用於存放進程的管理和控制信息的數據結構

建立狀態看起來好像沒什麼太多用處,畢竟進程就緒的時候確定完成了建立。可是之因此仍是要引入,仍是爲了確保進程控制塊的完整。只有在建立狀態完成了進程完整的準備工做(PCB生成建立及資源分配),才能進入就緒狀態。

這樣就保證了處於就緒狀態進程的正確性,同時也提高了操做系統對進程的管理的靈活性。操做系統能夠從一開始就對進程的建立和資源分配進行管理,更大程度上節省了系統資源的調控。

終止狀態 表明着進程的結束,當進程執行完成後,須要操做系統在終止狀態對進程的運行結果進行善後處理。這樣的善後處理包括對進程所使用的資源進行回收,並將其它進程所須要的信息傳遞出去。最後,操做系統還須要對終止的進程進行內存釋放,將其PCB中的內容清空,並將這部份內存返還給系統。

終止狀態意味着進程的執行週期的結束,但卻並不表示進程是正常結束的。當一個進程出現了沒法預知的錯誤或者被操做系統或其它進程所終止時,它都會進入終止狀態,進行各類資源的回收。

事實上即便是進程的五態模型也不足以用來描述進程複雜的運行過程。因爲系統內部資源的限制,並非爲全部進程運行的要求都可以知足,所以在這個基礎上,又引入了進程的掛起就緒狀態以及對應的掛起阻塞狀態。

進程的七態模型

在七態模型中,活躍就緒是指進程在主存而且可被調度的狀態。而靜止就緒狀態是指就緒進程被對換到輔存時的狀態,它是不能被直接調度的狀態,只有當主存中沒有活躍就緒態進程,或者是掛起態進程具備更高的優先級時,系統纔會把掛起就緒態進程調回主存並轉換爲活躍就緒狀態。

活躍阻塞狀態是指進程在主存,一旦等待的事件產生便會進入活躍就緒狀態。靜止阻塞是指阻塞進程對換到輔存時的狀態,一旦等待的事件產生便進入靜止就緒狀態。

進程相關的知識點實在是太多了,包括PCB、進程間通訊以及和線程相關的概念和基礎都是很是重要的知識。可是因爲這篇文章的篇幅限制,很差在這裏過多展開。

只是點到爲止的介紹線程的狀態模型,具體進程和線程的內容將會在以後幾篇文章中詳細展開介紹。

之因此花大力氣來介紹線程模型,只由於這是線程跟操做系統關係最爲直觀的聯繫所在。

不斷優化線程模型的目的就是爲了使得操做系統可以更好的去管理程序軟件和資源分配的問題。

經過對線程的管理來達到資源合理調配的目的。這自己也就是操做系統做用的重要體現之一,可謂是操做系統的第一大靈魂概念。

2 地址空間

地址空間的概念在進程的介紹中略有說起,實際上也與進程有不可分割的關係。通常上的理解上,每一個進程擁有其對應的地址空間,存儲着該進程用於程序運行時所需的信息和數據。

咱們知道,每臺計算機都有一些主內存,用於保存正在執行的程序。在一個很是簡單的操做系統中,一次只有一個程序在內存中運行。要運行第二個程序,必須刪除第一個程序,而後將第二個程序放在內存中。

更復雜的操做系統就可以解決這樣的問題,它們能夠容許多個程序同時存儲在內存中。同時爲了防止它們相互干擾(以及與操做系統之間的串擾),會採起某種通常存在於硬件中的保護機制。

一般,每一個進程都有其可使用的一組地址,一般從0到某個地址最大值。在最簡單的狀況下,進程具備的最大地址空間量小於主存儲器的總容量。這樣,進程能夠填滿它的地址空間,而且在主內存中也有足夠的空間容納這些信息。

可是,若是某個進程的地址空間大於計算機的主內存,而且該進程想所有使用它,該怎麼辦?

在最初的計算機中,這樣的要求是十分過度的。而現在,好在有一種稱爲虛擬內存的技術,操做系統可以將地址空間抽象化爲進程能夠引用的地址集,從而使得地址空間與計算機的物理內存分離。這樣一來,進程的地址空間就有可能大於計算機的物理內存。

地址空間和物理內存的管理是操做系統功能的重要組成部分,一樣也是深刻理解操做系統進/線程管理的基礎。

3 文件

幾乎全部操做系統都支持的另外一個關鍵概念就是文件系統。操做系統的主要功能是隱藏磁盤和其餘I/O設備的特性,併爲程序員提供一個與設備或硬件無關的文件的簡潔漂亮的抽象模型。

顯然須要經過操做系統的調用來建立文件,刪除文件,讀取文件和寫入文件。在讀取文件以前,必須先將其放在磁盤上並打開,在讀取文件後應將其關閉,以便可以提供調用來執行這些操做。

層次結構

爲了提供存放以及找到文件的位置,大多數PC操做系統都具備目錄的概念,該目錄是將文件分組在一塊兒的一種方式。目錄是以文件夾的形式進行展示,能夠在文件夾中嵌套多個目錄。

整個文件系統的模型是一個層次結構,就像是一顆多叉樹。從最頂層的文件夾依次以樹幹、樹枝的形式進行查找,就能夠搜索到最底部的文件目錄。

文件結構

目錄層次結構中的每一個文件均可以經過在目錄層次結構的頂部(根目錄)給出其路徑名來指定。這樣的絕對路徑名包含必須從根目錄遍歷才能到達文件的目錄列表,並用斜槓分隔各個組件。

D:/study/學習資源/我的/私は學ぶのが大好きです.mp4

每一個進程都會有一個當前的工做目錄,在該目錄中查找不以斜槓開頭的路徑名。這就是所謂的相對路徑。此外,進程能夠經過發出指定新工做目錄的系統調用來更改其工做目錄。

須要注意的一點是,在讀寫文件以前,必須先打開該文件,而後再檢查權限。若是容許訪問,系統將返回一個稱爲文件描述符的小整數,以用於後續操做。若是禁止訪問,則返回錯誤代碼。

掛載

在操做系統的文件系統中,另外一個重要概念就是掛載。大多數臺式計算機都有一個或多個光盤驅動器,能夠在其中插入CD-ROMDVD和光盤。(下面以Unix系統爲例進行介紹)

這些計算機之外的光盤驅動器實際上均可看做是一個文件系統,而且與計算機自己硬盤上的根文件系統是相互獨立,彼此無關的。爲了提供一種優雅的方式來處理這些可移動介質,操做系統容許將光盤上的文件系統附加到根文件系統的主樹上,這就是掛載。

可是,因爲沒法在CD-ROM上指定路徑名,所以沒法使用該文件系統。UNIX不容許使用驅動器名稱或數字做爲路徑名的前綴。這是操做系統應該消除的對於設備的依賴性。取而代之的是,系統調用容許CD-ROM上的文件系統附加到根文件系統。

在下圖中,CD-ROM上的文件系統已安裝在目錄b中,所以能夠訪問文件/b/x/b/y。若是目錄b包含其它文件,則在安裝CD-ROM時將沒法訪問它們,由於/b將引用CD-ROM的根目錄。不過通常而言,文件系統幾乎老是掛在空目錄上。若是系統包含多個硬盤,它們也均可以掛載到單個樹中。

掛載前的文件系統
掛載後的文件系統

專用文件

文件系統中的另外一個重要概念是專用文件。提供專用文件的做用是爲了使I/O設備看起來像文件。這樣,可使用與讀寫文件相同的系統調用來讀寫它們。

存在兩種專用文件:塊特殊文件和字符特殊文件。塊特殊文件用於對設備進行建模,這些設備由一組可隨機尋址的塊(例如磁盤)組成。經過打開一個塊專用文件並讀取進行,這樣一來程序就能夠直接訪問設備上相應的塊,而無需考慮其上包含的文件系統的結構。

一樣,字符專用文件可用於對打印機,調制解調器和其餘接受或輸出字符流的設備進行建模。按照慣例,特殊文件保存在/dev目錄中。例如,dev/lp多是打印機(曾經稱爲行式打印機)。

除此以外,還有一個特殊的文件,就是管道。沒錯,就是用來進程間通訊的那個。事實上,管道是一種僞文件,可用於鏈接兩個進程。若是進程AB但願使用管道進行通話,則必須提早進行設置。

管道

當進程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,又叫外部存儲器,用戶經過這些設備實現程序和數據的長期保存。與字符設備相比,它們是以塊爲單位進行傳輸的,如磁盤、磁帶和光盤等。塊的常見尺寸爲512~32768B之間。

(3)網絡通訊設備。這類設備主要有網卡、調制解調器等,主要用於與遠程設備的通訊。這類設備的傳輸速度比字符設備高,但比外部存儲器低。

5 保護

咱們知道操做系統能夠對進程和資源進行管理和控制,而在這個管理過程當中,進程運行的正確性必需要得以保證。所以,操做系統內部須要提供一種保護機制來確保進程運行和獲取資源的正確性。

從概念上來講,操做系統的保護是指一種控制程序、進程或用戶對計算機系統資源進行訪問的機制。操做系統中的進程必須加以保護,使其免受其餘進程活動的干擾。各類機制是爲了確保只有從操做系統中得到了恰當受權的進程才能夠操做相應的文件、內存段、CPU和其餘的資源。

通俗點說,計算機包含大量用戶常常但願保護和保密的信息。這些信息可能包括電子郵件,商業計劃書,納稅申報單等等。操做系統須要採起一些機制來管理系統的安全性。例如,某些重要文件只能由受權用戶訪問。

經過爲每一個文件分配一個9位的二進制保護代碼來保護系統中的文件。保護代碼由三個3位字段組成,一個用於全部者,一個用於全部者組的其餘成員,另外一個用於其餘全部者。

每一個字段都有3位,一位表示讀權限,一位表示寫權限,一位表示執行權限,這3個位稱爲rwx位。例如,保護代碼rwxr-x--x表示全部者能夠讀取,寫入和執行文件,其餘組成員能夠讀取或執行(但不能寫入)文件,其餘全部者均可以執行(但不能讀取或寫入)文件。

除了文件保護以外,操做系統還存在許多其餘安全方面的保護機制。這些機制貫穿在操做系統的各個方面,從而可以保證其在資源分配以及程序運行中的可靠性。

6 虛擬內存

虛擬內存想必都不會陌生,它主要是解決物理內存所帶來的一系列侷限問題。虛擬內存可以經過在RAM和磁盤之間快速來回移動程序來運行比計算機物理內存更大的程序。

由於虛擬內存的存在,使得應用程序覺得它擁有了連續可用的內存,即一個連續完整的地址空間。而實際上,它在物理內存中可能並不連續,一般是被分隔成多個物理內存碎片,甚至還有部分暫時存儲在外部磁盤存儲器上,在須要時才進行數據交換。

總的來講,虛擬內存將主存當作是一個存儲在磁盤空間上的地址空間的高速緩存,主存中只保存活動的區塊,並根據須要在磁盤和主存之間來回傳送數據。同時,它爲進程提供了一致的地址空間,從而簡化了內存管理。

除此以外,操做系統爲每一個進程提供了一個獨立的虛擬地址空間,從而保護了每一個進程的地址空間不被其餘進程破壞。

因而可知,虛擬內存的提出解決了內存空間利用率問題、讀寫內存的安全性問題、進程間的通訊安全問題以及內存讀寫的效率問題。如今大多數操做系統都使用了虛擬內存,已經成爲操做系統中最爲基礎的概念之一。

7 總結

這幾個概念在操做系統的學習體系中很是常見,是繞不開的理解點。固然了,若是將這幾個概念展開來講都不是幾篇萬字長文可以介紹得完的。因此也不用慌,收藏起來慢慢理解,逐漸深刻。

本文就是單從概念的角度來介紹這六個重要名詞在操做系統中的做用,從而體現出操做系統設計管理的思想。

關於操做系統的文章以後還會持續放出,讓你們按部就班的理解這一門及其重要的學科領域。以後關於線程和進程關係、進線程的通訊和同步、虛擬內存的實現機制、文件系統等等方面的文章都會依次推送,還請持續關注支持哦~~

大家的支持就是個人動力鴨!下期見~



做者簡介:我是安醬,一個稀裏糊塗地進了大廠的業餘碼農。分享全棧技術,目標架構師。關注我,一塊兒向技術大牛進階!

推薦閱讀:

一文揭開操做系統的神祕面紗

我機械/電信/生物/化學專業出身,轉行計算機還有機會嗎?

「添加我爲好友,拉你加入討論羣,一塊兒努力進階!」

本文分享自微信公衆號 - 業餘碼農(Amateur_coder)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索