操作系統(tǒng)課程設計---銀行家算法報告_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  操作系統(tǒng)課程設計報告</p><p>  院(系): 計算機工程學院 </p><p>  專業(yè): 計算機科學與技術專業(yè) </p><p>  學生姓名: __ </p><p>  班級:__計算073

2、 _學號: </p><p>  題目: 仿真模擬銀行家算法對死鎖的避免 </p><p>  起迄日期: __2010-7-6至2010-7-16_ </p><p>  設計地點: 2號實驗樓402   </p><p>  指 導 教 師:

3、 </p><p>  2009—2010年度 第 2 學期</p><p>  完成日期: 2010 年 7 月 16 日</p><p><b>  課程設計目的</b></p><p>  《操作系統(tǒng)》是一門重要的專業(yè)基礎課,是涉及較多硬件知識的計算機系統(tǒng)軟件課

4、程。在計算機軟硬件課程的設置上,它起著承上啟下的作用。操作系統(tǒng)對計算機系統(tǒng)資源實施管理,是所有其他軟件與計算機硬件的唯一接口,所有用戶在使用計算機時都要得到操作系統(tǒng)提供的服務。</p><p>  操作系統(tǒng)課程設計的主要任務是研究計算機操作系統(tǒng)的基本原理和算法,掌握操作系統(tǒng)的進程管理、存儲管理、文件管理和設備管理的基本原理與主要算法。目的是使學生掌握常用操作系統(tǒng)(如DOS、Windows或Linux)的一般管理方

5、法,了解它是如何組織和運作的,對操作系統(tǒng)的核心概念和算法有一個透徹的理解,并對系統(tǒng)運行的機制有一個全面的掌握,從而充分理解系統(tǒng)調(diào)用與程序設計之間的關系。</p><p><b>  課程設計內(nèi)容</b></p><p>  仿真模擬銀行家算法對死鎖的避免。對于進程死鎖的避免問題,分為兩種狀態(tài):安全狀態(tài)和非安全狀態(tài)。在避免死鎖的方法中,允許進程動態(tài)地申請資源分配之前,應

6、先計算此次資源分配的安全性。若此次分配不會導致系統(tǒng)進入不安全狀態(tài),則將資源分配給進程;否則,令進程等待。</p><p>  所謂安全狀態(tài)是指系統(tǒng)能按某種進程順序,來為每個進程pi分配所需的資源,直至滿足每個進程對資源的最大需求,使每個進程都可順利地完成。如果系統(tǒng)無法找到這樣一個序列,則系統(tǒng)處于不安全狀態(tài)。只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進入死鎖狀態(tài)。因此避免死鎖的實質(zhì)在于:系統(tǒng)在進行資源分配時,如何使系統(tǒng)不進

7、入不安全狀態(tài)。銀行家算法就是一種最有代表性的避免死鎖的算法。</p><p><b>  系統(tǒng)分析與設計</b></p><p><b>  1、系統(tǒng)分析</b></p><p>  系統(tǒng)分析的主要任務是將在系統(tǒng)詳細調(diào)查中所得到的文檔資料集中到一起,對組織內(nèi)部整體管理狀況和信息處理過程進行分析。目的是將用戶的需求及其解決方

8、法確定下來,這些需要確定的結果包括:開發(fā)者關于現(xiàn)有組織管理狀況的了解;用戶對信息系統(tǒng)功能的需求;數(shù)據(jù)和業(yè)務流程;管理功能和管理數(shù)據(jù)指標體系;新系統(tǒng)擬改動和新增的管理模型等等。系統(tǒng)分析所確定的內(nèi)容是今后系統(tǒng)設計、系統(tǒng)實現(xiàn)的基礎。</p><p>  根據(jù)銀行家算法,設計這個銀行家算法的模擬系統(tǒng)。算法中涉及到進程的個數(shù),資源的種類。進程當前占有的資源保存在數(shù)組allocation中,需要的資源數(shù)目need數(shù)組中。用戶

9、添加進程數(shù)目,并且設置每個進程對于每一類資源的占有情況和需要情況,還可以設置每一類資源的庫存容量。根據(jù)算法,找出安全序列,如果不存在安全序列的話,會顯示安全序列不存在。</p><p><b>  2、系統(tǒng)設計</b></p><p>  程序是利用java語言編寫的,直接調(diào)用java中的GUI接口進行界面的設計。設計出兩個窗口,一個主窗口,一個執(zhí)行算法并且將結果顯示

