程序的描述與組織

2021-08-28 22:20:25 字數 2293 閱讀 1672

程序需要一定資源才能執行,最重要的資源是記憶體位址空間,此外還可能需要使用檔案、裝置等。這些資源均由核心負責管理和分配。分配給程序的資源登記在程序的pcb中。

程序的乙個重要構成成分是程序映像,即程序所執行的**和資料在記憶體中的呈現。為了容納程序的映像,那個程序都有乙個自己的記憶體位址空間,這是程序執行的必備條件。在32位x86平台上,linux系統的程序擁有4gb的位址空間。

程序由使用者態和核心態兩種執行模式,在不同的模式下可訪問的位址空間也不相同。因此程序的位址空間被劃分為使用者空間和核心空間兩部分,其中1gb是核心空間,3gb是使用者空間。使用者空間容納程序自己的映像,核心空間容納核心映像。當程序執行在使用者態時執行的是使用者空間中的程序映像,陷入核心態執行的是核心空間中的核心映像。

為便於管理,程序的映像被按類劃分為多個區,包括**區、資料區和堆疊區。**區中包含的是可執行程式的**;資料區中包含的是各種型別的資料;棧屬於特殊的資料區,用於記錄與執行相關的動態資料。在使用者空間和核心空間中都包含有若干個**區、資料區和乙個棧。由於每個程序都可能會呼叫系統呼叫,因此核心空間的**和資料區由所有程序所共享,但每個程序都單獨擁有乙個核心棧。所以,核心棧和使用者空間是程序的私有財產,也是最重要的資源。

棧是**執行時必須使用的記憶體區。核心**使用核心棧,程序**使用使用者棧。因此在模式切換時,程序的棧也要跟著切換。核心棧的作用由為重要,除了要存放核心態下的執行資料外,還要存放程序模式切換以及程序切換時要保留的部分現場資訊。更重要的是,核心棧中還嵌有有關程序執行的一些相關資訊。

檔案是資訊的永久儲存形式,應用程式經常要使用或處理檔案。此外,應用程式還需要使用裝置來與外界傳輸資料。因此檔案和裝置都是程序的常用資源。在linux系統中裝置是被當作檔案來處理,因此兩者都由檔案系統來管理。

在使用檔案前,程序需要執行開啟操作,讓檔案系統為其建立與檔案的連線。所有被程序開啟的檔案都是程序可用的檔案資源。檔案使用完畢須執行關閉操作,釋放檔案資源。

程序並非孤立地在執行。它需要能夠接收和處理系統或其他程序發來的訊號,這些訊號可能是通知它某個事件或控制命令,比如暫停執行、終止執行等。程序通過設定的訊號處理程式來對訊號作出響應。為實現訊號通訊,程序需要擁有訊號佇列以及訊號處理程式。

以上這些資源的用途不同,因而分配策略也有所不同。檔案和裝置資源是按需分配,即用時分配,用完即**;位址空間和訊號是程序執行的必要資源,它們在程序建立時分配,在程序的整個執行期間都一直占有;核心棧屬於程序的故有資源,它和pcb一樣,在程序建立時分配,並保持在程序的整個存在期間。就是說即使是殭屍程序也會保有它的pcb和核心棧。

管理程序就是管理程序的pcb。乙個系統中通常可能擁有數百乃至上千個程序,為了有效地管理如此多的pcb,系統需要採用適當的方式將它們組織在一起。通常採用的組織結構有陣列、雜湊表和煉表3種方式。

實際的系統中通常會綜合採用這些方法,以達到最好的效率。

linux系統採用了多種方式來組織程序pcb,主要有以下幾種:

程序鍊錶

系統將所有的pcb鏈成乙個雙向迴圈鍊錶,pcb通過它的tasks欄位鏈入程序鍊錶。表頭指標在0號程序的pcb中。遍歷該鍊錶即可順序地找到每個程序的pcb。

pid雜湊表

在許多情況下,核心需要根據程序的pid查詢程序。順序掃瞄程序鍊錶並逐個檢查其中的pid是相當低效的。為了加快查詢速度,核心中設定了若干個雜湊(hash)表,其中pid雜湊表用於將pid對映到程序的pcb。pid雜湊表是乙個鏈式雜湊表,所有的pcb都通過pid_chain和pid_list欄位鏈入到這個雜湊表中。用pid查詢雜湊表就可快速找到它的pcb。

程序樹鍊錶

linux系統中,程序之間存在著父子和兄弟關係。每個程序都有乙個父程序,即建立了此程序的程序。乙個程序可以建立0至多個程序,稱為它的子程序。具有相同父程序的程序稱為兄弟程序。這樣,系統中的所有程序形成了一棵程序樹,每個程序都是書中的乙個節點,樹的根是int程序,它是所有程序的祖先程序。

可執行鍊錶

為了方便程序的排程,系統把所有處於可執行狀態的pcb組成可執行佇列,處於可執行狀態的程序通過pcb中的run_list欄位鏈入適當的佇列中。在程序切換時,程序排程程式從可執行佇列中選擇乙個讓其執行。

等待鍊錶

程序因不同的原因而睡眠。系統將睡眠的程序分類管理,每類對應乙個特定的事件,用乙個等待佇列鏈結。等待佇列的節點並不是pcb本身,而是代表乙個等待程序的節點,其中包含了指向程序pcb的指標。當某一事件發生時,核心會喚醒相應的等待佇列中滿足等待條件的程序,將喚醒的程序節點從佇列中刪除,將該程序的pcb加入到可執行佇列中。

描述執行緒與程序的區別?

a.執行緒 thread 與程序 process 二者都定義了某種邊界,不同的是程序定義的是應用程式與應用程式之間的邊 界,不同的程序之間不能共享 和資料空間,而執行緒定義的是 執行堆疊和執行上下文的邊界 b.乙個程序可以包括若干個執行緒,同時建立多個執行緒來完成某項任務,便是多執行緒。而同一程序中...

描述執行緒與程序的區別?

a.執行緒 thread 與程序 process 二者都定義了某種邊界,不同的是程序定義的是應用程式與應用程式之間的邊 界,不同的程序之間不能共享 和資料空間,而執行緒定義的是 執行堆疊和執行上下文的邊界 b.乙個程序可以包括若干個執行緒,同時建立多個執行緒來完成某項任務,便是多執行緒。而同一程序中...

描述執行緒與程序的區別?

a.執行緒 thread 與程序 process 二者都定義了某種邊界,不同的是程序定義的是應用程式與應用程式之間的邊 界,不同的程序之間不能共享 和資料空間,而執行緒定義的是 執行堆疊和執行上下文的邊界 b.乙個程序可以包括若干個執行緒,同時建立多個執行緒來完成某項任務,便是多執行緒。而同一程序中...