一、進程
進程與程序
操作系統之中最爲通用的概念就是「進程」。與此相關的面試題以及各種技術優化策略也層出不窮,足以夠證明它對於理解操作系統中舉足輕重的地位。事實上,通過「進程」,程序員可以更爲直觀的理解自己所開發的軟件,並且能夠從中深刻的認識到操作系統在軟件運行做了些什麼。
簡單來講,進程就是正在執行的程序。每個進程都包含有屬於自己的一段地址空間,可以看作是一部分內存空間。在這樣的地址空間中,進程能夠根據需要進行內存的讀寫。
地址空間裏面一般包含可執行程序,以及對應程序的數據及其堆棧。與每個進程相關的還有一組資源,通常包括寄存器(包括程序計數器和堆棧指針)以及運行程序所需的所有其他信息。從這可以看出,程序本身只是指令、數據以及其組織形式的一種描述方式,而程序的實際的運行實例就是一個進程。
不過進程與程序也並不完全等同,他們不是簡單的一一對應的關係,而是在不同層面的表現形式。他們的主要區別在於:
- 程序是進程的靜態文本,而進程是執行程序的動態過程;
- 進程與程序不是一一對應,同一程序可在不同進程中運行,一個進程也可以執行多個程序;
- 程序是一種長期可保存的文本,進程是暫時的一次執行過程;
- 進程是操作系統分配調度的獨立單位,而程序是操作系統層級之上的應用程序。
進程狀態
從上面我們知道,進程可看作是程序運行的動態過程。那麼爲了更好的對進程進行描述,我們給運行中的進程定義了三種基本狀態,包括就緒、執行和阻塞。
這就是所謂的三態模型,描述了進程在整個運行週期中狀態變化。每個狀態的轉移過程可以通過下圖來表示。
就緒狀態
是指進程已經被分配到了所有必需的資源,除了CPU
。在這個狀態下,進程處於箭在弦上隨時待發的狀態,只要一獲得CPU
的執行權限,進程便會立刻執行,從而進入執行狀態。
當有多個處於就緒狀態的進程時,不同的進程會根據優先級被劃分入不同的隊列。一個因爲時間片用完而進入就緒狀態的進程會被劃分入低優先級隊列,而因爲I/O
操作完成而進入就緒狀態的進程,則會被劃分入高優先級隊列。
執行狀態
是指進程正常運行的狀態。而當處於執行狀態的進程由於需要等待某個事件發送(通常爲等待I/O
)時,就會放棄CPU
,從而進入暫時的阻塞狀態。CPU
這時一旦空出,通過不同的調度算法,CPU
又會被分配給另一個就緒進程。
阻塞狀態
相當於就緒狀態和執行狀態的一個緩衝狀態。當處於執行狀態的進程無法正常執行時,會先進入阻塞狀態,等待需要的請求執行完成,再回到就緒狀態,等待下一次的CPU
分配和執行。
三態模式是用來描述進程狀態轉移最爲精簡的模型,實際上光這三種狀態是無法處理複雜的進程運行過程的。所以爲了對進程進行更好的管理和調度,在三態模型的基礎上引入了兩種進程狀態,即創建狀態
和終止狀態
,這就有了五態模型。
創建狀態
是指進程剛剛創建的狀態,在這個狀態下,需要等待操作系統完成創建和分配進程的各種所需信息,包括建立PCB(Process Control Block)
、加載程序並創建地址空間等。在完成這些準備工作後,該進程的狀態就會轉移爲就緒狀態並劃分入就緒隊列中。
PCB:進程控制塊,用於存放進程的管理和控制信息的數據結構
創建狀態看起來好像沒什麼太多用處,畢竟進程就緒的時候肯定完成了創建。但是之所以還是要引入,還是爲了確保進程控制塊的完整。只有在創建狀態完成了進程完整的準備工作(PCB
生成創建及資源分配),才能進入就緒狀態。
這樣就保證了處於就緒狀態進程的正確性,同時也提升了操作系統對進程的管理的靈活性。操作系統可以從一開始就對進程的創建和資源分配進行管理,更大程度上節省了系統資源的調控。
終止狀態
代表着進程的結束,當進程執行完成後,需要操作系統在終止狀態對進程的運行結果進行善後處理。這樣的善後處理包括對進程所使用的資源進行回收,並將其它進程所需要的信息傳遞出去。最後,操作系統還需要對終止的進程進行內存釋放,將其PCB
中的內容清空,並將這部分內存返還給系統。
終止狀態意味着進程的執行週期的結束,但卻並不表示進程是正常結束的。當一個進程出現了無法預知的錯誤或者被操作系統或其它進程所終止時,它都會進入終止狀態,進行各種資源的回收。
事實上即使是進程的五態模型也不足以用來描述進程複雜的運行過程。由於系統內部資源的限制,並不是爲所有進程運行的要求都能夠滿足,因此在這個基礎上,又引入了進程的掛起就緒狀態以及對應的掛起阻塞狀態。
在七態模型中,活躍就緒是指進程在主存並且可被調度的狀態。而靜止就緒狀態是指就緒進程被對換到輔存時的狀態,它是不能被直接調度的狀態,只有當主存中沒有活躍就緒態進程,或者是掛起態進程具有更高的優先級時,系統纔會把掛起就緒態進程調回主存並轉換爲活躍就緒狀態。
活躍阻塞狀態是指進程在主存,一旦等待的事件產生便會進入活躍就緒狀態。靜止阻塞是指阻塞進程對換到輔存時的狀態,一旦等待的事件產生便進入靜止就緒狀態。
進程相關的知識點實在是太多了,包括PCB
、進程間通信以及和線程相關的概念和基礎都是非常重要的知識。但是由於這篇文章的篇幅限制,不好在這裏過多展開。
只是點到爲止的介紹線程的狀態模型,具體進程和線程的內容將會在之後幾篇文章中詳細展開介紹。
之所以花大力氣來介紹線程模型,只因爲這是線程跟操作系統關係最爲直觀的聯繫所在。
不斷優化線程模型的目的就是爲了使得操作系統能夠更好的去管理程序軟件和資源分配的問題。
通過對線程的管理來達到資源合理調配的目的。這本身也就是操作系統作用的重要體現之一,可謂是操作系統的第一大靈魂概念。
二、地址空間
地址空間的概念在進程的介紹中略有提及,實際上也與進程有不可分割的關係。一般上的理解上,每個進程擁有其對應的地址空間,存儲着該進程用於程序運行時所需的信息和數據。
我們知道,每臺計算機都有一些主內存,用於保存正在執行的程序。在一個非常簡單的操作系統中,一次只有一個程序在內存中運行。要運行第二個程序,必須刪除第一個程序,然後將第二個程序放在內存中。
更復雜的操作系統就能夠解決這樣的問題,它們可以允許多個程序同時存儲在內存中。同時爲了防止它們相互干擾(以及與操作系統之間的串擾),會採取某種一般存在於硬件中的保護機制。
通常,每個進程都有其可以使用的一組地址,通常從0
到某個地址最大值。在最簡單的情況下,進程具有的最大地址空間量小於主存儲器的總容量。這樣,進程可以填滿它的地址空間,並且在主內存中也有足夠的空間容納這些信息。
但是,如果某個進程的地址空間大於計算機的主內存,並且該進程想全部使用它,該怎麼辦?
在最初的計算機中,這樣的要求是十分過分的。而如今,好在有一種稱爲虛擬內存的技術,操作系統能夠將地址空間抽象化爲進程可以引用的地址集,從而使得地址空間與計算機的物理內存分離。這樣一來,進程的地址空間就有可能大於計算機的物理內存。
地址空間和物理內存的管理是操作系統功能的重要組成部分,同樣也是深入理解操作系統進/線程管理的基礎。
三、文件
幾乎所有操作系統都支持的另一個關鍵概念就是文件系統。操作系統的主要功能是隱藏磁盤和其他I/O
設備的特性,併爲程序員提供一個與設備或硬件無關的文件的簡潔漂亮的抽象模型。
顯然需要通過操作系統的調用來創建文件,刪除文件,讀取文件和寫入文件。在讀取文件之前,必須先將其放在磁盤上並打開,在讀取文件後應將其關閉,以便能夠提供調用來執行這些操作。
層次結構
爲了提供存放以及找到文件的位置,大多數PC
操作系統都具有目錄的概念,該目錄是將文件分組在一起的一種方式。目錄是以文件夾的形式進行展現,可以在文件夾中嵌套多個目錄。
整個文件系統的模型是一個層次結構,就像是一顆多叉樹。從最頂層的文件夾依次以樹幹、樹枝的形式進行查找,就可以搜索到最底部的文件目錄。
目錄層次結構中的每個文件都可以通過在目錄層次結構的頂部(根目錄)給出其路徑名來指定。這樣的絕對路徑名包含必須從根目錄遍歷才能到達文件的目錄列表,並用斜槓分隔各個組件。
D:/study/學習資源/個人/私は學ぶのが大好きです.mp4
每個進程都會有一個當前的工作目錄,在該目錄中查找不以斜槓開頭的路徑名。這就是所謂的相對路徑。此外,進程可以通過發出指定新工作目錄的系統調用來更改其工作目錄。
需要注意的一點是,在讀寫文件之前,必須先打開該文件,然後再檢查權限。如果允許訪問,系統將返回一個稱爲文件描述符的小整數,以用於後續操作。如果禁止訪問,則返回錯誤代碼。
掛載
在操作系統的文件系統中,另一個重要概念就是掛載。大多數臺式計算機都有一個或多個光盤驅動器,可以在其中插入CD-ROM
,DVD
和光盤。(下面以Unix
系統爲例進行介紹)
這些計算機以外的光盤驅動器實際上都可看作是一個文件系統,並且與計算機本身硬盤上的根文件系統是相互獨立,彼此無關的。爲了提供一種優雅的方式來處理這些可移動介質,操作系統允許將光盤上的文件系統附加到根文件系統的主樹上,這就是掛載。
但是,由於無法在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可以通過從管道讀取數據來讀取數據,就像它是輸入文件一樣。
因此,進程之間的通信非常類似於普通文件的讀寫。更強大的是,當進程發現正在寫入的輸出文件不是真正的文件,而是管道時,就會進行特殊的系統調用。當然具體的實現這裏就不展開了,之後在講進程間通信時再詳細介紹。持續關注,收穫更多哦~
四、輸入/輸出
所有計算機都具有用於獲取輸入和產生輸出的物理設備,這就是所謂的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)網絡通信設備。這類設備主要有網卡、調制解調器等,主要用於與遠程設備的通信。這類設備的傳輸速度比字符設備高,但比外部存儲器低。
五、保護
我們知道操作系統可以對進程和資源進行管理和控制,而在這個管理過程中,進程運行的正確性必須要得以保證。因此,操作系統內部需要提供一種保護機制來確保進程運行和獲取資源的正確性。
從概念上來說,操作系統的保護是指一種控制程序、進程或用戶對計算機系統資源進行訪問的機制。操作系統中的進程必須加以保護,使其免受其他進程活動的干擾。各種機制是爲了確保只有從操作系統中獲得了恰當授權的進程纔可以操作相應的文件、內存段、CPU
和其他的資源。
通俗點說,計算機包含大量用戶經常希望保護和保密的信息。這些信息可能包括電子郵件,商業計劃書,納稅申報單等等。操作系統需要採取一些機制來管理系統的安全性。例如,某些重要文件只能由授權用戶訪問。
通過爲每個文件分配一個9
位的二進制保護代碼來保護系統中的文件。保護代碼由三個3
位字段組成,一個用於所有者,一個用於所有者組的其他成員,另一個用於其他所有者。
每個字段都有3
位,一位表示讀權限,一位表示寫權限,一位表示執行權限,這3
個位稱爲rwx
位。例如,保護代碼rwxr-x--x
表示所有者可以讀取,寫入和執行文件,其他組成員可以讀取或執行(但不能寫入)文件,其他所有者都可以執行(但不能讀取或寫入)文件。
除了文件保護之外,操作系統還存在許多其他安全方面的保護機制。這些機制貫穿在操作系統的各個方面,從而能夠保證其在資源分配以及程序運行中的可靠性。
六、虛擬內存
虛擬內存想必都不會陌生,它主要是解決物理內存所帶來的一系列侷限問題。虛擬內存能夠通過在RAM
和磁盤之間快速來回移動程序來運行比計算機物理內存更大的程序。
因爲虛擬內存的存在,使得應用程序以爲它擁有了連續可用的內存,即一個連續完整的地址空間。而實際上,它在物理內存中可能並不連續,通常是被分隔成多個物理內存碎片,甚至還有部分暫時存儲在外部磁盤存儲器上,在需要時才進行數據交換。
總的來說,虛擬內存將主存看成是一個存儲在磁盤空間上的地址空間的高速緩存,主存中只保存活動的區塊,並根據需要在磁盤和主存之間來回傳送數據。同時,它爲進程提供了一致的地址空間,從而簡化了內存管理。
除此之外,操作系統爲每個進程提供了一個獨立的虛擬地址空間,從而保護了每個進程的地址空間不被其他進程破壞。
由此可見,虛擬內存的提出解決了內存空間利用率問題、讀寫內存的安全性問題、進程間的通信安全問題以及內存讀寫的效率問題。現在大多數操作系統都使用了虛擬內存,已經成爲操作系統中最爲基礎的概念之一。
總結
這幾個概念在操作系統的學習體系中非常常見,是繞不開的理解點。當然了,如果將這幾個概念展開來說都不是幾篇萬字長文能夠介紹得完的。所以也不用慌,收藏起來慢慢理解,逐漸深入。
本文就是單從概念的角度來介紹這六個重要名詞在操作系統中的作用,從而體現出操作系統設計管理的思想。
寫在最後
歡迎大家關注我的公衆號【風平浪靜如碼】,海量Java相關文章,學習資料都會在裏面更新,整理的資料也會放在裏面。
覺得寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!