10、的對話框。涉及到java中的JFrame 、JPanel、JDialog主要是這三個。其中面板類用到了最多的。下面將這兩個窗口的任務敘述如下:</p><p>  1、對于主窗口,包括添加進程的功能、設置每個進程的Allocation的數(shù)目、設置Available的數(shù)值??梢栽O置每個進程的Request的情況。</p><p> ?。?)添加進程的功能。利用了一個JtextField 輸入

11、進程的名字。利用JcomboBox選擇各個給進程所需要的資源的最大數(shù)目。利用按鈕添加監(jiān)聽器實現(xiàn)添加功能。如果進程名字沒有添加的話,默認是:進程+序號。</p><p> ?。?)設置Allocation。與上面的基本相同。利用了一個JtextField 輸入進程的名字。利用JcomboBox選擇各個給進程所占有的各類資源的數(shù)目。利用按鈕添加監(jiān)聽器實現(xiàn)添加功能。如果沒有見輸入進程的名字,功能不能執(zhí)行。根據(jù)算法,所占

12、有的各類的資源的數(shù)目不能超過給進程所需要的各類資源的最大數(shù)目。否則不會執(zhí)行。</p><p> ?。?)設置Request。功能執(zhí)行的時候,用JtextField 輸入進程的名字。利用JcomboBox選擇各個給進程所申請的各類資源的數(shù)目。利用按鈕添加監(jiān)聽器實現(xiàn)添加功能。如果沒有見輸入進程的名字,功能不能執(zhí)行。根據(jù)算法,所申請的各類的資源的數(shù)目不能超過給進程所需要的數(shù)目,即不能超過Need中的數(shù)目。如果滿足的話,

13、還必須檢查是否超過了Available中的數(shù)目。只有這兩個條件同時滿足了,才能夠繼續(xù)執(zhí)行。</p><p>  2、對于另一個窗口,主要是通過內(nèi)部類來實現(xiàn)的。這個窗口相當于主窗口中的一個變量。這個窗口實現(xiàn)了算法和顯示結果。</p><p> ?。?)顯示Request后的各個變量的結果。利用Jlist控件將結果顯示。因為使用的是內(nèi)部類,所以可以自由調(diào)用外部的變量。</p>&

14、lt;p>  (2)顯示執(zhí)行算法后的結果。同樣也是利用Jlist控件將結果顯示。執(zhí)行算法的時候,先將數(shù)據(jù)的字符串形式轉化為數(shù)字形式。然后根據(jù)銀行家算法執(zhí)行,查找到安全序列。將結果顯示。</p><p>  3、設計的過程,填入了兩個實例。一個是正確的存在安全序列的實例。一個是不存在安全序列的實例。</p><p><b>  3、模塊設計:</b></p&

15、gt;<p>  程序的設計主要有兩個模塊,分別是設置數(shù)值和檢查安全性序列模塊。對于設置數(shù)值模塊,主要有添加進程、清空進程、進程申請資源(即,Request資源)。對于檢查安全性序列就是執(zhí)行銀行家算法。</p><p>  程序運行的時候,先是設置數(shù)據(jù),通過點擊添加進程、設置Allocation和Request的值來設置數(shù)據(jù)。在點擊“執(zhí)行算法”,彈出對話框顯示申請資源后的結果。在點擊對話框中的執(zhí)行算

16、法按鈕進行查找安全序列。</p><p>  其中涉及的數(shù)據(jù)結構和模塊調(diào)用圖如下:</p><p>  1、對于設置數(shù)值模塊(包括添加進程、清空進程、申請資源)用到的數(shù)據(jù)結構是一個類:</p><p>  public class MyJlist extends JFrame implements ActionListener</p><p>

