【作業系統】 第二章 程式管理 程式的描述與控制

凡古一往發表於2020-12-15

第二章 程式管理 描述與控制

2.1 什麼是程式

程式程式碼+相關資料+程式控制塊PCB

當處理器開始執行一個程式的程式碼時,稱這個執行的實體為程式

2.1.1 程式和程式控制塊PCB

PCB(Process Control Block)

  • PCB是程式中斷的基礎,恢復執行後好像從未中斷一樣
  • PCB由OS建立和管理
  • 支援多程式的工具
PCB是用於程式管理的資料結構
PCB元素作用
id識別符號
state狀態
PC程式計數器
memory pointer記憶體指標
context上下文
I/O statusI/O狀態
…………

2.1.2 程式VS程式

程式是劇本,程式是演出

程式基本特徵:
  • 動態性(本質特徵):程式存在生命週期
  • 併發性(重要特徵):可同其他程式一同推進
  • 獨立性:各程式地址空間相互獨立(邏輯地址)
  • 非同步性:程式按不可預知速度推進
與程式相比:
1. 程式是正在計算機執行的例項
2. 程式=PCB+程式程式碼+資料
3. 程式是靜態的,沒有生命週期
4. 程式與程式並無一一對應關係,如一個dad()程式中涉及多個PV程式
5. 引入程式的概念是為了容易正確解釋多道程式併發

2.2 程式狀態

程式軌跡

程式的待執行指令序列,描述單個指令的行為(指南)

分派器Dispatcher

將cpu從一個程式切換到另一程式
圖1  分派器

2.2.1 兩狀態模型

圖2 兩狀態模型

2.2.2程式建立與終止

程式建立

OS建立用於管理程式的PCB
OS為程式分配記憶體

建立原因
  • 新作業<-舊的已完成
  • 使用者登入<-字面意思
  • 使用者請求服務<-比如請求列印
  • 程式派生<-如fork()
相關

程式派生:程式顯式請求建立一個程式(子程式)
父程式:原來的程式
子程式:派生的新程式

終止原因
  • 作業完成
  • timeout
  • 無可用記憶體
  • 無許可權訪問
  • 超出可用記憶體範圍
  • 訪問受保護的檔案
  • 不可運算
  • 超時(等不及)
  • I/O失效 如讀寫失敗
  • ……
  • 父程式終止 父死子亡
五狀態模型

圖3 五狀態模型

排隊模型
  1. 單阻塞佇列:所有阻塞佇列在同一佇列,事件後滿足需遍歷整個佇列
  2. 多阻塞佇列:不同阻塞條件對應不同佇列
    同樣的,可以根據不同優先順序維護多個就緒佇列

2.2.4 被掛起的程式

是為了解決記憶體有限的問題,把暫時阻塞的程式部分或全部換出到外存的掛起佇列中

掛起後

  • OS排程新程式
  • 從掛起佇列取新程式
掛起

記憶體中處於阻塞、就緒甚至執行的程式釋放到外存,不再參與cpu競爭

七狀態模型

圖4 七狀態模型

掛起的程式

不能立刻執行、在外存中、不會自行換入、可能在等待或不等待條件

掛起原因
  • 交換(騰出空間)
  • 使用者請求
  • 父程式請求
  • OS請求
  • 定時:定時執行,在等待時掛起

2.3 程式描述

2.3.1 OS控制結構

OS用表格來維護管理資源

  • 記憶體表:用於跟蹤記憶體、外存

  • 分配給程式的記憶體和外存

  • 記憶體外存受保護資訊

  • 管理外存資訊

  • I/O表

  • I/O狀態(可用/已分配給XX程式)

  • I/O資料來源和目的記憶體

  • 檔案表

  • 檔案是否存在

  • 檔案在外存位置

  • 當前狀態

  • 其他屬性

  • 程式表特徵
  • 用於管理程式

  • 有對記憶體、I/O\檔案的間接引用

  • 本身可被OS訪問(廢話-_-)

2.3.2程式控制結構

程式映像:程式、資料、棧(儲存呼叫地址)和PCB的集合
PCB中的資訊
  • 程式標識資訊:儲存在程式中的數字識別符號
    • 程式id
    • 父程式id
    • 使用者id
  • 處理器狀態資訊:cpu暫存器內容
    • 使用者可見暫存器
    • 控制和狀態暫存器(PC、PSW、中斷允許/禁用標誌、執行模式)
    • 棧指標(指向該程式的棧頂)
  • 程式控制資訊:作業系統排程程式所需其他資訊
    • 程式狀態state:“running”……
    • 程式優先順序priority
    • 事件標識:程式等待事件
    • 排程相關資訊:不同排程演算法可能需要空間存放資料
    • 資料結構:用於支援佇列、環、指標
    • 程式通訊:關聯無關程式之間的通訊
    • 程式特權
    • 儲存管理:指向虛存段表或頁表的指標
    • 資源所有權及使用情況

2.4 程式控制

2.4.1 執行模式

核心模式功能
  • 程式管理
  • PCB
  • create、delete、schedule
  • shift
  • 同步
  • 儲存管理
  • 分配
  • 交換
  • 分頁分段
  • I/O裝置管理
  • I/O緩衝區
  • 分配I/O
核心的支撐功能
  • 中斷處理
  • 時鐘中斷
  • 記賬
OS支援的兩種模式及其特點
使用者模式
  • 優先權少
  • 使用者程式執行
系統模式/核心模式
  • 優先權多
  • 執行在核心
  • 特權指令
  • 特權記憶體空間訪問

