作業系統實驗報告

2021-05-30 04:54:20 字數 3728 閱讀 6995

實驗名稱:哲學家就餐問題

班級:通訊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 加深理解多級反饋佇列程序排程演算法。...