17、;<b>  {</b></p><p>  private JTextField current_text=new JTextField();//添加到標簽("當前進程資源非配情況:")之后,添加到容器panel1的中間</p><p>  private JList threadName_list;//顯示添加的進程名字</p>

18、<p>  private JList max_resource1_list;//顯示各個進程所用到的資源1的最大數(shù)量</p><p>  private String[] max_resource1_list_num=new String[10];//存儲各個進程所用到的資源1的最大數(shù)量</p><p>  private JList max_resource2_list;//

19、顯示各個進程所用到的資源2的最大數(shù)量</p><p>  private String[] max_resource2_list_num=new String[10];//存儲各個進程所用到的資源2的最大數(shù)量</p><p>  private JList max_resource3_list;//顯示各個進程所用到的資源3的最大數(shù)量</p><p>  priva

20、te String[] max_resource3_list_num=new String[10];//存儲各個進程所用到的資源3的最大數(shù)量</p><p>  private JList allocation_resource1_list;</p><p>  //顯示各個進程所占有的資源1的數(shù)量</p><p>  private String[] alloca

21、tion_resource1_list_num=new String[10];</p><p>  //存儲各個進程所占有的資源1的數(shù)量</p><p>  private JList allocation_resource2_list;</p><p>  //顯示各個進程所占有的資源2的數(shù)量</p><p>  private Strin

22、g[] allocation_resource2_list_num=new String[10];</p><p>  //存儲各個進程所占有的資源2的數(shù)量</p><p>  private JList allocation_resource3_list;</p><p>  //顯示各個進程所占有的資源3的數(shù)量</p><p>  pri

23、vate String[] allocation_resource3_list_num=new String[10];</p><p>  //存儲各個進程所占有的資源3的數(shù)量</p><p>  private JList need_resource1_list;</p><p>  //顯示各個進程所需要的資源1的數(shù)量</p><p> 

24、 private String[] need_resource1_list_num=new String[10];</p><p>  //存儲各個進程所需要的資源1的數(shù)量</p><p>  private JList need_resource2_list;</p><p>  //顯示各個進程所需要的資源2的數(shù)量</p><p>  p

25、rivate String[] need_resource2_list_num=new String[10];</p><p>  //存儲各個進程所需要的資源2的數(shù)量</p><p>  private JList need_resource3_list;</p><p>  //顯示各個進程所需要的資源3的數(shù)量</p><p>  pri

26、vate String[] need_resource3_list_num=new String[10];</p><p>  //存儲各個進程所需要的資源3的數(shù)量</p><p>  private JList available_resource1_list;</p><p>  //顯示資源1的庫存數(shù)量</p><p>  privat

27、e String[] available_resource1_list_num=new String[]{"10"};</p><p>  //存儲資源1的庫存數(shù)量</p><p>  private JList available_resource2_list;</p><p>  //顯示資源2的庫存數(shù)量</p><p&g

28、t;  private String[] available_resource2_list_num=new String[]{"5"};</p><p>  //存儲資源2的庫存數(shù)量</p><p>  private JList available_resource3_list;</p><p>  //顯示資源3的庫存數(shù)量</p>

29、<p>  private String[] available_resource3_list_num=new String[]{"7"};</p><p>  //存儲資源3的庫存數(shù)量</p><p>  private JTextField add_ThreadName;</p><p>  //添加的進程的名字</p&g

30、t;<p>  private String[] name_num_add_ThreadName=new String[10];</p><p>  //存儲所要添加的進程的名字</p><p><b>  }</b></p><p>  2、對于執(zhí)行銀行家算法的所用到的數(shù)據(jù)結構是一個內(nèi)部類:</p><p&g

31、t;  class ComputeDialog extends JDialog implements ActionListener</p><p><b>  {</b></p><p>  //銀行家算法所用的變量</p><p>  private int[][] work=new int[10][3];</p><p&

32、gt;  private int[][] need=new int[10][3];</p><p>  private int[][] allocation=new int[10][3];</p><p>  //以下是顯示申請資源后進程和資源中類的情況</p><p>  private JList threadName0_list;</p><

33、;p>  private JList max0_resource1_list;</p><p>  private JList max0_resource2_list;</p><p>  private JList max0_resource3_list;</p><p>  private JList need0_resource1_list;</p

34、><p>  private JList need0_resource2_list;</p><p>  private JList need0_resource3_list;</p><p>  private JList allocation0_resource1_list;</p><p>  private JList allocatio

35、n0_resource2_list;</p><p>  private JList allocation0_resource3_list;</p><p>  private JList available0_resource1_list;</p><p>  private JList available0_resource2_list;</p>

36、<p>  private JList available0_resource3_list;</p><p>  //以下顯示利用銀行家算法執(zhí)行后的各個進程和資源的結果</p><p>  private JList threadName1_list;</p><p>  private JList max1_resource1_list;</p&g

37、t;<p>  private String[] max1_resource1_list_num=new String[num_add_ThreadName];</p><p>  private JList max1_resource2_list;</p><p>  private String[] max1_resource2_list_num=new String[n

38、um_add_ThreadName];</p><p>  private JList max1_resource3_list;</p><p>  private String[] max1_resource3_list_num=new String[num_add_ThreadName];</p><p>  private JList need1_resour

39、ce1_list;</p><p>  private String[] need1_resource1_list_num=new String[num_add_ThreadName];</p><p>  private JList need1_resource2_list;</p><p>  private String[] need1_resource2_l

40、ist_num=new String[num_add_ThreadName];</p><p>  private JList need1_resource3_list;</p><p>  private String[] need1_resource3_list_num=new String[num_add_ThreadName];</p><p>  priv

41、ate JList allocation1_resource1_list;</p><p>  private String[] allocation1_resource1_list_num=new String[num_add_ThreadName];</p><p>  private JList allocation1_resource2_list;</p><p

42、>  private String[] allocation1_resource2_list_num=new String[num_add_ThreadName];</p><p>  private JList allocation1_resource3_list;</p><p>  private String[] allocation1_resource3_list_num=

43、new String[num_add_ThreadName];</p><p>  private JList available1_resource1_list;</p><p>  private String[] available1_resource1_list_num=new String[num_add_ThreadName];</p><p>  pr

44、ivate JList available1_resource2_list;</p><p>  private String[] available1_resource2_list_num=new String[num_add_ThreadName];</p><p>  private JList available1_resource3_list;</p><p&

45、gt;  private String[] available1_resource3_list_num=new String[num_add_ThreadName];</p><p>  private JList finish_list;</p><p>  private String[] finish=new String[num_add_ThreadName];</p>

46、<p>  private JTextField safe_arry;//顯示安全序列</p><p><b>  }</b></p><p>  3、整個程序主要就是兩部分,在主窗口部分由添加進程、清空進程、進程實例、申請資源、設置進程當前資源的占有情況、設置資源的庫存情況、執(zhí)行算法。</p><p><b>  4、

47、數(shù)據(jù)結構說明:</b></p><p>  程序分為兩個模塊,其中第一個模塊涉及到添加進程、清空進程、設置Allocation、申請資源等等。第二個模塊涉及到將申請資源的結果顯示、執(zhí)行銀行家算法。</p><p>  對于這兩個模塊的實現(xiàn)主要通過兩個類來實現(xiàn)的。</p><p> ?。?)第一個模塊是類public class MyJlist來實現(xiàn)的,因

48、為用的編程語言是JAVA,所以程序?qū)τ诟鞣N功能是顯示是通過給按鈕添加事件監(jiān)聽器來實現(xiàn)的,即add_button.addActionListener(this);//用來實現(xiàn)添加進程</p><p>  allocation_button.addActionListener(this);</p><p>  //用來設置對應進程的當前各類資源的占有情況</p><p>