注:當前模式由PSW中的特殊位標識,兩種模式也是為了保護OS資料結構不被篡改

2.4.2程式建立

OS行為:
分配id–>分配空間–>init pcb(id、棧、state、priority……)–>插入就緒/掛起佇列–>初始化其他資料結構

2.4.3程式切換

中斷
  • 普通中斷
  • timeout:程式時間片耗盡
  • I/O中斷:I/O就緒,OS決定該喚醒哪個程式
  • 記憶體失效(缺頁):阻塞當前程式
  • 陷阱(自陷)
  • 程式錯誤或異常
程式切換原因
  • 普通中斷:對外部事件的反應
  • 陷阱:處理異常
  • 系統呼叫:呼叫核心程式
中斷過程

save context(P1)–>renew pcb(P1)–>move pcb(P1) in queue–>change process(P1->P2)–>renew pcb(P2)–>renew storage、data structure–>reload context(P1)

注意:中斷不一定導致程式切換
  • 一個例子:I/O中斷後,系統決定仍由先前程式繼續執行(比如因為該程式priority更高)
模式切換

使用者模式<==>核心模式

原因
  • 系統呼叫:呼叫核心服務
  • 中斷:呼叫中斷處理程式
模式切換與程式切換

模式切換不一定導致程式切換,要程式切換一定要模式切換

2.4.4 OS的執行

  1. 無程式的核心:核心獨立於程式(separate kernel)
  2. 使用者程式內的作業系統:程式與核心函式同時執行(OS function execute with process)
  3. 基於程式的作業系統:核心函式與程式同級執行(OS function execute with separate process)
    在這裡插入圖片描述

2.5 UNIX SVR4程式管理

fork()用於建立程式:pid=fork();

注意三點:
  1. fork()建立子程式之後,父子程式均各自繼續執行
  2. 子程式的fork()返回pid=0,父程式的fork()返回所建立的子程式id
  3. 父子程式的推進順序不可估計

舉三個例子幫助理解:


例1:下面程式碼共輸出幾個hello world?

#include <stdio.h>
#include <unistd.h>
int main()
{
    int i;
    for (i=0;i<3;i++)
        fork();
    printf("hello, world\n");
    return 0;
} 

一次fork()理解為:舊程式不變,繼續執行,產生了一個新程式
3次fork(),會有2^3個程式,所以會列印8個hello world


例2:下面程式碼的輸出是什麼?

void main(void) {
int i;
static char buffer[10];
if (fork()==0)     
   strcpy(buffer, “Child\n”);
else
   strcpy(buffer, “Parent\n”);
 
for (i=0; i < 5; ++i) {
  sleep(1);
  write(1, buffer, sizeof(buffer));
}
} 

5個Child,5個Parent,但順序不一定


例3:下面程式碼的輸出是什麼?

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int global = 4;
void main(void) {
int  pid; 
int vari = 5;
printf(“before fork\n”);
if ((pid = fork()) < 0) {
      printf(“fork error\n”);
      exit(0);
  } else if (pid == 0) {
	  global++;
	  vari--;
    }
 printf(“global=%d,vari=%d\n”, global, vari);
}

父程式:global=4,vari=5
子程式:global=5,vari=4

2.6 執行緒

程式分為兩個組成部分
  • 排程的基本單位
  • 資源的獨立單元

執行緒作為基本排程單位獨立出來,由OS排程

多執行緒

單個程式內支援多個併發路徑的能力
多執行緒

單執行緒

一個程式只有一個執行緒
單執行緒

執行緒是程式中的一個實體,是獨立排程和分派的單元

2.6.1 程式vs執行緒

一個程式可以有一個或多個執行緒
掛起或終止一個程式=掛起或終止其內部所有執行緒

執行緒
  • 執行狀態state:派生、阻塞、解除阻塞、結束
  • 上下文context
  • 區域性變數
  • 共享的資源和記憶體
    單執行緒多執行緒

多執行緒比單執行緒多一個tcb(執行緒的“pcb”)

執行緒優點
  1. 建立耗時短
  2. 終止耗時短
  3. 切換耗時短(同程式內)
  4. 提高了不同執行程式間的通訊效率
執行緒同步
  • 一個程式中的所有執行緒共享該程式資料和空間
  • 一個執行緒對資料修改會影響其他執行緒

2.6.2執行緒分類

使用者級執行緒 ULT(User-Level Thread)
  • 執行緒核心不可見,由應用程式管理
  • 程式阻塞,執行緒不一定阻塞;程式執行,執行緒也可能阻塞
  • 優點
  • 執行緒切換不需要切換核心模式
  • 排程策略可以應用程式定製
  • 可執行在任何種類的OS上
  • 缺點
  • 執行緒系統呼叫時會阻塞該程式所有執行緒
  • 不適用於多核系統
  • 缺點的改進辦法
  • jacketing技術:由應用級呼叫替代系統呼叫
    ULT
核心級執行緒 KLT(Kernel level Thread)
  • 核心管理執行緒,應用程式不管理執行緒
  • 優點
  • 可以將多個執行緒分配到多個cpu上
  • 一個執行緒阻塞時,同程式其他執行緒不會阻塞
  • 核心本身也可以使用多執行緒
  • 缺點
  • 執行緒切換要進行模式切換

KLT

混合方法(ULT+KLT)
  • 執行緒在使用者級建立
  • 執行緒排程、同步由應用程式完成
  • 使用者執行緒一個或多個對映到核心執行緒上(核心執行緒要更少)
    MIX

相關文章