總結 程序管理

2021-07-06 07:27:22 字數 2953 閱讀 7894

程序管理主要有三個部分:程序建立和退出、程序排程、程序間通訊。

首先,什麼是程序?

程序就是執行著的乙個程式的例項。乙個執行中的程式包含執行狀態、屬性、位址空間等資訊,作業系統把這些東西整合起來看作程序,統一管理。

程序建立

對於每個程序,核心都會為這個程序生成

乙個程序描述符

task_struct、

分配乙個核心棧、

以及虛擬位址

對映到實體地址的頁表。

1.程序描述符和核心棧存在於核心空間,準確的說它們是乙個聯合結構體。

task_struct記錄了程序的基本資訊,包括標識號、訊號、狀態、排程資訊、程序鏈資訊(父子程序)、檔案資訊、區域性描述符表、任務狀態段等。

2.程序的核心棧從使用者態切換到核心態時都是空的。所以棧底記錄了使用者棧位址。   

3.每個程序擁有統一的虛擬位址空間,包括堆、棧、**段、資料段等。

頁表存放在系統空間的頁表區,程序描述符中有指標指向頁表。

(核心棧定義,

在/include/linux/sched.h中定義了乙個聯合結構:

union task_union ;
init_task_size 是8k

也就是說程序描述符和核心棧公用乙個聯合結構體,核心棧的棧頂位置為:

起始位址+8192)

linux建立程序的系統呼叫有:fork(),vfork()

fork():

實際開銷:建立唯一task_struct,複製父程序的頁表。

f ork

實行寫時拷貝,先讓子程序共用父程序的位址空間,只有當寫入時才複製。

vfork():

不複製父程序的頁表,共用頁表。所以子程序不能向父程序寫入。

程序退出:

有5種方式

正常退出:

1,從main函式退出

2,呼叫exit

3,呼叫_exit

異常退出:

1,呼叫abort

2,有訊號終止

exit與_exit的區別:

_exit直接使程序停止執行,清除使用的記憶體空間,銷毀其在核心中的資料結構;

_exit是exit的最後乙個步驟,在此之前,還會呼叫atexit()

,重新整理i/o緩衝區,關閉所有檔案。

殭屍程序:某個程序退出了,但是它的父程序沒有呼叫wait,此時這個程序的程序描述符還在核心空間沒有釋放。

孤兒程序:某個程序還在執行,但是它的父程序退出了,該程序的父程序變成了init程序。

程序排程:

每個cpu分配乙個執行佇列runqueue,通過動態優先順序和時間片輪轉的方式進行排程。

程序的動態優先順序由靜態優先順序nice值和程序的動態互動性計算得來,nice值是核心。

每個cpu乙個

runqueue,每個程序唯一的歸屬於乙個

runqueue。

runqueue主要包含:乙個保護執行佇列的自旋鎖、任務數目、活動優先順序陣列的指標、過期優先順序陣列的指標等等。

每個執行佇列都有兩個優先順序陣列,乙個活躍的和乙個過期的。

優先順序陣列中有三個成員:任務數目、優先順序位圖、優先順序佇列。

優先順序點陣圖為每個優先順序準備一位,初始狀態全置為0,當擁有某個優先順序的程序就在位圖中相應位置置為1,這樣,查詢系統中最高的優先順序就變成了查詢點陣圖中被設定的第一位。

優先順序佇列:每個優先順序對應乙個鍊錶,每個鍊錶與乙個給定的優先順序相對應。這樣就能通過位圖找到最高優先順序,然後在優先順序佇列中找到排程的程序。

為什麼要兩個優先順序陣列?

首先,系統只對活躍優先順序陣列裡的程序進行排程。

活躍優先順序陣列中的程序在時間片耗盡之後,重新計算時間片,然後放到過期優先順序陣列中,當活躍優先順序陣列中的程序數目為0時,交換兩個優先順序陣列的指標。

(排程程式提供一種機制以支援互動程序,如果乙個程序互動性強,那麼,當它的時間片用完之後,會重新計算時間片再次放入活動陣列中。)

程序間通訊

unix方式:管道、訊號

system c方式:訊息佇列、訊號量、共享記憶體

socket.

管道,一種特殊的檔案(特殊是因為檔案內容在記憶體中),用來實現程序間小規模的資料通訊,由乙個程序向管道內寫資料,另乙個程序從管道讀資料。

管道分為有名管道和無名管道。無名管道是單工的臨時管道,只能用於父子家族程序的通訊。有名管道可以用於不同程序,管道檔案

是雙工的,但是只能以唯讀方式和只寫方式分別開啟。

訊號

是程序在執行過程中自身產生或由外部發過來的訊息,它

是硬體中斷的軟體模擬,也就是軟中斷。訊號不能傳輸特定資料,但是可以通過傳送不同型別的訊號來通知其他程序,程序可以根據不同的訊號設定對應的處理函式。

訊息佇列,是儲存在核心空間的乙個訊息的鍊錶,不同程序可以通過指定的訊息佇列id號對同乙個訊息佇列進行讀寫操作。

訊號量,是核心用來表示系統可用資源數量的一種資料結構。通常用來實現程序同步。

共享記憶體,程序間可以通過共享記憶體來實現大量資料通訊,主要是通過將不同程序各自的一塊虛擬位址空間對映到同一塊物理

位址來實現。

在對共享記憶體進行資料訪問時,一般都配合二元訊號量使用。

socket,一般用於網路中,兩個程式通過乙個雙向的通訊連線實現的資料交換。

linux程序管理總結

linux程序管理總結 目錄一 程序相關的概念 二 關閉會話時子程序程序被殺死 三 nohup的原理 四 setsid原理 五 daemon 和守護程序的區別 六 服務程序為什麼要fork兩次 七 systemd管理daemon 八 殭屍程序 九 程序名字和啟動時指定程序名字 十 source co...

程序管理 程序排程

一 概念 1 處理機管理是作業系統的主要功能之一。處理機管理的實現策略決定了作業系統的型別,其演算法好壞直接影響整個系統的效能 2 程序排程 通過某種規則或演算法從就緒 等待 程序佇列中選出乙個程序投入執行 3 排程是乙個基本的作業系統功能。cpu排程是作業系統設計的核心問題 二 cpu排程程式 1...

Linux 程序管理動態程序管理 詳解

訊號種類 kill l列出所有支援的訊號 kill使用訊號控制程序kill 訊號名編號程序優先順序nice linux程序排程及多工 每個cpu在乙個時間點上只能處理乙個程序,通過時間片技術,來同時執行多個程式。pr 系統內定的優先順序值比ni大20 99 39 ni nice優先值可人為變動 20...