49、;  request_button.addActionListener(this);//用來實現(xiàn)進程對資源的申請</p><p>  available_button.addActionListener(this);//用來設置當前各類資源的當前的數(shù)</p><p>  clear_button.addActionListener(this);//清空各個進程的記錄</p>

50、<p>  example1_button.addActionListener(this);//實例1</p><p>  example2_button.addActionListener(this);//實例2</p><p>  check_safe_arry.addActionListener(this);//執(zhí)行算法,彈出對話框</p><p>

51、  (2)第二個模塊的實現(xiàn)通過一個內(nèi)部類:class ComputeDialog extends JDialog implements ActionListener,與第一模塊類似,該模塊的功能的實現(xiàn)也是通過按鈕添加事件監(jiān)聽器來實現(xiàn)的。</p><p>  check_safe_button.addActionListener(this);//實現(xiàn)銀行算法,查找到安全序列。查//不到的時候,顯示安全序列不存在。&

52、lt;/p><p>  safe_arry.setText("安全序列不存在!");//安全序列不存在的時候,設置為此文本</p><p>  對于模塊在程序中的作用,第一個模塊是主體,第二個模塊是在第一個模塊的基礎上實現(xiàn)的。</p><p><b>  5、算法流程圖:</b></p><p>  1、

53、第一個模塊中涉及添加、清空、設置Allocation、設置Available。</p><p> ?。?)主程序初始化。</p><p><b>  (2)添加功能</b></p><p><b> ?。?)清空功能</b></p><p>  (4)設置Allocation</p>

54、<p>  (5)設置Available。</p><p> ?。?)設置Request</p><p>  2、第二模塊主要是實現(xiàn)銀行家算法:</p><p>  loop控制循環(huán)次數(shù),超過指定次數(shù),說明沒有安全序列</p><p>  四、模塊調(diào)試與系統(tǒng)測試</p><p><b>  1、模塊

