第二章 5節 程序同步

2021-09-08 17:45:34 字數 2829 閱讀 2422

(ps:個人課下整理的作業系統筆記,onenote直接拷貝過來的,看不了就將就一下,配合張偉老師的ppt看效果更好)

本章討論一種機制,該機制能確保共享同一邏輯位址空間的協作程序能有序執行並維護共享資料的一致性

協作程序(cooperating processes

//定義全域性變數

item buffer[buffer_size];

int counter=0;

int in=0;

int out=0;

//生產者:

item nextproduced;

while(1)

//消費者:

item nextconsumed;

while(1)

解決臨界區問題必須滿足以下三個條件:

互斥(mutual exclusion

乙個程序在臨界區,其餘程序不能進入該臨界區

前進(progress)

p1想進,其餘程序不想進,則p1可以進;

p1和p2想進,從臨界區剛出來的p2要把機會讓給p1;

p1剛出來又想進,其餘程序不想進,則p1可以進;

有限等待(bounded waiting)

不能讓乙個程序無限等待

記法:外層乙個do while

i想進, flag[i]= true,j的turn

while(flag[j] && turn==j );

否則i進臨界區critical section

,出來後i不想進,flag[i] = false

具體演算法步驟:

dowhile(1)

boolean

testandset

(boolean*target)

lock原來是啥就返回啥,然後lock置true

記法:

前提lock=false

while true,while(test and set(lock));

臨界區出來後lock false

具體演算法步驟:

lock=false;

while(true)

void swap (boolean *a, boolean *b)

就是乙個交換方法

記法:前提lock=false

while true ,key =true

while key=true ,swap(lock 和 key);

臨界區出來後lock false

具體演算法步驟:

lock=false;

while(true)

1.訊號量是乙個整數變數,只允許有wait()與signal()兩個原子操作,原來wait()稱為p,signal()稱為v,即pv測試

2.wait()與signal()演算法:

3.利用訊號量解決n個程序的同步問題

4.訊號量的主要缺點是忙等待,浪費cpu時鐘,試圖進入臨界區的程序必須在其**中連續的迴圈。

5.死鎖(deadlock)和飢餓(starvation)

6.訊號量的型別:計數型(可作為互斥鎖)和二進位制型

1.有限緩衝區問題(bounded-buffer problem)——生產者消費者問題

while(true)

while(true)

2.讀寫者問題(readers and writers problem)

1、若沒有寫者已經獲得允許使用共享資料庫,則讀者不需要等待

2、若已有乙個寫者程序獲得使用共享資料庫,則讀者需要保持等待

3、若乙個讀者獲得允許使用共享資料庫,且有乙個寫者程序在等待,則其他讀者程序不需要等待。

一旦寫者就緒,寫者會盡可能快獲得共享資料庫。

while(true)

while(true)

為了更易於編寫正確的程式,提出高階同步原語——管程

x.signal()重新啟動乙個懸掛的程序。

讀者(reader):

初始化:

semaphore mutex = 1

semaphore wrt = 1//讀寫者共享的訊號量

int readcount = 0;//記錄有多少個讀者程序進入到資料庫

寫者(writer):

第二讀寫者問題——寫者優先

第一讀寫者問題——讀者優先

記法:

consumer:

初始化

n buffers//共有n個格仔

semaphore mutex=1

semaphore full=0//滿項格仔的個數

semaphore empty=n//空項格仔的個數

producer:

死鎖:兩個或多個程序都在等待乙個事件,而該事件只能由其中乙個等待程序來發生

一組程序處於死鎖狀態指:組內的每個程序都在等待乙個事件,而該事件只能由同組內另乙個程序觸發

飢餓/無窮阻塞:同組內的某乙個程序可能會無窮等待訊號量,如果對訊號量的鍊錶採用lifo順序,則可能會發生無窮阻塞

為了克服忙等的缺點,修改wait和signal的定義

進入臨界區:mutex==1,大於等於1.進入後,mutex==0

互斥,其他程序呼叫wait(mutex)則陷入while迴圈,直到前乙個程序呼叫signal將mutex設為1.

併發的訊號量也可以解決兩個併發程序的執行順序問題(第乙個p1,signal,第二個wait,p2),semaphore初始化為0

第二章第二節程序控制與同步

2.2程序的控制 基本過程 程序的建立 程序的終止 程序的阻塞與喚醒 程序的掛起和啟用 1 程序的建立 1 乙個程序建立另一程序的事件 原因 使用者登入 分時情況下使用者的請求 作業排程 批處理中 提供服務 執行中的使用者程式提出功能請求,要建立服務程序 如列印服務 應用請求 應用程式自己建立程序,...

第二章 2 2節

2.2 1 用 記號表示函式n 3 1000 100n 2 100n 3 解答 這個就很簡單了,這裡我們真正感興趣的執行時間是增長率,也就是直接控制函式影象斜率的因素。這裡就是 n 3 2.2 2 考慮排序儲存在陣列a中的n個數 首先找出a中的最小元素並將a 1 中的元素進行交換。接著,找出a中的次...

第二章 2 3節

2.3 1 使用圖2 4作為模型,說明歸併排序再陣列a 3,41,52,26,38,57,9,49 解答 兩個數中間的 號為連線符,代表 號兩邊的數歸併一起。3 41 52 26 38 57 9 49 3 41 26 52 38 57 9 49 3 26 41 52 9 38 49 57 3 9 2...