專題二 進程管理 之進程的同步與通信
一. 名詞解釋
(一)進程的概念
多道程序: 在計算機內存中同時存放多道相互獨立的程序,使它們在管道程序的控制下,相互交替運行,這些程序在計算機系統中同處於運行狀態且共享計算機系統資源
進程: 進程是具有獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位
進程控制塊(PCB): 一個用來記錄進程的外部特徵,描述進程的運動變化過程的數據結構
進程映像: 由程序,數據集合,棧和PCB組成
線程: 進程任務集中的不可再分的子任務,是進程執行運算的最小單位,是執行調度的基本單位
(二)進程的同步
進程的互斥: 指多個進程不能同時使用一個資源
進程的同步: 進程之間的協作
臨界資源: 一次僅允許一個進程使用的共享資源
臨界區: 在每個進程中訪問臨界資源的程序段
原語: 一組要麼不間斷地執行,要麼都不執行的原子操作
信號量: 記錄進程已釋放的共享資源的量
管程: 一個數據結構和能爲併發進程在其上執行的一組操作,這組操作能使進程同步和改變管程中的數據
(三)進程的通信(三種方式)
共享存儲: 在內存中分配一片空間作爲共享存儲區,需要進行通信的各個進程把共享存儲區附加到自己的地址空間,然後同正常操作對共享區中的共享數據進程讀或寫
管道文件: 連接兩個命令的一個打開文件(其中一個命令向文件中寫入數據,另一個命令向文件讀出數據)
消息傳遞: 以消息爲單位在進程間進行數據交換
二. 進程的闡述
1.多道程序的特點:
(1)失去封閉性;
(2)程序與計算失去一一對應;
(3)程序併發執行時產生相互制約的關係;
2.進程的特點:
(1)併發性:是進程最基本的特徵
(2)動態性:是進程最基本的特徵
(3)調度性:進程是資源調度的基本單位
(4)異步性:程序之間執行的時間順序是不同的
(5)結構性:(PCB)
3.進程的狀態:
(1)運行狀態:當前進程已分配到CPU
(2)就緒狀態:進程已具備運行條件,但未被分配到CPU
(3)阻塞狀態:進程因等待某種事件發生而暫時不能運行的狀態
三. 進程的通信
(1)低級進程通信: 普通的進程同步與互斥操作
(2)高級進程通信:
- | 共享存儲 | 管道文件 | 消息傳遞 |
---|---|---|---|
優點 | 快捷 | 明確消息接受與發送方 | 點到點的傳送 |
缺點 | 不明確接受方與發送方存在安全隱患 | 必須指定接受進程的 ID |
四. 進程的同步
問題1:生產者 - 消費者問題
問題描述: 若干進程通過有限的共享緩衝區交換數據。其中,“生產者”進程不斷寫入,而“消費者”進程不斷讀出;共享緩衝區共有N個;任何時刻只能有一個進程可對共享緩衝區進行操作
問題分析:
進程的類別:從緩衝區取數據的消費者;從緩衝區存數據的生產者;
進程的關係:生產者與消費者進程關係屬於同步關係;生產者與生產者訪問緩衝區屬於互斥關係;消費者與消費者訪問緩衝區屬於互斥關係
信號量的設置:
Semaphore empty :表示可供使用的緩衝區的個數,初始化爲緩衝區存儲單元的個數;
Semaphore full:表示可供使用的緩衝區數,初始化爲 0;
Semaphore mutex:互斥信號量,初始化爲1;
僞代碼示例:
生產者進程
Producer ()
begin:
P(empty);//判斷緩衝區是否滿了
P(mutex);//互斥訪問緩衝區
Produce data;//生產者生產數據,放入緩衝區
V(mutex);
V(full);
end
消費者進程
Consumer ()
begin:
P(full);//判斷緩衝區是否爲空
P(mutex);//互斥訪問緩衝區
Produce data;//消費者生產數據,從緩衝區取出
V(mutex);
V(empty);
end
變式:假定系統有三個併發進程 read, move, print 共享緩衝器 B1 和 B2,進程 read 負責輸入設備上讀信息,每讀出一個記錄後把它放到緩衝器 B1 中,進程 move 從緩衝器 B1 中取出一個記錄,加工後存入緩衝器 B2 ,進程 print 將 B2 中的記錄取出打印輸出,緩衝器 B1 和 B2 每次只能存放一個記錄,要求三個進程協調完成任務,是打印出來的與讀入的記錄的個數,次序完全一樣。請用 P,V 操作,寫出它們的併發程序
– 解:
進程類別 :read,move,print;
進程之間的關係:read之間互斥關係,move之間互斥關係,print之間互斥關係,read與move之間同步關係,move與print之間同步關係;信號量設置:
Semaphore empty1:B1緩存中空閒位置數,初始化爲1;
Semaphore empty2:B2緩存中空閒位置數,初始化爲1;
Semaphore full1:B1緩衝中存放的數據的數,初始化爲0;
Semaphore full2:B2緩衝中存放的數據的數,初試化爲0;
僞代碼示例:
/* read */
read()
begin:
read_data();//讀取數據
P(empty1);
load_to_B1();//將讀取的數據讀入B1中
V(full1);
end
/* move */
move()
begin:
P(full1);
Scratch_data();//從 B1 取數據
V(empty1);
P(empty2);
load_to_B2();//加工數據後寫入 B2
V(full2);
end
/* print */
print()
begin:
P(full2);
print_data();//打印 B2 的數據
V(empty2);
end
問題2:讀者 - 寫者問題
問題描述: 對共享資源的讀寫操作,任何時刻“寫者”最多允許一個,而“讀者”則允許多個
問題分析:
進程類別:讀者;寫者
進程關係:讀寫互斥;寫寫互斥;讀讀允許
信號量設置:
Semaphore rw =1 :用於實現對文件的互斥訪問,表示當前是否有進程在訪問共享文件
int count = 0:用來記錄當前有幾個讀進程在訪問文件
Semaphore mutex = 1:用於保證對count變量互斥訪問;
Semaphore w = 1:用於實現“寫優先”
僞代碼示例:
讀者進程
Reader()
begin:
P(w);
P(mutex);
if(count == 0)
P(rw);
count++;
V(mutex);
V(w);
Read File;
P(mutex);
count--;
if(count == 0)
V(rw);
V(mutex);
end
寫者進程
Writer()
begin:
P(w);
P(rw);
Write File;
V(rw);
V(w);
end
注意事項:
(1)在此算法當中,連續進入的多個讀者可以同時讀文件;寫者和其他進程不能同時訪問文件
(2)寫者不會飢餓,但也並不是真正意義的寫優先,而是相對公平的先來先服務原則
附:參考文獻
[1] 操作系統原理 機械工業出版社 第二版 孟慶昌 張志華
[2] 參考慕課:西安交通大學 軟件學院 田麗華(副教授)
[3] 2020年 王道考研 – 操作系統