天天看點

作業系統(Linux與Windows)的程序管理

程序

描述和管理程式的“運作過程”-------程序

程序概念

定義:程序是程式在某個資料集合上的一次運作活動

程序的特征

  • 動态性
程序是程式的一次執行過程,動态産生消亡
  • 并發性
程序可以同其他程式一起向前推進
  • 異步性
程序按各自的速度向前推進
  • 獨立性
程序是系統配置設定資源和排程CPU的機關

程序的狀态

  • 運作狀态

    程序已經占有CPU,在CPU上運作

  • 就緒狀态

    具備運作條件但由于無CPU,暫時不能運作

  • 阻塞狀态

    應為等待某項服務完成或信号來到而不能運作的狀态

    例如等待:系統調用,I/O操作,合作程序的服務或信号

程序狀态的變遷

作業系統(Linux與Windows)的程式管理
作業系統(Linux與Windows)的程式管理

程序的挂起和解挂操作

挂起:使用者或OS将程序有意暫停

解挂:将挂起的程序繼續

阻塞:禁止阻塞(阻塞時挂起)和活動阻塞(正常阻塞)

就緒:禁止就緒(就緒時挂起)和活動就緒(正常就緒)

作業系統(Linux與Windows)的程式管理

Linux程序狀态

  • 可運作态:TASK_RUNNING

    1.就緒:在就緒隊列中等待排程

    2.運作:正在運作

  • 阻塞(等待)态:

    1.淺度阻塞:TASK_INTERRUPTIBLE

    可被其他程序的信号或時鐘中斷喚醒

    2.深度阻塞:TASK_UNINTERRUPTIBLE

    不可被其他程序通過信号或時鐘中斷喚醒

  • 僵死态:TASK_ZOMBIE

    程序終止執行,釋放大部分記憶體

  • 挂起态:TASK_STOPPED

    程序被挂起

程序的描述

程序控制塊(PCB)

1.描述程序狀态、資源、和相關程序關系的一中資料結構

2.PCB是程序的标志

3.建立程序時建立PCB;程序撤銷後PCB同時撤銷

程序=程式+PCB

作業系統(Linux與Windows)的程式管理

Linux的程序控制塊PCB:task_struct

作業系統(Linux與Windows)的程式管理

Linux 程序的辨別:

PID

PPID:父程序ID

PGID:程序組ID

Linux程序的使用者辨別:

UID:使用者ID

GID:使用者組ID

STAT:程序狀态

符号 含義
R 運作或準備運作
S 睡眠狀态
I 空閑
Z 僵屍
D 不間斷睡眠
W 程序沒有駐留頁
T 停止或跟蹤

程序控制

四個典型控制為:

  • 建立程序
  • 撤銷程序
  • 阻塞程序
  • 喚醒程序

建立程序的過程

建立一個空白PCB

賦予程序辨別符ID

為程序配置設定空間

初始化PCB(預設值)

插入相應的程序隊列(新程序插入就緒隊列)

程序撤銷過程

在PCB隊列中檢索出PCB

擷取該程序狀态

  • 若在運作态,立即終止該程序
  • 遞歸檢查是否有子程序,先撤銷子程序

    釋放程序占有的資源

    将程序從PCB隊列中移除

程序阻塞時機和過程

時機;

  • 請求系統服務
  • 啟動某種操作
  • 新資料尚未到達
  • 無新工作可做

停止運作

将PCB“運作态”改為“阻塞态”

插入相應原因的阻塞隊列

轉排程程式

程序喚醒

系統服務由不滿足到滿足

I/O完成

新資料到達

程序提出新請求

程序控制原語:

  • 建立原語
  • 撤銷原語
  • 阻塞原語
  • 喚醒原語

Linux程序控制

建立程序fork

fork執行流程:

  1. 配置設定task_struct結構
  2. 為新程序堆棧配置設定實體頁
  3. 拷貝父程序内容
  • 正文段、使用者資料段及系統資料段task_struct的大部分内容,并對子程式中有别于父程序的項進行初始化
  1. 把新程序的task_struct結構位址儲存在task指針數組中
  2. 子程序由fork建立後,通常屬于就緒狀态

init程序:

在linux系統初啟時,生成init程序(1号程序)

其他程序有目前程序通過系統調用fork建立

子程序執行自己的功能

exce函數族

功能:

  • 裝入一個指定的可執行程式運作
  • 使子程序具有和父程序完全不同的新功能

步驟:

  • 根據檔案名找到相應的可執行檔案
  • 可執行檔案的内容填入子程式的位址空間
  • exce調用成功就會進入新程序且不再傳回
  • 調用失敗傳回-1,繼續在克隆來的位址空間中從調用點向下執行

程序阻塞 wait

程序立即阻塞自己,如果它找到一個已經成為僵屍的子程序,wait就會收集這個子程序的資訊,并把它徹底銷毀後傳回

程序終結exit

程序釋放自己占用的資源并彙報給父程序

調用exit後變為僵屍态,幾乎所有的記憶體空間,儲存PCB資訊供wait收集

程序的休眠sleep

Windows程序

程序是被加載到記憶體的,正在運作的應用程式執行個體

程序由核心對象和位址空間所組成

  • 核心對象PCB
  • 位址空間

    包括代碼、資料、堆、棧、堆上動态配置設定的空間

windows建立程序creatProcess

過程:

  • 建立程序核心對象,建立虛拟位址空間
  • 裝載exe和、或dll的代碼和資料到位址空間中
  • 建立主線程和線程核心對象
  • 啟動主線程,進入主函數
    作業系統(Linux與Windows)的程式管理
    有一個非常有趣的例子,​見我另一篇部落格

Windows結束程序

主函數傳回

ExitProcess

TerminateProcess

補充:守護程序daemon

pid = fork(); //建立子程序
if(pid>0)     
  eixt(0);  //退出父程序
setsid();   //讓程序脫離控制終端
chdir("/");   //避免原工作目錄不能被解除安裝
umake(0);   //檔案權限掩碼設定0
for(int i = 0;i<MAXFILE;i++)
  close(i); //關閉繼承自父程序的檔案      

繼續閱讀