55、調(diào)試</b></p><p>  輸入的形式和輸入值的范圍</p><p>  程序的輸入過程主要在主窗體中,對于進程名,可以使用任意字符,但是對于進程的名字不能重復。如果沒有填寫進程的名字,程序默認這個進程的名字是:進程+當前的進程數(shù)目。所添加的進程數(shù)目不能超過10個進程。對于進程共享的資源,一共有三類,但是每一類的資源總數(shù)不能超過10個。資源的最大剩余量是10。</p

56、><p><b>  輸出的形式</b></p><p>  數(shù)據(jù)的顯示在主窗口中和子窗口中都可以顯示。將所有數(shù)據(jù)填寫好后,單擊按鈕,會在主窗口中顯示出所顯示的數(shù)據(jù)。點擊“執(zhí)行算法”按鈕就會彈出一個對話框,顯示數(shù)據(jù)。對話框中點擊按鈕“檢查安全性”,執(zhí)行銀行家算法,將結果顯示在對話框中。</p><p><b>  程序所能達到的功能<

57、;/b></p><p>  程序功能:1、添加進程及其最大資源。點擊添加按鈕進行添加,添加的進程的名字不能重復。2、給每一個進程的Allocation進行修改。點擊Allocation按鈕,會顯示當前修改的進程中的資源情況。3、清空所有記錄。點擊“清空”按鈕,一切都會初始化。4、提供了兩個實例。點擊按鈕“實例1”,顯示實例1的所有進程及其資源的分布情況。同樣的點擊“實例2”。4、修改Available的數(shù)

58、值。點擊按鈕“Available”,顯示修改當前各個資源的剩余量。</p><p><b>  2、系統(tǒng)測試</b></p><p>  測試的數(shù)據(jù)依照課本上的例子來寫:</p><p>  操作過程及其結果如下:</p><p><b>  3、調(diào)試分析:</b></p><p

59、> ?。?)程序測試的時候,發(fā)現(xiàn)在執(zhí)行了銀行家算法后,只要進程超過3個很容易死機。即使不超過3個也會死機。經(jīng)過對按鈕事件處理的書寫仔細檢查,才發(fā)現(xiàn)程序中控制循環(huán)從0開始的變量i的數(shù)值有問題。當一次循環(huán)結束后,再進行下一輪循環(huán)的時候,i的數(shù)值為1,越過了0,以至于程序死機。將其修改為-1之后,就沒有問題了。</p><p>  (2)對java中的控件的使用非常麻煩,在使用控件Jlist的時候,直接添加到容器

60、中,程序運行的時候會改變大小。后來從網(wǎng)上查詢到了控件的正確使用方法,就是將控件添加到JscrollPane中,在將JscrollPane添加到容器中。</p><p> ?。?)對于Jcombobox的使用也是非常的麻煩,程序中有有一個清空功能,使用了之后必須將控件的數(shù)據(jù)都要清掉。于是使用了控件的removeallitem()函數(shù),但是一旦調(diào)用這個函數(shù)的時候,程序中的圖形的布局就要發(fā)生變化。通過查資料得知,對于控

61、件Jcombobox的使用,如果使用函數(shù)去掉它的所有數(shù)據(jù),會造成整個圖形的布局變化,這是不可避免的。因為我使用的容器的布局管理器是使用的BorderLayout而不是FlowLayout。最后,我只能換為JtxtField這個文本編輯控件。</p><p> ?。?)對于程序中的變量的賦值,特別是對于那些沒有固定長度的變量賦值是個困難問題。開始的時候,我為每一個資源的數(shù)目都定義了一個計數(shù)變量。但是這樣的做的結果就

62、是程序出錯,最后我改用了一個變量,那就是程序中的進程數(shù)目的變量。這樣將變量統(tǒng)一了之后,程序的運行不會出錯了而且還會簡潔了變量。</p><p><b>  五、用戶手冊</b></p><p>  1.、本程序的運行環(huán)境是MyEclipse環(huán)境,使用的編程語言是Java語言,操作系統(tǒng)是</p><p>  Windows Xp操作系統(tǒng)。<

63、/p><p>  2、程序無需安裝,只需要安裝了MyEclipse即可。</p><p>  3、程序使用之前,在MyEclipse中建立一個Java工程,在工程中建立一個MyJlist類,將代碼粘貼到其中,直接運行即可。點擊編譯器中運行按鈕,程序中出現(xiàn)如下情況:</p><p><b> ?。?)程序運行:</b></p><

