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无码| 亚洲性视频网站| 日韩精品一区二区三区中文无码| 亚洲中文字幕久久无码精品A| 国内精品91| 国产另类乱子伦精品免费女| 国产精品hd在线播放| 欧美综合一区二区三区| 亚洲av无码专区久久蜜芽| 久久人人妻人人爽人人卡片av| 在线一级毛片| 国产99精品视频| 无码高清专区| 亚洲欧美不卡视频| 91精品亚洲| 极品私人尤物在线精品首页| 精品视频一区在线观看| 91麻豆精品视频| 亚洲国产午夜精华无码福利| 国产浮力第一页永久地址| 亚洲人成网18禁| 亚洲视频免| 欧美精品伊人久久| 国产啪在线91| 亚洲精品黄| 日韩a级片视频| 成人一级黄色毛片| 波多野结衣无码视频在线观看| 亚洲天堂免费观看| 国产成人福利在线| 中文字幕欧美日韩高清| 色天天综合久久久久综合片| 人妻中文字幕无码久久一区| av在线无码浏览| 青青草原国产| 乱系列中文字幕在线视频| 久久久久人妻一区精品色奶水| 在线中文字幕日韩| 国产亚洲视频中文字幕视频| 亚洲网综合| 美女啪啪无遮挡| 成人一区在线| 亚洲国产成人麻豆精品| 国产精品思思热在线| 免费观看三级毛片| 日韩免费视频播播| 国产精品密蕾丝视频| 精品少妇人妻无码久久| 国产一二视频| 欧美a级完整在线观看| 国产成人啪视频一区二区三区 | 免费在线成人网| 国产99免费视频| 亚洲无线观看| 青青草原国产av福利网站| 97综合久久| 欧美成人日韩| 制服丝袜国产精品| 成人免费午间影院在线观看| 农村乱人伦一区二区| 国产 日韩 欧美 第二页| 亚洲欧美另类视频| 国产aⅴ无码专区亚洲av综合网 | 毛片一级在线| 国产成人精品综合| 毛片网站免费在线观看| 国产欧美视频综合二区| 欧美亚洲日韩不卡在线在线观看| 在线观看网站国产| 欧美中日韩在线| 成人伊人色一区二区三区| 亚洲婷婷六月| 亚洲欧美国产视频| Jizz国产色系免费| 成人自拍视频在线观看|