【作業系統】 第二章 程式管理 程式的描述與控制
第二章 程式管理 描述與控制
2.1 什麼是程式
程式程式碼+相關資料+程式控制塊PCB
當處理器開始執行一個程式的程式碼時,稱這個執行的實體為程式
2.1.1 程式和程式控制塊PCB
PCB(Process Control Block)
- PCB是程式中斷的基礎,恢復執行後好像從未中斷一樣
- PCB由OS建立和管理
- 支援多程式的工具
PCB是用於程式管理的資料結構
PCB元素 | 作用 |
---|---|
id | 識別符號 |
state | 狀態 |
PC | 程式計數器 |
memory pointer | 記憶體指標 |
context | 上下文 |
I/O status | I/O狀態 |
…… | …… |
2.1.2 程式VS程式
程式是劇本,程式是演出
程式基本特徵:
- 動態性(本質特徵):程式存在生命週期
- 併發性(重要特徵):可同其他程式一同推進
- 獨立性:各程式地址空間相互獨立(邏輯地址)
- 非同步性:程式按不可預知速度推進
與程式相比:
1. 程式是正在計算機執行的例項
2. 程式=PCB+程式程式碼+資料
3. 程式是靜態的,沒有生命週期
4. 程式與程式並無一一對應關係,如一個dad()程式中涉及多個PV程式
5. 引入程式的概念是為了容易正確解釋多道程式併發
2.2 程式狀態
程式軌跡
程式的待執行指令序列,描述單個指令的行為(指南)
分派器Dispatcher
將cpu從一個程式切換到另一程式
2.2.1 兩狀態模型
2.2.2程式建立與終止
程式建立
OS建立用於管理程式的PCB
OS為程式分配記憶體
建立原因
- 新作業<-舊的已完成
- 使用者登入<-字面意思
- 使用者請求服務<-比如請求列印
- 程式派生<-如fork()
相關
程式派生:程式顯式請求建立一個程式(子程式)
父程式:原來的程式
子程式:派生的新程式
終止原因
- 作業完成
- timeout
- 無可用記憶體
- 無許可權訪問
- 超出可用記憶體範圍
- 訪問受保護的檔案
- 不可運算
- 超時(等不及)
- I/O失效 如讀寫失敗
- ……
- 父程式終止 父死子亡
五狀態模型
排隊模型
- 單阻塞佇列:所有阻塞佇列在同一佇列,事件後滿足需遍歷整個佇列
- 多阻塞佇列:不同阻塞條件對應不同佇列
同樣的,可以根據不同優先順序維護多個就緒佇列
2.2.4 被掛起的程式
是為了解決記憶體有限的問題,把暫時阻塞的程式部分或全部換出到外存的掛起佇列中
掛起後
- OS排程新程式
- 從掛起佇列取新程式
掛起
記憶體中處於阻塞、就緒甚至執行的程式釋放到外存,不再參與cpu競爭
七狀態模型
掛起的程式
不能立刻執行、在外存中、不會自行換入、可能在等待或不等待條件
掛起原因
- 交換(騰出空間)
- 使用者請求
- 父程式請求
- 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的執行
- 無程式的核心:核心獨立於程式(separate kernel)
- 使用者程式內的作業系統:程式與核心函式同時執行(OS function execute with process)
- 基於程式的作業系統:核心函式與程式同級執行(OS function execute with separate process)
2.5 UNIX SVR4程式管理
fork()用於建立程式:pid=fork();
注意三點:
- fork()建立子程式之後,父子程式均各自繼續執行
- 子程式的fork()返回pid=0,父程式的fork()返回所建立的子程式id
- 父子程式的推進順序不可估計
舉三個例子幫助理解:
例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”)
執行緒優點
- 建立耗時短
- 終止耗時短
- 切換耗時短(同程式內)
- 提高了不同執行程式間的通訊效率
執行緒同步
- 一個程式中的所有執行緒共享該程式資料和空間
- 一個執行緒對資料修改會影響其他執行緒
2.6.2執行緒分類
使用者級執行緒 ULT(User-Level Thread)
- 執行緒核心不可見,由應用程式管理
- 程式阻塞,執行緒不一定阻塞;程式執行,執行緒也可能阻塞
- 優點
- 執行緒切換不需要切換核心模式
- 排程策略可以應用程式定製
- 可執行在任何種類的OS上
- 缺點
- 執行緒系統呼叫時會阻塞該程式所有執行緒
- 不適用於多核系統
- 缺點的改進辦法
- jacketing技術:由應用級呼叫替代系統呼叫
核心級執行緒 KLT(Kernel level Thread)
- 核心管理執行緒,應用程式不管理執行緒
- 優點
- 可以將多個執行緒分配到多個cpu上
- 一個執行緒阻塞時,同程式其他執行緒不會阻塞
- 核心本身也可以使用多執行緒
- 缺點
- 執行緒切換要進行模式切換
混合方法(ULT+KLT)
- 執行緒在使用者級建立
- 執行緒排程、同步由應用程式完成
- 使用者執行緒一個或多個對映到核心執行緒上(核心執行緒要更少)
相關文章
- 作業系統3——程式的描述與控制作業系統
- 作業系統(二)——程式的描述與控制(1)作業系統
- 作業系統系列----程式與程式 程式的描述作業系統
- 【作業系統】程式的描述與控制[執行緒](4)作業系統執行緒
- 『作業系統』 程式的描述與控制 Part 1 前驅圖與程式執行作業系統
- 作業系統思考 第二章 程式作業系統
- 作業系統-程式管理作業系統
- 作業系統實驗——程式控制作業系統
- 作業系統篇-程式管理作業系統
- 程式設計作業——系統管理程式設計
- 初識程式(一)——作業系統,程式管理,程式狀態作業系統
- 作業系統之程式管理:16、管程作業系統
- 作業系統-5-程式管理(二)作業系統
- 作業系統概念-程式控制 實驗報告作業系統
- 作業系統學習筆記之初識程式和程式控制作業系統筆記
- 【作業系統】程式與執行緒作業系統執行緒
- Java作業系統課設之模擬程式管理系統Java作業系統
- 作業系統 Linux下的程式作業系統Linux
- 作業系統中的描述符和GDT作業系統
- LINUX系統中程式如何管理控制(一)Linux
- Java程式設計第二章作業Java程式設計
- 談談作業系統的多程式作業系統
- 計算機組成原理與作業系統 第二章 處理機組成與管理計算機作業系統
- 第二章 程式管理
- 第二章 作業系統的執行機制作業系統
- 作業系統知識回顧(3)--程式的同步與通訊作業系統
- Linux作業系統——簡單程式同步Linux作業系統
- 寫作業系統之實現程式作業系統
- Linux程式及作業管理Linux
- Linux作業系統 程式之間的通訊Linux作業系統
- java程式與設計大作業-馬拉松管理系統Java
- 作業系統知識回顧(2)--程式與執行緒作業系統執行緒
- LINUX作業系統知識:程式與執行緒詳解Linux作業系統執行緒
- Linux作業系統之Shell程式設計Linux作業系統程式設計
- 作業系統程式、儲存和I/O作業系統
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- 作業系統裝置管理作業系統