64、p>  從截圖中可以看出,目前系統(tǒng)的進程數(shù)目是0,即沒有進程。當前各個控件的情況是空,</p><p>  這是一個初始化狀態(tài)。當前程序中有三類資源,默認數(shù)值為10、5、7</p><p> ?。?)在標簽“添加進程:”所對應的這一列中進行添加進程。在“進程名:”右面的編輯框中輸入進程的名字,如p1。在往下,選擇每一類資源的該進程所用到的資源的最大數(shù)目。如可以選擇進程所需要的三類資源

65、的數(shù)目都為5。這樣方便一些。設置完之后,直接點擊下面的按鈕“添加”即可。這樣進程p1就直接添加到了系統(tǒng)中。此時后,“目前系統(tǒng)中的進程數(shù)目為:”后面顯示為1。具體的操作如下圖所示:依照以上的過程,再添加一些進程到系統(tǒng)中。</p><p> ?。?)在標簽“Allocation”所對應的這一列中,是用來設置每個進程的當前所占有的資源的數(shù)目的。同樣的,在標簽“選擇進程:”標簽后面的文本框中填寫所要設置的進程的名字。在往

66、下,選擇資源的進程的所占有的數(shù)量,例如可以設置進程p1當前擁有的三類資源的數(shù)目為1,2,3。過程如下圖所示:</p><p>  同樣,根據(jù)上述過程,設置其他的進程的數(shù)值。</p><p> ?。?)在標簽“Request”這一類是用來設置某一個進程是否申請了資源的,進程在執(zhí)行的過程可以申請資源。例如進程p1可以申請資源的數(shù)目為Request(2,2,2)。結果如下圖所示:</p&g

67、t;<p> ?。?)在標簽“Available”這一列,設置當前三類資源的剩余數(shù)目。可設置為(2,2,2)</p><p> ?。?)點擊“清空”按鈕,結果與程序開始運行的結果是一樣的。點擊實例1,實例2按鈕會出現(xiàn)兩個實例。點擊執(zhí)行算法按鈕,會出現(xiàn)如下對話框,接著點擊對話框中的“檢查安全性”按鈕就可求出安全序列。</p><p><b>  六、程序清單</

