999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種基于線程機制的死鎖模擬教學實驗設計

2012-12-31 00:00:00李波秦明
科技創新導報 2012年9期

摘 要:計算機操作系統課程由于概念抽象,較難理解和掌握,因而課程實驗對于加強概念的理解顯得尤為重要。死鎖是該課程的一個非常核心的概念,本文設計了一個基于windows環境下線程機制的死鎖模擬教學實驗,程序簡單,易于實現和理解。實踐表明,該實驗在教學過程中收到了良好效果。

關鍵詞:操作系統死鎖; 教學實驗線程

中圖分類號: G642文獻標識碼:A 文章編號:1674-098X(2012)03(c)-0000-00

計算機操作系統課程是計算機本科專業的一門專業核心課,也是一門考研課程。該課程由于涉及到操作系統的深層次概念和原理,因而對于大多數學生而言,較難理解和掌握。正由于該課程的重要性,很多高校研究人員對該課程的教學方法進行了深入探討,如文獻[1],[2]。而目前的操作系統實驗教材雖然不少[3][4],但很少有設計實驗直接對死鎖現象進行模擬的。本文基于線程機制利用windows環境下API函數實現了一個死鎖現象的構建和模擬實驗,算法簡單,易于被學生理解,教學中可操作性強。

1 死鎖的基本概念

設系統中存在一組進程(2個或2個以上進程),其中每一個進程都占用了某些資源,而又都在等待其中另一個進程所占用的資源,如果系統無外力作用,這種等待永遠不會結束,則稱系統出現了“死鎖”,或說這組進程處于“死鎖”狀態。

死鎖是因并發進程競爭資源而引起的一種現象,并發進程對多個資源的共享與競爭有可能導致死鎖。死鎖可以在2個或多個進程之間發生,也可以在系統全部進程之間產生。死鎖是一種與時間有關的錯誤,在并發系統中,死鎖可以在進程通信過程中以及在用信號量作同步工具時,由于P、V操作順序不當而產生。

因此,產生死鎖的原因是,一方面是由于多進程共享的資源不足而引起競爭資源;另一方面是由于進程在運行過程中推進順序不合法。

2 實驗內容設計

問題描述:設有一個倉庫存有50箱貨物,需要請若干搬運工人搬走。本實驗通過兩個線程模擬完成2個搬運工人合作搬運貨物的過程。

一方面,利用關鍵代碼段(臨界區)實現線程同步;另一方面,模擬實現線程死鎖。利用線程死鎖來讓學生體會進程死鎖的本質概念。實驗采用windows下的Visual C++平臺的Console Application進行。

通過本次實驗,可以幫助學生熟悉VC下關鍵代碼段(即臨界區),和相關API函數。分析線程同步的參考代碼,分析運行結果。理解線程同步的概念。

實驗中,首先給學生提供一段初始程序,該程序可以實現2個搬運工線程正常合作搬運貨物的過程。這樣,既可以減少學生實驗的難度,提高實驗效率,又可以讓學生將實驗的注意力集中到對同步和死鎖問題的理解上去。

然后,要求學生進一步調試和修改代碼,并思考以下兩個問題:

①如何修改,使得搬運線程1會始終搬運貨物,而搬運線程2始終得不到搬運貨物的機會?

②如果對本次實驗給出的參考代碼進行修改,制造線程死鎖現象?

2.1初始程序及分析

初始程序如下:

#include

#include

DWORD WINAPI FuncProc1(LPVOID

lpParameter);//thread data

DWORD WINAPI FuncProc2(LPVOID

lpParameter);//thread data

int products=50;//貨物總數

CRITICAL_SECTION csA;

void main()

