操作系統(tǒng)課程設(shè)計(jì)利用多線程和信號(hào)量解決哲學(xué)家進(jìn)餐問題java實(shí)現(xiàn)_第1頁
操作系統(tǒng)課程設(shè)計(jì)利用多線程和信號(hào)量解決哲學(xué)家進(jìn)餐問題java實(shí)現(xiàn)_第2頁
操作系統(tǒng)課程設(shè)計(jì)利用多線程和信號(hào)量解決哲學(xué)家進(jìn)餐問題java實(shí)現(xiàn)_第3頁
操作系統(tǒng)課程設(shè)計(jì)利用多線程和信號(hào)量解決哲學(xué)家進(jìn)餐問題java實(shí)現(xiàn)_第4頁
操作系統(tǒng)課程設(shè)計(jì)利用多線程和信號(hào)量解決哲學(xué)家進(jìn)餐問題java實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)課程設(shè)計(jì)操作系統(tǒng)課程設(shè)計(jì)課程設(shè)計(jì)報(bào)告課程設(shè)計(jì)報(bào)告課課題:題:利用信號(hào)量和多線程機(jī)制實(shí)現(xiàn)利用信號(hào)量和多線程機(jī)制實(shí)現(xiàn)“哲學(xué)家進(jìn)餐哲學(xué)家進(jìn)餐”問題問題所在學(xué)院: 信息工程學(xué)院信息工程學(xué)院 班 級(jí): 計(jì)科計(jì)科 12011201 學(xué) 號(hào): 121404112140411414 姓 名: 魏魏 祥祥 指導(dǎo)教師: 徐向英徐向英 2015 年 1 月 1 日目錄目錄一、課程設(shè)計(jì)目標(biāo).3二、課題內(nèi)容.3三、設(shè)計(jì)思路.3四、源代碼.5五、運(yùn)行與測(cè)試.9六、心得體會(huì).10一、課程設(shè)計(jì)目標(biāo)一、課程設(shè)計(jì)目標(biāo)學(xué)習(xí)多線程編程,使用線程的同步機(jī)制實(shí)現(xiàn)“哲學(xué)家進(jìn)餐”問題。具體要求:1.創(chuàng)建 POSIX 線程,實(shí)現(xiàn)多線程

2、的并發(fā)執(zhí)行,驗(yàn)證多線程共享進(jìn)程資源的特性。2.使用互斥量和條件變量,或使用信號(hào)量實(shí)現(xiàn)線程的同步互斥。3. 驗(yàn)證 “ 哲學(xué)家進(jìn)餐”問題中的死鎖情況,并加以解決。二、課題內(nèi)容二、課題內(nèi)容哲學(xué)家進(jìn)餐問題由 Dijkstra 提出,問題描述有五個(gè)哲學(xué)家共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個(gè)碗和五支筷子,他們的生活方式是交替地進(jìn)行思考和進(jìn)餐。平時(shí),一個(gè)哲學(xué)家進(jìn)行思考,饑餓時(shí)便試圖取用其左右最靠近他的筷子,只有在他拿到兩只筷子時(shí)才能進(jìn)餐。進(jìn)餐完畢,放下筷子繼續(xù)思考。本次課題要求使用多線程和信號(hào)量解決哲學(xué)家進(jìn)餐問題。并演示產(chǎn)生死鎖的情況。三、設(shè)計(jì)思路三、設(shè)計(jì)思路經(jīng)分析可知,放在桌子上的筷子是