68、b></p><p>  程序主要用到了一個類及其內(nèi)部類:</p><p>  public class MyJlist extends JFrame implements ActionListener</p><p><b>  {</b></p><p>  private JTextField current

69、_text=new JTextField();//添加到標簽("當前進程資源非配情況:")之后,添加到容器panel1的中間</p><p>  //以下變量是為了防止找不到安全序列后,為了恢復進程在沒有審請資源的時候的情況</p><p>  private String request1;// 申請資源1的數(shù)量</p><p>  priva

70、te String request2;// 申請資源2的數(shù)量</p><p>  private String request3;// 申請資源3的數(shù)量</p><p>  private String available1;//滿足申請后的資源1的剩余量</p><p>  private String available2;//滿足申請后的資源2的剩余量<

71、/p><p>  private String available3;//滿足申請后的資源3的剩余量</p><p>  private String need1;//滿足申請資源后,資源1的當前需要量</p><p>  private String need2; //滿足申請資源后,資源2的當前需要量</p><p>  private

72、String need3; //滿足申請資源后,資源3的當前需要量</p><p>  private int convert=0;//控制進程中只能有一個進程申請資源</p><p>  private int requestThread;//存儲申請資源進程的索引數(shù)值,便于恢復進程的情況</p><p>  //以下所有變量都是為了圖形的顯示</p>

73、;<p>  private String[] max_resource1_list_num=new String[10];</p><p>  private String[] max_resource2_list_num=new String[10];</p><p>  private String[] max_resource3_list_num=new String

74、[10];</p><p>  private String[] allocation_resource1_list_num=new String[10];</p><p>  private String[] allocation_resource2_list_num=new String[10];</p><p>  private String[] alloc

75、ation_resource3_list_num=new String[10];</p><p>  private String[] need_resource1_list_num=new String[10];</p><p>  private String[] need_resource2_list_num=new String[10];</p><p> 

76、 private String[] need_resource3_list_num=new String[10];</p><p>  private String[] available_resource1_list_num=new String[]{"10"};</p><p>  private String[] available_resource2_list_

77、num=new String[]{"5"};</p><p>  private String[] available_resource3_list_num=new String[]{"7"};private JTextField add_ThreadName;//添加進程的名字文本框</p><p>  private String[] name

78、_num_add_ThreadName=new String[10];</p><p>  private static int num_add_ThreadName;//添加的進程的數(shù)目</p><p>  //填寫要填寫的進程資源的進程的名字</p><p>  private static int index;//存儲要修改進程的索引</p>&

79、lt;p>  private JButton allocation_button;//Allocaion按鈕</p><p>  private JTextField request_thread_name;//申請資源的進程的名字</p><p>  private JButton request_button;//Request按鈕</p><p>  p

80、rivate JTextField available_resource1_text;</p><p>  //填寫要修改的資源1的剩余數(shù)量</p><p>  private JTextField available_resource2_text;</p><p>  private JTextField available_resource3_text;<

81、/p><p>  private JButton available_button;//Available按鈕</p><p>  private JButton clear_button;//清空按鈕</p><p>  private JButton example1_button;//實例1按鈕</p><p>  private JBut

82、ton example2_button;//實例2按鈕</p><p>  private JButton check_safe_arry;//執(zhí)行算法按鈕</p><p>  public MyJlist()</p><p><b>  {</b></p><p>  add_button.addActionListe

83、ner(this);//添加按鈕添加事件監(jiān)聽器</p><p>  allocation_button.addActionListener(this); </p><p>  //Allocation按鈕添加事件監(jiān)聽器</p><p>  request_button.addActionListener(this); </p><p>  /

84、/Reques按鈕添加事件監(jiān)聽器</p><p>  available_button.addActionListener(this); </p><p>  // Available按鈕添加事件監(jiān)聽器</p><p>  clear_button.addActionListener(this); //清空按鈕添加事件監(jiān)聽器</p><p>

85、  example1_button.addActionListener(this);</p><p>  //實例1按鈕添加事件監(jiān)聽器</p><p>  example2_button.addActionListener(this); </p><p>  //實例2按鈕添加事件監(jiān)聽器</p><p>  check_safe_arry.a

86、ddActionListener(this); </p><p>  //執(zhí)行算法按鈕添加事件監(jiān)聽器</p><p><b>  }</b></p><p>  public void actionPerformed(ActionEvent e)//實現(xiàn)功能</p><p><b>  {</b>&

87、lt;/p><p>  boolean bool_add=false;</p><p>  String str_add;</p><p>  boolean bool_allocation=false;</p><p>  boolean bool_request=false;</p><p>  if(e.getSou

88、rce()==add_button)//實現(xiàn)添加進程功能</p><p>  {convert=0;</p><p>  if(num_add_ThreadName<10)//最多添加10個進程</p><p>  {if(add_ThreadName.getText().length()==0)</p><p>  //進程名字為空的

89、處理</p><p>  {name_num_add_ThreadName[num_add_ThreadName]=new String("進程"+num_add_ThreadName);</p><p>  str_add=new String("進程"+num_add_ThreadName);</p><p>

90、<b>  }</b></p><p><b>  else</b></p><p>  {name_num_add_ThreadName[num_add_ThreadName]=new String(add_ThreadName.getText());//獲取進程名</p><p>  str_add=ne

91、w String(add_ThreadName.getText());</p><p><b>  }</b></p><p>  for(int i=0;i<num_add_ThreadName;i++)//判斷進程名是否重復</p><p><b>  {</b></p><p>  i

92、f(name_num_add_ThreadName[i].equalsIgnoreCase(str_add))</p><p>  {bool_add=true;JOptionPane.showMessageDialog(this, "進程名字 已存在!請重新填寫。");break;}</p><p><b>  else</b></p&g

93、t;<p>  bool_add=false;}</p><p>  if(!bool_add)</p><p><b>  {</b></p><p>  /*添加進程并且顯示出來*/</p><p>  num_add_ThreadName++;//進程數(shù)增加</p><p>&

94、lt;b>  }</b></p><p>  this.repaint();//重畫圖形}</p><p><b>  else</b></p><p>  JOptionPane.showMessageDialog(this, "最多添加10個進程!");}</p><p>  i

95、f(e.getSource()==allocation_button)</p><p>  {convert=0;</p><p>  String middle=new String(String.valueOf(allocation_thread_name.getText()));</p><p>  //判斷進程的名字是否存在</p><p

96、>  for(int i=0;i<num_add_ThreadName;i++)</p><p>  {if(name_num_add_ThreadName[i].equalsIgnoreCase(middle))</p><p>  {bool_allocation=true;break;}</p><p><b>  else</b&

97、gt;</p><p>  bool_allocation=false;}</p><p>  if(bool_allocation)</p><p>  {//獲取進程的索引數(shù)值</p><p>  for(int i=0;i<num_add_ThreadName+1;i++)</p><p>  {if(mi

98、ddle.equalsIgnoreCase(name_num_add_ThreadName[i]))</p><p>  {index=i;break;}}</p><p>  //根據(jù)索引修改對應的進程的數(shù)值</p><p>  if((Integer.parseInt(String.valueOf(allocation_resource_combobox1.ge

