實驗名稱:哲學家就餐問題
班級:通訊1202班
學號:u201213584
姓名:趙越
指導老師:許毅平
一、實驗目的
1.熟練使用vc++6.0編譯環境,除錯並正確執行程式,更加熟練地利用c語言解決問題
2.了解哲學家就餐的基本原理,掌握死鎖的必要條件。
3.理解源程式中產生和防止的演算法,及相關視窗操作。
二、實驗原理
1. 問題描述:
有五個哲學家圍坐在一圓桌旁,桌**有一盤通心粉,每人面前有乙隻空盤子,每兩人
之間放乙隻筷子每個哲學家的行為是思考,感到飢餓,然後吃通心粉.為了吃通心粉,每
個哲學家必須拿到兩隻筷子,並且每個人只能直接從自己的左邊或右邊去取筷子。
2.分析問題:
假如所有的哲學家都同時拿起左側筷子,看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子,如此這般,永遠重複。對於這種情況,即所有的程式都在無限期地執行,但是都無法取得任何進展,即出現飢餓,所有哲學家都吃不上飯。
規定在拿到左側的筷子後,先檢查右面的筷子是否可用。如果不可用,則先放下左側筷子,等一段時間再重複整個過程。
分析:當出現以下情形,在某乙個瞬間,所有的哲學家都同時啟動這個演算法,拿起左側的筷子,而看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子……如此這樣永遠重複下去。對於這種情況,所有的程式都在執行,但卻無法取得進展,即出現飢餓,所有的哲學家都吃不上飯。
解決死鎖問題:為了避免死鎖,把哲學家分為三種狀態,思考,飢餓,進食,並且一次拿到兩隻筷子,否則不拿.。
僅當乙個哲學家左右兩邊筷子都可用時,才允許他拿筷子。這樣要麼一次占有兩隻筷子在吃麵,然後釋放所有資源;要麼不占用資源。這樣就不會導致死鎖了。
由以上的分析可以得出以下結論:
(1)、防止死鎖發生的分配方式:
僅當乙個哲學家左右兩邊的筷子都可用時,才允許他拿筷子。這樣要麼一次占有兩隻筷子(所有執行緒需要的資源)進行下一步的吃通心粉,然後釋放所有的資源;要麼不占用資源,這樣就不可能產生死鎖了。
(2)、產生死鎖的分配方式:
當筷子(資源)可用時,先分配左邊的筷子,等待一會後再分配右邊的筷子,由於這個過程中,左邊的筷子一直沒有釋放,就有可能產生死鎖了。
三、實驗過程
實驗的偽**如下所示:
1.不發生死鎖的方式(要麼一下占用兩支筷子,要麼不占用 )
var mutexleftchopstick,mutexrightchopstick;
beging:
resting;
waiting;
p(mutexleftchopstick);
p(mutexrightchopstick);
getresource(leftchopstick,rightchopstick);
eating;
v(mutexleftchopstick);
v(mutexrightchopstick);
end2.發生死鎖的方式(一旦可以占用筷子,就馬上占用)
var mutexleftchopstick,mutexrightchopstick;
beging:
resting;
waiting;
p(mutexleftchopstick);
getresource(leftchopstick);
p(mutexrightchopstick);
getresource(rightchopstick);
eating;
v(mutexleftchopstick);
v(mutexrightchopstick);
end與之前分析的一樣,當兩隻筷子都沒被占用時才去獲取筷子,這樣就打破了死鎖的必要條件,即不發生死鎖;而當有筷子即占用,看似效率很高,但因為資源有限,且不可搶占,很容易發生死鎖。
以下即為該實驗的完整源**:
#define win32_lean_and_mean
#include
#include
#include
#include
#include
#include
#include "dining.h"
hinstance hinstapplication instance handle
hwnd hwndmainmain window handle
hbitmap hbmpoffscreen;
lresult callback wndproc(hwnd, uint, wparam, lparam);
void renderoffscreen(hdc hdestdc);
bool bwaitmultiple;
bool bfastfood;
extern int gdinerstate;
extern int gchopstickstate;
extern handle gchopstick[philosophers]; // 1 chopstick between each philopher and his neighbor
/* routine: wndproc
/* purpose: processes messages
lresult callback wndproc(hwnd hwnd, uint message,
wparam wparam, lparam lparam)
return (0);
}bool createoffscreen()
void renderoffscreen(hdc hdestdc)
{ hdc hdchdestdc; // createcompatibledc(hwndmain);
int err=getlasterror();
hbitmap holdbitmap = selectobject(hdc, hbmpoffscreen);
rect rect;
hpen hpen;
double dx, dy, px, py, angrad, ddeltaang;
int pos, p1;
long centerx, centery;
hpen = selectobject(hdc, createpen(ps_solid, 3, 0l));
getclientrect(hwndmain, &rect);
/* draw the table */
centerx = (rect.right - rect.left)/2;
centery = (rect.bottom -
ellipse(hdc, centerx - 100, centery - 100, centerx + 100, centery + 100);
/* draw the chopsticks */
ddeltaang = 360 / philosophers; //筷子間的角度差
for (pos = 0; pos < philosophers; pos++) //fixit
{draw the chopsticks */
angrad = (pos * ddeltaang)/57.29577951; //轉化為弧度
dx = centerx + (sin(angrad)*60);
dy = centery - (cos(angrad)*60);
movetoex(hdc, (int)dx, (int)dy, null);
作業系統實驗報告
電腦科學與應用系 課程設計報告 作業系統原理 目錄1 題目簡述 2 2 需求分析 2 2.1設計思想 2 2.2要求 2 2.3任務 3 2.4執行環境 3 2.5開發工具 3 3 概要設計與詳細設計 3 3.1系統流程圖 3 3.2演算法流程圖 5 4 編碼與實現 10 4.1資料結構和演算法設計...
作業系統實驗報告
2014 2015 學年第 2 學期 系別計算機學院 專業電腦科學與技術 班級 2014級專公升本 姓名蔡圓圓 學號 1410211014 授課老師趙群禮 實驗一 熟悉linux基本命令及程式設計環境 實驗總結 編寫程式 gedit編輯器 編寫程式 c 存放 gcc linux c程式編譯工具 當前...
作業系統實驗報告
實驗報告 一 實驗名稱 程序排程的設計與實現 二 實驗目的 1 綜合應用下列知識點設計並實現作業系統的程序排程 鄰接表,布林數 組,非阻塞輸入,圖形使用者介面 gui,程序控制塊,程序狀態轉換,多 級反饋佇列程序排程演算法。2 加深理解作業系統程序排程的過程。3 加深理解多級反饋佇列程序排程演算法。...