作業系統程序管理實驗 3

2021-10-01 15:25:14 字數 1613 閱讀 9669

繼上次的建立執行緒後,我又帶著一段新的**來了qaq

死鎖是什麼呢?

死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

啥是互相競爭資源?我上次提到在作業系統中有一些資源在乙個時間點上只能被乙個程序訪問,這些資源被稱為臨界資源,為了實現臨界資源的同步訪問,我們加了乙個鎖,當程序獲得這個鎖後它才可以訪問臨界資源,說到著,我們試著想一想若是乙個資源必須獲得兩個鎖才可以訪問,當乙個程序獲得乙個鎖後,另乙個程序恰巧獲得了另乙個鎖,此時第乙個程序得不到第二個鎖,第二個程序得不到第乙個鎖,就產生了死鎖。

我們來看一段**:

#include #include #include #include #define loop_times 10000

pthread_mutex_t mutex1 = pthread_mutex_initializer;

pthread_mutex_t mutex2 = pthread_mutex_initializer; //靜態初始化互斥鎖

void* thread_worker(void*);

void critical_section(int thread_num, int i);

int main(void)

for (i=0; i前面的宣告很簡單,定義了乙個迴圈次數和兩個鎖,我們直接看主程式:

rtn = pthread_create(&pthread_id, null, thread_worker, null ); //第乙個null表示設定執行緒的屬性,第二個null表示萬能指標arg,thread_worker表示執行緒從thread_worker函式的位址開始執行

if(rtn != 0) //出錯

從**可以看出首先建立了乙個執行緒,將它的id賦給了pthread_id,沒有傳參,執行緒執行thread_work()函式,若建立出錯return。我們先來看執行緒執行了個啥?

void* thread_worker(void *p)

這句列印語句thread%d其實想告訴我們傳進去的2其實代表了這個程序的代號,那1呢?自然是主程序了,這句**簡單的列印了當前的迴圈次數。按照程式的走向,我們該看下面的**了:

for (i=0; i啥都沒變,基本和執行緒執行的**一樣,唯一有區別的是它拿鎖的順序不同,它先拿的1鎖,而執行緒先拿2鎖。其實程式挺簡單的,到此我們可以**一下程式的執行了:主程序和執行緒互相競爭資源來列印資訊,所以開始會有一些資訊被列印,到某一時刻時,主程序搶到了1鎖,執行緒搶到了2鎖導致系統死鎖,程式進入假死狀態。我們來驗證一下,為了看的更清楚為加兩個列印語句:

for (i=0; i好了,執行如下:

......一點問題也沒有,有點不習慣??????哈哈哈,這樣我就能睡覺了。0.0

作業系統實驗之程序管理

實驗內容 建立新的程序 檢視執行的程序 換出某個程序 殺死執行程序以及程序之間的通訊 下面是 include conio.h include stdio.h include stdlib.h struct pcb struct pcb neicun 20 waicun 20 int count 0,...

作業系統實驗之程序管理

程序名 要求執行時間 優先數狀態 其中,程序名 作為程序的標識,假設五個程序的程序名分別為p1,p2,p3,p4,p5。要求執行時間 假設程序需要執行的單位時間數。優先數 賦予程序的優先數,排程時總是選取優先數大的程序先執行。狀態 可假設有兩種狀態,就緒 狀態和 結束 狀態。五個程序的初始狀態都為 ...

xtu 作業系統實驗1 程序管理

實驗環境 ubuntu shell終端編譯執行 一 實驗內容 1 程序的建立 編寫一段程式,使用系統呼叫fork 建立兩個子程序.當此程式執行時,在系統中有乙個父程序和兩個子程序活動.讓每乙個程序在螢幕上顯示乙個字元 父程序顯示字元 a 子程序分別顯示字元 b 和字元 c 試觀察記錄螢幕上的顯示結果...