99、tSelectedItem()))<=Integer.parseInt(max_resource1_list_num[index]))&&(Integer.parseInt(String.valueOf(allocation_resource_combobox2.getSelectedItem()))<=Integer.parseInt(max_resource2_list_num[index]))&

100、&(Integer.parseInt(String.valueOf(allocation_resource_combobox3.getSelectedItem()))<=Integer.parseInt(max_resource3_list_num[index])))</p><p>  {/*設置修改后的數(shù)值,并且顯示在圖形中*/</p><p>  this.repain

101、t();}</p><p><b>  //進程申請資源</b></p><p>  if(e.getSource()==request_button)</p><p>  {//存儲數(shù)值,便于恢復</p><p>  available1=available_resource1_list_num[0];</p&g

102、t;<p>  available2=available_resource2_list_num[0];</p><p>  available3=available_resource3_list_num[0];String middle=new String(String.valueOf(request_thread_name.getText()));</p><p>  /

103、/查找進程名字是否存在</p><p>  for(int i=0;i<num_add_ThreadName;i++)</p><p>  {if(name_num_add_ThreadName[i].equalsIgnoreCase(middle))</p><p>  {bool_request=true;break;}</p><p&

104、gt;<b>  else</b></p><p>  bool_request=false;}</p><p>  if(bool_request){//獲取進程的索引數(shù)值</p><p>  for(int i=0;i<num_add_ThreadName+1;i++)</p><p>  {if(middle

105、.equalsIgnoreCase(name_num_add_ThreadName[i]))</p><p>  {index=i; requestThread=index;</p><p>  //存取數(shù)值,便于恢復</p><p>  request1=String.valueOf(allocation_resource1_list_num[index]<

106、/p><p>  request2=String.valueOf(allocation_resource2_list_num[index]);</p><p>  request3=String.valueOf(allocation_resource3_list_num[index]);</p><p>  need1=String.valueOf(need_resou

107、rce1_list_num[index]);</p><p>  need2=String.valueOf(need_resource2_list_num[index]);</p><p>  need3=String.valueOf(need_resource3_list_num[index]); break;}}</p><p>  //申請資源小于需要量,并且

108、需要資源的剩余量if((Integer.parseInt(String.valueOf(request_resource_combobox1.getSelectedItem()))<=Integer.parseInt(need_resource1_list_num[index]))&&(Integer.parseInt(String.valueOf(request_resource_combobox2.getSe

109、lectedItem()))<=Integer.parseInt(need_resource2_list_num[index]))&&(Integer.parseInt(String.valueOf(request_resource_combobox3.getSelectedItem()))<=Integer.parseInt(need_resource3_list_num[index])))</p&g

110、t;<p>  {if((Integer.parseInt(String.valueOf(request_resource_combobox1.getSelectedItem()))<=Integer.parseInt(available_resource1_list_num[0]))&&(Integer.parseInt(String.valueOf(request_resource_combobo

111、x2.getSelectedItem()))<=Integer.parseInt(available_resource2_list_num[0]))&&(Integer.parseInt(String.valueOf(request_resource_combobox3.getSelectedItem()))<=Integer.parseInt(available_resource3_list_num[0])

112、))</p><p>  {/*滿足資源的申請,顯示數(shù)據(jù)</p><p>  convert++;//控制只能有一個進程滿足申請</p><p><b>  }}</b></p><p>  //修改資源的當前的所有量</p><p>  if(e.getSource()==available_b

113、utton)</p><p><b>  {try</b></p><p>  {convert=0;</p><p>  /*將字符轉化為數(shù)字,輸入不是數(shù)字的字符串則將拋出異常}</p><p>  catch( NumberFormatException e1)</p><p>  {J

114、OptionPane.showMessageDialog(this, "輸入的字符不是數(shù)字!請重新填寫。");}</p><p><b>  }</b></p><p><b>  //清空按鈕</b></p><p>  if(e.getSource()==clear_button)</p>

115、;<p>  {/*初始化操作*/}</p><p><b>  //實例1</b></p><p>  if(e.getSource()==example1_button)</p><p>  {//設置進程名字并且顯示</p><p>  for(int i=0;i<5;i++)</p>

溫馨提示

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

評論

0/150

提交評論