專題二 進程管理 之進程的同步與通信

專題二 進程管理 之進程的同步與通信

一. 名詞解釋

(一)進程的概念


多道程序: 在計算機內存中同時存放多道相互獨立的程序,使它們在管道程序的控制下,相互交替運行,這些程序在計算機系統中同處於運行狀態且共享計算機系統資源

進程: 進程是具有獨立功能的程序關於某個數據集合上的一次運行活動,是系統進行資源分配調度的一個獨立單位

進程控制塊(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年 王道考研 – 操作系統

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章