{

HANDLE hThread1;

HANDLE hThread2;

hThread1=CreateThread(NULL,0,FuncProc1,NULL,0,NULL);//創建進程

hThread2=CreateThread(NULL,0,FuncProc2,NULL,0,NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

InitializeCriticalSection(csA);//創建臨界區對象

Sleep(4000);

DeleteCriticalSection(csA);//程序退出前釋放臨界區對象資源

}

DWORD WINAPI FuncProc1(LPVOID lpParameter)//thread data

{

while(TRUE)

{

EnterCriticalSection(csA);//判斷能否進臨界區

Sleep(1);

if(products>0)

{

Sleep(1);

cout<<”thread1 move product:”<

LeaveCriticalSection(csA);//釋放臨界區對象

}

else

{

LeaveCriticalSection(csA);

break;

}

}

return 0;

}

DWORD WINAPI FuncProc2(LPVOID lpParameter)//thread data

{

while(TRUE)

{

EnterCriticalSection(csA);

Sleep(1);

if(products>0)

{

Sleep(1);

cout<<\"thread2 move product:\"<

LeaveCriticalSection(csA);

}

else

{

LeaveCriticalSection(csA);

break;

}

}

return 0;

}

程序運行結果及簡要分析如下,

經過編譯運行后,輸出如下結果:

thread2 move product:50

threadl move product:49

thread2 move product:48

threadl move product:47

thread2 move product:46

threadl move product:45

……

thread2 move product:2

threadl move product:1

請按任意鍵繼續. .

臨界區被占用的時間一般不允許過長,只要進入臨界區的線程還沒有離開,其他所有試圖進入此臨界區的線程都會被掛起而進入到等待狀態,并會在一定程度上影響程序的運行性能。尤其需要注意的是不要將等待用戶輸入或是其他一些外界干預的操作包含到臨界區。如果進入了臨界區卻一直沒有釋放,同樣也會引起其他線程的長時間等待。即,必須確保EnterCriticalSection()語句和與之匹配的LeaveCriticalSection()語句都能夠被完整執行到。可以通過添加結構化異常處理代碼來確保LeaveCriticalSection()語句的執行。雖然臨界區同步速度很快,但卻只能用來同步本進程內的線程,而不可用來同步多個進程中的線程。

2.2 構建死鎖現象

怎樣修改這個程序,才有可能使其產生死鎖呢?關鍵在于臨界區的個數要多于一個。換句話說,只要臨界區數大于1,并且線程數多于1,就有可能出現死鎖。

其源程序代碼修改如下:

DWORD WINAPI FuncProc1(

LPVOID lpParameter);

DWORD WINAPI FuncProc2(

LPVOID lpParameter);

int products=50;

CRITICAL_SECTION csA;

CRITICAL_SECTION csB;

void main()

{

HANDLE hThread1;

HANDLE hThread2;

hThread1=CreateThread(NULL,0,FuncProc1,NULL,0,NULL);//創建線程

hThread2=CreateThread(NULL,0,FuncProc2,NULL,0,NULL);

CloseHandle(hThread1);

CloseHandle(hThread2);

InitializeCriticalSection(csA);//創建臨界區對象

InitializeCriticalSection(csB);

Sleep(4000);

DeleteCriticalSection(csA);//程序退出前釋放臨界區對象資源

}

DWORD WINAPI FuncProc1(

LPVOID lpParameter)

{

while(TRUE)

{

EnterCriticalSection(csA);//判斷能否進入臨界區

Sleep(1);

if(products>0)

{EnterCriticalSection(csB);

Sleep(1);

cout<<\"threadl move product:\"<

LeaveCriticalSection(csA);//釋放臨界區對象所有權

}

else

{ LeaveCriticalSection(csA);

break;

}

}

return 0;

}

DWORD WINAPI FuncProc2(

LPVOID lpParameter)

{

while(TRUE)

{

EnterCriticalSection(csA);

Sleep(1);

if(products>0)

{EnterCriticalSection(csA);

Sleep(1);

cout<<\"thread2 move product:\"<

LeaveCriticalSection(csB);

}

else

{LeaveCriticalSection(csA);

break;

}

}

return 0;

}

由此我們再引導學生回顧產生死鎖的必要條件:

①互斥使用資源條件;

②占有和等待條件;

③不剝奪條件;

④循環等待條件。

可以發現,兩個搬運線程之所以產生死鎖,正是滿足了以上死鎖的必要條件。

3 討論

由線程概念擴展到進程概念。當系統中有2個甚至多個臨界區,并且多個進程同時共享這些臨界區時,進程之間因為資源競爭關系很可能會發生死鎖,使死鎖發生的幾率增大。此時,我們可以通過以下思路來預防死鎖,即通過給每個進程所需要的資源(臨界區)進行編號,并且讓進程在申請這些資源時,采取按序申請的原則(序號從小到大或從大到小)逐一申請,這樣,可以在一定程度可以預防死鎖,使系統中各程序能正常運行下去。

這一思想正是操作系統教材中提出的有序資源分配法,由此,我們將死鎖的產生、過程和預防辦法都進行了簡要分析。

4 結語

本文設計了一個基于線程機制的操作系統課程的死鎖模擬教學實驗,通過本實驗的學習,可以幫助學生達到以下實驗效果:

(1)理解線程的概念;

(2)熟悉進程、線程同步的概念;

(3)深刻理解死鎖的本質;

(4)深入理解操作系統對多線程調度的管理;

(5)深刻理解臨界區和互斥的概念。

并由此舉一反三,延伸到進程死鎖的概念。經教學實驗的實踐,學生通過本實驗加深了對死鎖的概念的理解和掌握,收效良好。

參考文獻

[1]馬曉慧。操作系統課程教學方法探索[J],計算機教育,2011

[2]劉曉平,陳欣,李琳,路強,田衛東。面向操作系統課程的“啟發—探究式”教學方法初探[J]。計算機教育,2011

[3]王煜,張明,劉振鵬。操作系統習題解答與實驗指導,中國鐵道出版社,2004

主站蜘蛛池模板: 午夜精品国产自在| 免费看a毛片| 久久综合色播五月男人的天堂| 天堂岛国av无码免费无禁网站| 欧美69视频在线| jizz在线观看| 欧亚日韩Av| 国产无码精品在线播放| 国产欧美成人不卡视频| 亚洲自拍另类| 国产性精品| 国产欧美日韩专区发布| 国产乱子伦精品视频| 亚洲日韩每日更新| 国产一区二区三区在线观看免费| 在线永久免费观看的毛片| 国产呦精品一区二区三区网站| 欧美一级色视频| 亚洲午夜18| 国产欧美网站| 波多野结衣二区| 最新国产你懂的在线网址| 91小视频在线| 国产成人AV大片大片在线播放 | 一级爆乳无码av| 亚洲天堂色色人体| 熟女成人国产精品视频| 热99re99首页精品亚洲五月天| 国产女人18毛片水真多1| h视频在线播放| 国产在线视频自拍| 欧美日韩中文字幕在线| 极品国产在线| 免费AV在线播放观看18禁强制| 国产丰满成熟女性性满足视频| 性69交片免费看| 无遮挡一级毛片呦女视频| 免费一级大毛片a一观看不卡| 国产情精品嫩草影院88av| 免费又黄又爽又猛大片午夜| 无码精品福利一区二区三区| 国产成人综合网| 真实国产精品vr专区| 天天干天天色综合网| av在线手机播放| 国产欧美精品一区aⅴ影院| 国产精品xxx| 亚洲三级色| 一区二区在线视频免费观看| 91精品专区| 国产精品久久久久鬼色| 综合色88| 亚洲第一极品精品无码| 97综合久久| 亚洲国产成人精品一二区| 国产一级毛片高清完整视频版| 免费一级毛片完整版在线看| 精品一区二区三区波多野结衣| 国产精品自拍露脸视频| 三区在线视频| 高清色本在线www| 少妇极品熟妇人妻专区视频| а∨天堂一区中文字幕| 波多野衣结在线精品二区| 久久77777| 一区二区午夜| 亚洲成a∧人片在线观看无码| 国产91av在线| 精品国产一区91在线| 伊人激情久久综合中文字幕| 九九久久精品免费观看| 丰满人妻一区二区三区视频| 99九九成人免费视频精品| 国产精品久久久久婷婷五月| 亚洲高清国产拍精品26u| 欧美激情综合一区二区| 精品视频一区二区观看| www.av男人.com| 日韩免费毛片| 777午夜精品电影免费看| 亚洲av无码人妻| 永久成人无码激情视频免费|