作業系統3——程式的描述與控制
作業系統3——程式的描述與控制
——2018.12.10
文章目錄
零、目標
- 程式的定義和特徵
- 程式的基本狀態及轉換
- 程式控制塊
- 核心、原語
- 臨界資源、臨界區
- 同步機制應遵循的規則
- 記錄型訊號量、利用記錄型訊號量解決生產者
一、程式的描述
1. 程式的概念
- 程式的定義:是程式實體的執行過程,是系統進行資源分配和排程的一個獨立單位。
- 程式的特徵:動態性、併發性、獨立性、非同步性
- PCB 描述和控制程式執行,系統為每個程式定義的一個資料結構
- 程式的程式碼和資料、CPU暫存器的數值、堆和棧
- 系統資源
- 地址空間
- 開啟的檔案
2.程式的狀態
- 就緒(Ready)狀態
- 可執行,已獲得除CUP外的所需資源,等待分配CPU
- 執行(Running)狀態
- 佔用CPU執行,處於此狀態的程式數目=CPU的數目
- 阻塞(Blocked)狀態
- 等待某種條件(如I/O)操作或程式同步,在滿足條件前無法執行
3.程式的管理
- 引起程式建立的原因:
- 使用者登入:為終端使用者建立程式
- 作業排程:選中的作業建立程式
- 提供服務:為使用者提供的服務程式
- 應用請求:應用程式自己建立的程式
- 原語:由若干條指令構成,用於完成一定功能的一個過程
- 原子操作:一個操作中的所有動作,要麼全做,要麼全不做,是一個不可分割的操作。
- 程式控制塊的組織方式
- 連結方式:把具有同一狀態的PCB,用其中的連結字連結成一個佇列
- 索引方式:系統根據所有程式的狀態建立幾張索引表
二、執行緒的描述
1.執行緒的概念
- 執行緒的定義:
- 將程式的兩個屬性分開,作為排程和分派的基本單位,不同時作為資源的擁有者,就形成了執行緒的概念
- 執行緒:有時稱輕量級程式,程式中的一個執行實體,是一個CPU排程單位,資源的擁有者還是程式或稱任務
- 一個被排程和分派的基本單位並可獨立執行的實體
- 執行緒的分類
- 核心支援執行緒:依賴核心進行控制和管理
- 使用者級執行緒:在使用者級建立、撤銷和切換
- 在引入執行緒的OS系統中,則把執行緒作為排程和分派的基本單位,而把程式作為資源的擁有基本單位。
- 在同一程式中的執行緒切換不會引起程式切換
- 在不同一程式中的執行緒切換會引起程式切換
三、程式同步
1.相關的概念
- 互斥——間接相互制約關係
- 同處於一個系統中的程式必然共享某種資源,如CPU、I/O裝置等,間接相互制約即源於共享資源
- 同步——直接相互制約關係
- 源於程式程式之間的合作關係,如程式A向B提供資料,當輸入緩衝空時,B不能得到資料而阻塞
- 臨界資源
- 一次僅允許一個程式使用的資源
- 系統中的許多硬體,如印表機,諸程式之間只能用互斥的方式進行訪問
- 臨界區
- 在每個程式中訪問臨界資源的那段程式碼稱為臨界區
2.同步機制應遵循的原則
- 空閒讓進
- 當無程式處於臨界區時,應允許一個程式進入臨界區
- 忙則等待
- 當已有程式進入臨界區時,其他程式必須等待
- 有限等待
- 應保證在有限時間內進入自己的臨界區,防止“死等”
- 讓權等待
- 應立即釋放處理機,防止“忙等”
3.互斥與同步的解決方法:
- 軟體方法
- 由程式通過執行相應的程式指令,實現與其他程式的互斥與同步
- 硬體方法
- 通過遮蔽中斷(單CPU)或是採用專門的機器指令控制互斥與同步
- 訊號量方法
- 經典訊號量——表示資源的物理實體
- 記錄型訊號量——更有效地利用資源,解決忙等的問題
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 .利用記錄型訊號量解決生產者-消費者問題
問題描述:
有一群生產者程式在生產產品,並將這些產品提供給消費者程式去消費。為使生產者程式與消費者程式能併發執行,在兩者之間設定了- -個具有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
}
相關文章
- 作業系統(二)——程式的描述與控制(1)作業系統
- 【作業系統】程式的描述與控制[執行緒](4)作業系統執行緒
- 【作業系統】 第二章 程式管理 程式的描述與控制作業系統
- 作業系統系列----程式與程式 程式的描述作業系統
- 『作業系統』 程式的描述與控制 Part 1 前驅圖與程式執行作業系統
- 作業系統實驗——程式控制作業系統
- 作業系統中的描述符和GDT作業系統
- 作業系統知識回顧(3)--程式的同步與通訊作業系統
- 作業系統概念-程式控制 實驗報告作業系統
- 【作業系統】程式與執行緒作業系統執行緒
- 作業系統學習筆記之初識程式和程式控制作業系統筆記
- 作業系統與Linux作業系統Linux
- 作業系統 Linux下的程式作業系統Linux
- 【作業系統】2.併發控制作業系統
- 作業系統-程式管理作業系統
- 談談作業系統的多程式作業系統
- 作業系統篇-程式管理作業系統
- 以Windows作業系統為例,詳解版本控制系統—Git的操作Windows作業系統Git
- java與作業系統相關的操作Java作業系統
- Ubuntu作業系統的基本配置與使用Ubuntu作業系統
- web端作業控制系統簡易實現Web
- 作業系統(1)——作業系統概述作業系統
- 作業系統(一):作業系統概述作業系統
- 《作業系統》分析與總結作業系統
- 【作業系統2】作業系統啟動過程與異常/中斷,系統呼叫作業系統
- 程式設計作業——系統管理程式設計
- 作業系統——3、型別(7種)作業系統型別
- 作業系統(二):作業系統結構作業系統
- 作業系統知識回顧(2)--程式與執行緒作業系統執行緒
- LINUX作業系統知識:程式與執行緒詳解Linux作業系統執行緒
- 作業系統 作業5作業系統
- Linux作業系統 程式之間的通訊Linux作業系統
- Linux作業系統——簡單程式同步Linux作業系統
- 作業系統之程式管理:16、管程作業系統
- 作業系統-5-程式管理(二)作業系統
- 寫作業系統之實現程式作業系統
- 作業系統2—作業系統概論(下)作業系統
- 作業系統1—作業系統概論(上)作業系統