進程與PCB
進程:進程是程序的一次執行過程,是系統進行資源分配和調度的一個獨立單位。
進程實體(進程映像):由程序段、相關數據段和PCB三部分構成。進程是動態的,進程實體是靜態的。
PCB(進程控制塊):系統利用PCB來描述進程的基本情況和運行狀態,進而控制和管理進程;所謂創建進程,實際上是創建進程映像中的PCB;PCB是進程存在的唯一標誌。
-
進程的狀態
進程有5種狀態,其中前3種是基本狀態。
(1)運行態:進程正在處理機上運行。在單處理機的情況下,任一時刻最多隻有一個進程處理運行態。
(2)就緒態:進程已經獲得除處理機之外的一切所需資源,一旦得到處理機就可以進入運行態。
(3)阻塞態(等待態):進程正在等待某一事件/某一資源而暫停運行。這時候,即使處理機空閒,該進程也不能進入運行態。
-
進程的創建過程
(1)分配ID與PCB:爲新進程分配一個唯一的進程標識號,並申請一個空白的PCB(PCB是有限的)。若PCB申請失敗則創建失敗。
(2)分配資源:爲新進程的程序和數據、以及用戶棧分配必要的內存空間(在PCB 中體現)。注意:這裏如果資源不足(比如內存空間),並不是創建失敗,而是處於阻塞態。
(3)初始化PCB:主要初始化(1)標誌信息(2)處理機狀態信息(3)處理機控制信息,以及(4)設置進程的優先級等。
(4)調度:如果進程就緒隊列能夠接納新進程,就將新進程插入到就緒隊列,等待被調度運行。
注意,進程的創建是一個原子操作,執行期間不允許中斷,它是一個不可分割的基本單位。
-
進程的終止
引起進程終止的事件主要有:
(1)正常結束
(2)異常結束:如存儲區越界、非法指令、I/O故障等
(3)外界干預:如操作員或操作系統干預、父進程請求、父進程終止。
操作系統終止進程的過程如下:
(1)根據被終止進程的ID,檢索PCB,從中讀出該進程的狀態
(2)若被終止進程處於執行狀態,立即終止該進程的執行,將處理機資源分配給其他進程
(3)若該進程還有子進程,則應將其所有的子進程終止
(4)將該進程所擁有的資源,或歸還給其父進程或歸還給操作系統
(5)將該PCB從所在隊列(鏈表)中刪除。
-
進程之間的切換
(1)保存處理機上下文,包括程序計數器和其他寄存器。
(2)更新PCB信息。
(3)把進程的PCB移入相應的隊列,如就緒、在某事件阻塞等隊列。
(4)選擇另一個進程執行,並更新其PCB。
(5)更新內存管理的數據結構。
(6)恢復處理機上下文。
注意:“調度”和“切換”的區別:調度是指決定資源分配給哪個進程的行爲,是一種決策行爲;切換是指實際分配的行爲,是執行行爲。一般來說,等有資源的調度,再有進程的切換。
-
線程
線程是輕量化的進程,是程序執行流的最小單位;由線程ID、程序計數器、寄存器集合和堆棧組成;線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。
-
進程與線程區別
(1)一個程序至少有一個進程,一個進程至少有一個線程。線程(Thread)是進程的一個實體,是CPU調度和分派的基本單位。
(2)進程擁有獨立的內存單元,而多個線程共享內存。從而線程效率更高
(3)進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯。
(4)進程切換時,耗費資源較大,效率要差一些。
-
相比進程,線程有什麼好處
(1)易於調度。
(2)提高併發性。通過線程可方便有效地實現併發性。進程可創建多個線程來執行同一程序的不同部分。
(3)開銷少。創建線程比創建進程要快,所需開銷很少。。
(4)利於充分發揮多處理器的功能。
-
相比進程,線程有什麼缺點
(1)線程之間的同步和加鎖控制比較麻煩
(2)一個線程的崩潰影響到整個程序的穩定性
(3)線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU
-
IPC方式
(1)管道:半雙工;用於父子、兄弟之間。
(2)命名管道(FIFO)
(2)消息隊列:消息鏈表存於內核,每個消息隊列由消息隊列標識符標識;於管道不同的是,消息隊列存放在內核中,只有在內核重啓時才能刪除一個消息隊列;消息隊列的大小受限制。
(3)信號量(semophore):常用來處理臨界資源的訪問同步問題。臨界資源:爲某一時刻只能由一個進程或線程操作的資源。
(4)共享內存:可以說是最有用的進程間通信方式,也是最快的IPC形式。
(5)套接字:可用於不同機器之間。
(6)信號(Signal)
-
線程同步方式
(1)臨界區:當多個線程訪問一個獨佔性共享資源時,可以使用臨界區對象。擁有臨界區的線程可以訪問被保護起來的資源或代碼段,其他線程若想訪問,則被掛起,直到擁有臨界區的線程放棄臨界區爲止。
(2)互斥量:互斥對象和臨界區對象非常相似,只是其允許在進程間使用,而臨界區只限制與同一進程的各個線程之間使用。
(3)條件變量:一個線程被掛起,直到某件事件發生。
(4)信號量:當需要一個計數器來限制可以使用某共享資源的線程數目時,可以使用“信號量”對象。CSemaphore類對象保存了對當前訪問某一個指定資源的線程的計數值,該計數值是當前還可以使用該資源的線程數目。如果這個計數達到了零,則所有對這個CSemaphore類對象所控制的資源的訪問嘗試都被放入到一個隊列中等待,直到超時或計數值不爲零爲止。
(5)事件:允許一個線程在處理完一個任務後,主動喚醒另外一個線程執行任務。