3、臨界資源,在一段時(shí)間內(nèi)只允許以為哲學(xué)家使用。為了實(shí)現(xiàn)對(duì)筷子的互斥,可以用一個(gè)信號(hào)量表示一只筷子,由著五個(gè)信號(hào)量構(gòu)成信號(hào)量數(shù)組。當(dāng)哲學(xué)家饑餓時(shí)總是先去拿左筷子,成功后在拿右筷子。當(dāng)五位哲學(xué)家同時(shí)拿起左筷子,這是每位哲學(xué)家都沒有右筷子可以拿,就會(huì)造成死鎖。思路思路 1:利用記錄型信號(hào)量:利用記錄型信號(hào)量 設(shè)置值為 4 的記錄型信號(hào)量,至多只允許四位哲學(xué)家同時(shí)去拿左筷子(leftStick.getSema().acquire(),只有拿到左筷子,才能繼續(xù)拿右筷子(rightStick.getSema().acquire()。拿到兩雙筷子之后便可以用餐,用餐完畢,先放下左筷子(leftStick.ge

4、tSema().release(),再放下右筷子(rightStick.getSema().release()。這樣便可以避免思索問題。思路思路 2:利用:利用 AND 型信號(hào)量型信號(hào)量 要求每個(gè)哲學(xué)家必須獲取兩個(gè)筷子的時(shí)候才能夠進(jìn)餐,只得到一只筷子不能進(jìn)餐時(shí),要求釋放那一只筷子。可以使用 AND 型信號(hào)量將左筷子和右筷子信號(hào)量的獲取組成一個(gè)原子操作。如此也可以避免死鎖問題。本次課程設(shè)計(jì)是在 windows 系統(tǒng)下完成,編程語言為 java,開發(fā)環(huán)境:Eclipse。由于在 java 語言中使用記錄型信號(hào)量更為方便,所以本次課題我使用的是思路一。static Semaphore room =

5、new Semaphore(4); 設(shè)置值為 4 的記錄型信號(hào)量,至多只允許四個(gè)哲學(xué)家同時(shí)拿起左筷子。private Semaphore semaphore = new Semaphore(1);在筷子類中為筷子設(shè)置值為 1 信號(hào)量。room.acquire(); /獲取值為4的信號(hào)量leftStick.getSema().acquire(); /獲取左筷子信號(hào)量Thread.sleep(1000 * 1); /拿到左筷子之后等待2秒,觀察死鎖rightStick.getSema().acquire(); /獲取右筷子信號(hào)量eat();Thread.sleep(1000 * 2); /用完餐后

6、等待2秒,繼續(xù)思考finishEat();leftStick.getSema().release(); /釋放左筷子信號(hào)量rightStick.getSema().release(); /釋放右筷子信號(hào)量room.release(); /釋放值為4的信號(hào)量當(dāng)需要演示死鎖的情況是,只需要將 room.acquire();和 room.release();這兩行注釋掉,取消至多只允許四位哲學(xué)家一起拿起左筷子的限制,就會(huì)產(chǎn)生死鎖。ChopStick chopStick = new ChopStick5;for(int i = 0; i 5; i +)chopSticki = new ChopStic

7、k(i);New 出編號(hào) 0 到 4 的五支筷子。Philosopher ph0 = new Philosopher(0, chopStick0, chopStick1);Philosopher ph1 = new Philosopher(1, chopStick1, chopStick2);Philosopher ph2 = new Philosopher(2, chopStick2, chopStick3);Philosopher ph3 = new Philosopher(3, chopStick3, chopStick4);Philosopher ph4 = new Philosoph

8、er(4, chopStick4, chopStick0);New 出編號(hào) 0 到 4 的五位哲學(xué)家,他們分別對(duì)應(yīng)著自己的左、右兩支筷子。ExecutorService excutor = Executors.newFixedThreadPool(5);5 位哲學(xué)家用餐,所以需要 5 個(gè)線程同時(shí)執(zhí)行,創(chuàng)建容量為 5 的線程池。四、源代碼四、源代碼/在 Windows 下運(yùn)行,筷子類筷子類(ChopStick.java)import java.util.concurrent.Semaphore;public class ChopStick private int ID;private boole

9、an available;private Semaphore semaphore = new Semaphore(1);public ChopStick(int ID)this.ID = ID;this.available = true;this.semaphore = new Semaphore(1);public void setAvai(boolean available)this.available = available;public boolean getAvai()return this.available;public Semaphore getSema()return thi

10、s.semaphore;public void setSema(Semaphore sema)this.semaphore = sema; public int getId()return this.ID;哲學(xué)家類哲學(xué)家類(Philosopher.java)import java.util.concurrent.Semaphore;public class Philosopher implements Runnableprivate int ID;static Semaphore room = new Semaphore(4);private ChopStick leftStick;priva

11、te ChopStick rightStick;public Philosopher(int ID, ChopStick cs1, ChopStick cs2)this.ID = ID;this.leftStick = cs1;this.rightStick = cs2;public void getLeftChopStick()this.leftStick.setAvai(false);public int getId()return ID;public void eat()leftStick.setAvai(false);rightStick.setAvai(false);System.o

12、ut.println(哲學(xué)家+ this.getId() + 正在用餐。 。 。);public void think()System.out.println(哲學(xué)家 + this.getId() + 正在思考。 。 。);public void finishEat()System.out.println(哲學(xué)家 + this.getId() + 用餐結(jié)束,正在思考。 。 。);leftStick.setAvai(true);rightStick.setAvai(true);public void readyToEat()System.out.println(哲學(xué)家 + this.getId(

13、) + 餓了準(zhǔn)備用餐。 。 。);public void cannotEat()System.out.println(哲學(xué)家 + this.getId() + 缺少筷子,不能用餐,等待。 。);public void run() tryroom.acquire();this.readyToEat();if(this.leftStick.getSema().availablePermits() = 0 | this.leftStick.getSema().availablePermits() = 0)this.cannotEat();this.leftStick.getSema().acquir

14、e(); Thread.sleep(1000 * 1); this.rightStick.getSema().acquire(); this.eat();Thread.sleep(1000 * 2);this.finishEat();this.leftStick.getSema().release(); this.rightStick.getSema().release(); room.release();catch(InterruptedException ex)ex.toString(); 測(cè)試測(cè)試(Test.java)import java.util.concurrent.*;impor

15、t java.util.Scanner;public class Test public static void main(String args)Scanner input = new Scanner(System.in);menu();int choice = input.nextInt();while(choice != 1)if(choice = 0)ChopStick chopStick = new ChopStick5;for(int i = 0; i 5; i +)chopSticki = new ChopStick(i); ExecutorService excutor = E

16、xecutors.newFixedThreadPool(5);Philosopher ph0 = new Philosopher(0, chopStick0, chopStick1);excutor.execute(new Philosopher(0, chopStick0, chopStick1);excutor.execute(new Philosopher(1, chopStick1, chopStick2);excutor.execute(new Philosopher(2, chopStick2, chopStick3);excutor.execute(new Philosopher

17、(3, chopStick3, chopStick4);excutor.execute(new Philosopher(4, chopStick4, chopStick0);excutor.shutdown();choice = input.nextInt();menu();public static void menu()System.out.println(0: 演示);System.out.println(1: 結(jié)束);五、運(yùn)行與測(cè)試五、運(yùn)行與測(cè)試1. 運(yùn)行界面運(yùn)行界面2. 死鎖演示死鎖演示3. 無死鎖演示無死鎖演示六、心得體會(huì)六、心得體會(huì) 本次課程設(shè)計(jì)我總得來說花的時(shí)間不是太多,代碼加起來一共不超過兩百行。我只用了一種思路來完成。思路一完成之后,我也嘗試著用思路二完成,但是 AND 型信號(hào)量的問題很難解決,最后便放棄了。拿到課題之前我對(duì)哲學(xué)家進(jìn)餐問題了解的還不是很透徹,我利用網(wǎng)絡(luò)和查詢課本徹底搞懂了哲學(xué)家進(jìn)餐問題。并且得到兩種解決思路。通過此次的課程設(shè)計(jì),我想我對(duì)多線程的編程理解更深了一點(diǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論