作業系統3——程式的描述與控制

空曠在遠方發表於2018-12-11

作業系統3——程式的描述與控制

——2018.12.10

零、目標

  • 程式的定義和特徵
  • 程式的基本狀態及轉換
  • 程式控制塊
  • 核心、原語
  • 臨界資源、臨界區
  • 同步機制應遵循的規則
  • 記錄型訊號量、利用記錄型訊號量解決生產者

一、程式的描述

1. 程式的概念
  1. 程式的定義:是程式實體的執行過程,是系統進行資源分配和排程的一個獨立單位。
  2. 程式的特徵:動態性、併發性、獨立性、非同步性
  3. PCB 描述和控制程式執行,系統為每個程式定義的一個資料結構
  • 程式的程式碼和資料、CPU暫存器的數值、堆和棧
  • 系統資源
  • 地址空間
  • 開啟的檔案
2.程式的狀態
  1. 就緒(Ready)狀態
  • 可執行,已獲得除CUP外的所需資源,等待分配CPU
  1. 執行(Running)狀態
  • 佔用CPU執行,處於此狀態的程式數目=CPU的數目
  1. 阻塞(Blocked)狀態
  • 等待某種條件(如I/O)操作或程式同步,在滿足條件前無法執行
3.程式的管理
  1. 引起程式建立的原因:
  • 使用者登入:為終端使用者建立程式
  • 作業排程:選中的作業建立程式
  • 提供服務:為使用者提供的服務程式
  • 應用請求:應用程式自己建立的程式
  1. 原語:由若干條指令構成,用於完成一定功能的一個過程
  2. 原子操作:一個操作中的所有動作,要麼全做,要麼全不做,是一個不可分割的操作。
  3. 程式控制塊的組織方式
  • 連結方式:把具有同一狀態的PCB,用其中的連結字連結成一個佇列
  • 索引方式:系統根據所有程式的狀態建立幾張索引表

二、執行緒的描述

1.執行緒的概念
  1. 執行緒的定義:
  • 將程式的兩個屬性分開,作為排程和分派的基本單位,不同時作為資源的擁有者,就形成了執行緒的概念
  • 執行緒:有時稱輕量級程式,程式中的一個執行實體,是一個CPU排程單位,資源的擁有者還是程式或稱任務
  • 一個被排程和分派的基本單位並可獨立執行的實體
  1. 執行緒的分類
  • 核心支援執行緒:依賴核心進行控制和管理
  • 使用者級執行緒:在使用者級建立、撤銷和切換
  1. 在引入執行緒的OS系統中,則把執行緒作為排程和分派的基本單位,而把程式作為資源的擁有基本單位。
  2. 在同一程式中的執行緒切換不會引起程式切換
  3. 在不同一程式中的執行緒切換會引起程式切換

三、程式同步

1.相關的概念
  1. 互斥——間接相互制約關係
  • 同處於一個系統中的程式必然共享某種資源,如CPU、I/O裝置等,間接相互制約即源於共享資源
  1. 同步——直接相互制約關係
  • 源於程式程式之間的合作關係,如程式A向B提供資料,當輸入緩衝空時,B不能得到資料而阻塞
  1. 臨界資源
  • 一次僅允許一個程式使用的資源
  • 系統中的許多硬體,如印表機,諸程式之間只能用互斥的方式進行訪問
  1. 臨界區
  • 在每個程式中訪問臨界資源的那段程式碼稱為臨界區
2.同步機制應遵循的原則
  1. 空閒讓進
  • 當無程式處於臨界區時,應允許一個程式進入臨界區
  1. 忙則等待
  • 當已有程式進入臨界區時,其他程式必須等待
  1. 有限等待
  • 應保證在有限時間內進入自己的臨界區,防止“死等”
  1. 讓權等待
  • 應立即釋放處理機,防止“忙等”
3.互斥與同步的解決方法:
  1. 軟體方法
  • 由程式通過執行相應的程式指令,實現與其他程式的互斥與同步
  1. 硬體方法
  • 通過遮蔽中斷(單CPU)或是採用專門的機器指令控制互斥與同步
  1. 訊號量方法
  • 經典訊號量——表示資源的物理實體
  • 記錄型訊號量——更有效地利用資源,解決忙等的問題
typedef struct{
	int value;
	struct process_control_block *list;
}semaphore;
wait(semaphore *S){
	S->value--;//請求一個該類資源
	if(S->value<0) block(S->list);//該類資源已分配完畢,呼叫block原語進行自我阻塞並放棄處理機、插入到訊號量列表S->list中
}
signal(semaphore *S){
	S->value++;//釋放一個資源
	if(S->value<=0) wakeup(S->list);//有程式被阻塞
}
  • AND型訊號量機制——防止系統出現不安全性
  1. 管程方法
  • 管程:⼀個管程定義了⼀個資料結構和能為併發程式所執⾏的⼀組操作,這組操作能同步程式和改變管程中的資料

四、經典程式的同步問題

1 .利用記錄型訊號量解決生產者-消費者問題

問題描述:
有一群生產者程式在生產產品,並將這些產品提供給消費者程式去消費。為使生產者程式與消費者程式能併發執行,在兩者之間設定了- -個具有n個緩衝區的緩衝池,生產者程式將它所生產的產品放入一個緩衝區中;消費者程式可從一個緩衝區中取走產品去消費。

int in = 0, out = 0;//in: 輸入指標, out: 輸出指標;
item buffer[n];//n個緩衝區組成的陣列;
semaphore mutex = 1, full = 0, empty = n;
//mutex: 互斥訊號量, 生產者程式和消費者程式都只能互斥訪問緩衝區;
//full: 資源訊號量, 滿緩衝區的數量;
//empty: 資源訊號量, 空緩衝區的數量;//訊號量不允許直接參與運算, 故都要定義;

//生產者程式;
void producer() {
  do {
      producer an item nextp;//生產者生產一個產品
      ...
      wait(empty);//申請一個空緩衝區;
      wait(mutex);//申請臨界資源;
      buffer[in] = nextp;//將產品新增到緩衝區;
      in = (in + 1) % n;//類似於迴圈佇列;
      signal(mutex);//釋放臨界資源;
      signal(full);//釋放一個滿緩衝區;
  } while (TRUE);
}

//消費者程式;
void consumer() {
  do {
      wait(full);//申請一個滿緩衝區;
      wait(mutex);//申請臨界資源;
      nextc = buffer[out];//將產品從緩衝區取出;
      out = (out + 1) % n;//類似於迴圈佇列;
      signal(mutex);//釋放臨界資源;
      signal(empty);//釋放一個空緩衝區;
      consumer the item in nextc//消費者將一個產品nextc消費; 
 } while (TRUE);
}
void main(){
	cobegin
		producer(); consumer();
	coend
}

相關文章