哲學家就餐問題 100
1樓:朱曾巫馬雅霜
兩個地方應該是pv操作,pv都是操作元語,不可中斷p操作是將訊號量-1
v操作是將訊號量+1
pv一定要配對使用。
哲學家進餐可以通過訊號量機制解決,避免死鎖註釋如下:
voidtest(int
i)//測試哲學家i是否滿足eating條件//通過p操作後進入eating,否則在p(s[i])處阻塞}state[i]=thinking;
初始化狀態位。
s[i]=0;
初始化s[i]
訊號量void
philosopher(int
i)p(mutex);
對mutex加鎖,防止多個程序同時對state[i]操作state[i]=thinking;
設定i狀態。
test([i-1]%5);
為左邊和右邊測試並設定s狀態。
test([i+1]%5);
v(mutex);
釋放訊號量}
2樓:
五位哲學家坐在一張圓桌,桌子**的一個前空盤通心粉每人,每兩個男人之間放一根筷子行為的每一個哲學家的想法,感覺餓了,然後吃通心粉吃麵食,每個哲學家必須兩根筷子,而且每個人只能直接從左邊或右邊,拿起筷子。
定義n 5無效哲學家(int i)的 }
為了防止死鎖發生時所採取的措施:
最多允許4個哲學家圍坐在桌子同時,只有當左,右兩側的哲學家筷子是可以的,只是為了讓他的筷子,(?所有的哲學家數,奇數號的哲學家必須首先走左邊的筷子,偶數哲學家,反之亦然,為了避免死鎖, ,哲學家分為三種狀態,思考,飢餓,吃飯,和時間拿到兩筷子,或不採取。
在哲學家就餐問題的解決方案( 1)
定義n 5無效哲學家(我) }
哲學家就餐問題的解決方案(2)
定義n 5定義的思考0
定義hungry 1
定義吃2 br />的typedef int訊號;
int狀態[n];
訊號量互斥= 1;
訊號[n];
無效測試(int i)
無效哲學家(我) }
狀態[ =思維。i] =0
事實上,我不明白。
3樓:臸鏡
因為是一張圓的桌子,桌子坐五個人,每個人的右手邊有一支筷子(桌子上共5只),2號坐在1號的左邊,那麼1號拿左手邊的筷子和2號拿右手邊的筷子便是取同一支筷子,3,4號同理。
點反對的人是非要我補這張圖麼?看清楚題主問的什麼好伐?有要**麼?一天就知道上網找**抄不會自己寫的也是人才。
哲學家就餐問題
4樓:匿名使用者
1全部規定在拿到左側的筷子後,先檢查右面的筷子是否可用。如果不可用,則先放下左側筷子, 等一段時間再重複整個過程。 分析:
當出現以下情形,在某一個瞬間,所有的哲學家都同時啟動這個演算法,拿起左側的筷 子,而看到右側筷子不可用,又都放下左側筷子,等一會兒,又同時拿起左側筷子……如此 這樣永遠重複下去。對於這種情況,所有的程式都在執行,但卻無法取得進展,即出現飢餓, 所有的哲學家都吃不上飯。 (2) 描述一種沒有人餓死(永遠拿不到筷子)演算法。
考慮了四種實現的方式(a、b、c、d): a.原理:至多隻允許四個哲學家同時進餐,以保證至少有一個哲學家能夠進餐,最終總會釋 放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。
以下將room 作為訊號量,只允 許4 個哲學家同時進入餐廳就餐,這樣就能保證至少有一個哲學家可以就餐,而申請進入 餐廳的哲學家進入room 的等待佇列,根據fifo 的原則,總會進入到餐廳就餐,因此不會 出現餓死和死鎖的現象。 偽碼: semaphore chopstick[5]=;semaphore room=4; void philosopher(int i) }b.原理:
僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。 方法1:利用and 型訊號量機制實現:
根據課程講述,在一個原語中,將一段**同時需 要的多個臨界資源,要麼全部分配給它,要麼一個都不分配,因此不會出現死鎖的情形。當 某些資源不夠時阻塞呼叫程序;由於等待佇列的存在,使得對資源的請求滿足fifo 的要求, 因此不會出現飢餓的情形。 偽碼:
semaphore chopstick[5]=;void philosopher(int i) }方法2:利用訊號量的保護機制實現。通過訊號量mutex對eat()之前的取左側和右側筷 子的操作進行保護,使之成為一個原子操作,這樣可以防止死鎖的出現。
偽碼: semaphore mutex = 1 ; semaphore chopstick[5]=;void philosopher(int i) }
哲學家就餐問題的問題描述
5樓:焦天佑
3全部哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一:吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。
餐桌中間有一大碗義大利麵,每兩個哲學家之間有一隻餐叉。因為用一隻餐叉很難吃到義大利麵,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。
哲學家就餐問題有時也用米飯和筷子而不是義大利麵和餐叉來描述,因為很明顯,吃米飯必須用兩根筷子。
哲學家從來不交談,這就很危險,可能產生死鎖,每個哲學家都拿著左手的餐叉,永遠都在等右邊的餐叉(或者相反)。即使沒有死鎖,也有可能發生資源耗盡。例如,假設規定當哲學家等待另一隻餐叉超過五分鐘後就放下自己手裡的那一隻餐叉,並且再等五分鐘後進行下一次嘗試。
這個策略消除了死鎖(系統總會進入到下一個狀態),但仍然有可能發生「活鎖」。如果五位哲學家在完全相同的時刻進入餐廳,並同時拿起左邊的餐叉,那麼這些哲學家就會等待五分鐘,同時放下手中的餐叉,再等五分鐘,又同時拿起這些餐叉。
在實際的計算機問題中,缺乏餐叉可以類比為缺乏共享資源。一種常用的計算機技術是資源加鎖,用來保證在某個時刻,資源只能被一個程式或一段**訪問。當一個程式想要使用的資源已經被另一個程式鎖定,它就等待資源解鎖。
當多個程式涉及到加鎖的資源時,在某些情況下就有可能發生死鎖。例如,某個程式需要訪問兩個檔案,當兩個這樣的程式各鎖了一個檔案,那它們都在等待對方解鎖另一個檔案,而這永遠不會發生。
哲學家進餐問題的問題描述
6樓:村裡那點事ta儔
n哲學家進餐問題描述有五個哲學家,他們的生活方式是交替地進行思考和進餐,n哲學家們共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五支筷子,n平時哲學家進行思考,飢餓時便試圖取其左、右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐,n進餐完畢,放下筷子又繼續思考。
約束條件。1)只有拿到兩隻筷子時,哲學家才能吃飯。
2)如果筷子已被別人拿走,則必須等別人吃完之後才能拿到筷子。
3)任一哲學家在自己未拿到兩隻筷子吃飯前,不會放下手中拿到的筷子。
訊號量機制。
筷子是臨界資源,一段時間只允許一位哲學家使用。為了表示互斥,用一個訊號量表示一隻筷子,五個訊號量構成訊號量陣列。本文中演算法用類c語言描述偽碼演算法。
演算法描述如下:n用五支筷子的訊號量構成訊號量陣列:
semaphore chopstick[5]=;
p(stick[i]);
p(stick[(i+1) %5]);
進餐;v(stick[i]);v(stick[(i+1) %5]);
思考;當哲學家飢餓時,總是先去拿他左邊的筷子,執行wait(chopstick[i]),成功後,再去拿他右邊的筷子,執行wait(chopstick[i+1]%5);成功後便可進餐。進餐畢,先放下他左邊的筷子,然後再放下右邊的筷子。當五個哲學家同時去取他左邊的筷子,每人拿到一隻筷子且不釋放,即五個哲學家只得無限等待下去,引起死鎖。
哲學家就餐問題,答案求通俗易懂
7樓:網友
一個簡單的解法是引入一個餐廳服務生,哲學家必須經過他的允許才能拿起餐叉。因為服務生知道哪隻餐叉正在使用,所以他能夠作出判斷避免死鎖。
為了演示這種解法,假設哲學家依次標號為a至e。如果a和c在吃東西,則有四隻餐叉在使用中。b坐在a和c之間,所以兩隻餐叉都無法使用,而d和e之間有一隻空餘的餐叉。
假設這時d想要吃東西。如果他拿起了第五隻餐叉,就有可能發生死鎖。相反,如果他徵求服務生同意,服務生會讓他等待。
這樣,我們就能保證下次當兩把餐叉空餘出來時,一定有一位哲學家可以成功的得到一對餐叉,從而避免了死鎖。
解決哲學家用餐問題有多少種方法
8樓:匿名使用者
哲學家就餐問題。
2023年,dijkstra提出並解決了一個他稱之為哲學家就餐的同步問題。從那時起,每個發明新的同步原語的人都希望通過解決哲學家就餐問題來 展示其同步原語的精妙之處。這個問題可以簡單地描述如下:
五個哲學家圍坐在一張圓桌周圍,每個哲學家面前都有一盤通心粉。由於通心粉很滑,所以需要兩把叉 子才能夾住。相鄰兩個盤子之間放有一把叉子,餐桌如圖2-44所示。
哲學家的生活中有兩種交替活動時段:即吃飯和思考(這只是一種抽象,即對哲學家而言其他活動都無關緊要)。當一個哲學家覺得餓了時,他就試圖分兩次 去取其左邊和右邊的叉子,每次拿一把,但不分次序。
如果成功地得到了兩把叉子,就開始吃飯,吃完後放下叉子繼續思考。關鍵問題是:能為每一個哲學家寫一段 描述其行為的程式,且決不會死鎖嗎?
要求拿兩把叉子是人為規定的,我們也可以將義大利麵條換成中國菜,用米飯代替通心粉,用筷子代替叉子。)
圖2-45給出了一種直觀的解法。過程take_fork將一直等到所指定的叉子可用,然後將其取用。不過,這種顯然的解法是錯誤的。
如果五位哲學家同時拿起左面的叉子,就沒有人能夠拿到他們右面的叉子,於是發生死鎖。
我們可以將這個程式修改一下,這樣在拿到左叉後,程式要檢視右面的叉子是否可用。如果不可用,則該哲學家先放下左叉,等一段時間,再重複整個過程。 但這種解法也是錯誤的,儘管與前一種原因不同。
可能在某一個瞬間,所有的哲學家都同時開始這個演算法,拿起其左叉,看到右叉不可用,又都放下左叉,等一會 兒,又同時拿起左叉,如此這樣永遠重複下去。對於這種情況,所有的程式都在不停地執行,但都無法取得進展,就稱為飢餓(starvation)。(即使問 題不發生在義大利餐館或中國餐館,也被稱為飢餓。)
哲學家受社會尊敬嗎,每個人都是哲學家這句話對嗎
華人近百年來並沒有說清楚過什麼是哲學,因而也不知道什麼是 哲學家 所謂的哲學,在人類中從來就沒有建立完備過的實在證據,這一點可以由人類的生存矛盾還沒有找到可行高效的解決辦法並達成共識為證據。只要人類還沒有找到解除軍備競賽的可行高效辦法,對於矇昧於這個可行高效的辦法的人們的知識範圍來講,就證明所謂的哲...
世界最著名哲學家,世界最著名的哲學家有哪些?
著名的西方哲學家有 西方古代 蘇格拉底 柏拉圖 亞里斯多德 西方中世紀 奧古斯汀 阿奎那。西方近現代 英國 培根 霍布斯 洛克 貝克萊 休謨 斯賓塞 羅素 維特根斯坦 法國 笛卡爾 萊布尼茲 帕斯卡 斯賓洛莎 伏爾泰 狄德羅 盧梭 孔德 帕格森 薩特 福柯 德國 康德 費希特 黑格爾 費爾巴哈 馬克...
為什麼大部分哲學家都是男人,為什麼哲學家幾乎都是男的呢
不是幾乎沒有女 bai性,而是根本沒有女du性.二十世紀情zhi況有所變化,那是dao因為真正的哲學家都已版 經死光了 男人擅權長理性思維,沒錯.但你能說全世界那麼多的女性中就沒有一些理性思維很強的嗎?我覺得思維能力是一方面,但更重要的還是跟她們的本性有關 女人感性,男人理性。為什麼哲學家幾乎都是男...