程序管理主要有三個部分:程序建立和退出、程序排程、程序間通訊。
首先,什麼是程序?
程序就是執行著的乙個程式的例項。乙個執行中的程式包含執行狀態、屬性、位址空間等資訊,作業系統把這些東西整合起來看作程序,統一管理。
程序建立
對於每個程序,核心都會為這個程序生成
乙個程序描述符
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...