版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 操作系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p> 院(系): 計(jì)算機(jī)工程學(xué)院 </p><p> 專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) </p><p> 學(xué)生姓名: __ </p><p> 班級(jí):__計(jì)算073
2、 _學(xué)號(hào): </p><p> 題目: 仿真模擬銀行家算法對(duì)死鎖的避免 </p><p> 起迄日期: __2010-7-6至2010-7-16_ </p><p> 設(shè)計(jì)地點(diǎn): 2號(hào)實(shí)驗(yàn)樓402 </p><p> 指 導(dǎo) 教 師:
3、 </p><p> 2009—2010年度 第 2 學(xué)期</p><p> 完成日期: 2010 年 7 月 16 日</p><p><b> 課程設(shè)計(jì)目的</b></p><p> 《操作系統(tǒng)》是一門重要的專業(yè)基礎(chǔ)課,是涉及較多硬件知識(shí)的計(jì)算機(jī)系統(tǒng)軟件課
4、程。在計(jì)算機(jī)軟硬件課程的設(shè)置上,它起著承上啟下的作用。操作系統(tǒng)對(duì)計(jì)算機(jī)系統(tǒng)資源實(shí)施管理,是所有其他軟件與計(jì)算機(jī)硬件的唯一接口,所有用戶在使用計(jì)算機(jī)時(shí)都要得到操作系統(tǒng)提供的服務(wù)。</p><p> 操作系統(tǒng)課程設(shè)計(jì)的主要任務(wù)是研究計(jì)算機(jī)操作系統(tǒng)的基本原理和算法,掌握操作系統(tǒng)的進(jìn)程管理、存儲(chǔ)管理、文件管理和設(shè)備管理的基本原理與主要算法。目的是使學(xué)生掌握常用操作系統(tǒng)(如DOS、Windows或Linux)的一般管理方
5、法,了解它是如何組織和運(yùn)作的,對(duì)操作系統(tǒng)的核心概念和算法有一個(gè)透徹的理解,并對(duì)系統(tǒng)運(yùn)行的機(jī)制有一個(gè)全面的掌握,從而充分理解系統(tǒng)調(diào)用與程序設(shè)計(jì)之間的關(guān)系。</p><p><b> 課程設(shè)計(jì)內(nèi)容</b></p><p> 仿真模擬銀行家算法對(duì)死鎖的避免。對(duì)于進(jìn)程死鎖的避免問(wèn)題,分為兩種狀態(tài):安全狀態(tài)和非安全狀態(tài)。在避免死鎖的方法中,允許進(jìn)程動(dòng)態(tài)地申請(qǐng)資源分配之前,應(yīng)
6、先計(jì)算此次資源分配的安全性。若此次分配不會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則將資源分配給進(jìn)程;否則,令進(jìn)程等待。</p><p> 所謂安全狀態(tài)是指系統(tǒng)能按某種進(jìn)程順序,來(lái)為每個(gè)進(jìn)程pi分配所需的資源,直至滿足每個(gè)進(jìn)程對(duì)資源的最大需求,使每個(gè)進(jìn)程都可順利地完成。如果系統(tǒng)無(wú)法找到這樣一個(gè)序列,則系統(tǒng)處于不安全狀態(tài)。只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進(jìn)入死鎖狀態(tài)。因此避免死鎖的實(shí)質(zhì)在于:系統(tǒng)在進(jìn)行資源分配時(shí),如何使系統(tǒng)不進(jìn)
7、入不安全狀態(tài)。銀行家算法就是一種最有代表性的避免死鎖的算法。</p><p><b> 系統(tǒng)分析與設(shè)計(jì)</b></p><p><b> 1、系統(tǒng)分析</b></p><p> 系統(tǒng)分析的主要任務(wù)是將在系統(tǒng)詳細(xì)調(diào)查中所得到的文檔資料集中到一起,對(duì)組織內(nèi)部整體管理狀況和信息處理過(guò)程進(jìn)行分析。目的是將用戶的需求及其解決方
8、法確定下來(lái),這些需要確定的結(jié)果包括:開(kāi)發(fā)者關(guān)于現(xiàn)有組織管理狀況的了解;用戶對(duì)信息系統(tǒng)功能的需求;數(shù)據(jù)和業(yè)務(wù)流程;管理功能和管理數(shù)據(jù)指標(biāo)體系;新系統(tǒng)擬改動(dòng)和新增的管理模型等等。系統(tǒng)分析所確定的內(nèi)容是今后系統(tǒng)設(shè)計(jì)、系統(tǒng)實(shí)現(xiàn)的基礎(chǔ)。</p><p> 根據(jù)銀行家算法,設(shè)計(jì)這個(gè)銀行家算法的模擬系統(tǒng)。算法中涉及到進(jìn)程的個(gè)數(shù),資源的種類。進(jìn)程當(dāng)前占有的資源保存在數(shù)組allocation中,需要的資源數(shù)目need數(shù)組中。用戶
9、添加進(jìn)程數(shù)目,并且設(shè)置每個(gè)進(jìn)程對(duì)于每一類資源的占有情況和需要情況,還可以設(shè)置每一類資源的庫(kù)存容量。根據(jù)算法,找出安全序列,如果不存在安全序列的話,會(huì)顯示安全序列不存在。</p><p><b> 2、系統(tǒng)設(shè)計(jì)</b></p><p> 程序是利用java語(yǔ)言編寫(xiě)的,直接調(diào)用java中的GUI接口進(jìn)行界面的設(shè)計(jì)。設(shè)計(jì)出兩個(gè)窗口,一個(gè)主窗口,一個(gè)執(zhí)行算法并且將結(jié)果顯示
10、的對(duì)話框。涉及到j(luò)ava中的JFrame 、JPanel、JDialog主要是這三個(gè)。其中面板類用到了最多的。下面將這兩個(gè)窗口的任務(wù)敘述如下:</p><p> 1、對(duì)于主窗口,包括添加進(jìn)程的功能、設(shè)置每個(gè)進(jìn)程的Allocation的數(shù)目、設(shè)置Available的數(shù)值??梢栽O(shè)置每個(gè)進(jìn)程的Request的情況。</p><p> ?。?)添加進(jìn)程的功能。利用了一個(gè)JtextField 輸入
11、進(jìn)程的名字。利用JcomboBox選擇各個(gè)給進(jìn)程所需要的資源的最大數(shù)目。利用按鈕添加監(jiān)聽(tīng)器實(shí)現(xiàn)添加功能。如果進(jìn)程名字沒(méi)有添加的話,默認(rèn)是:進(jìn)程+序號(hào)。</p><p> ?。?)設(shè)置Allocation。與上面的基本相同。利用了一個(gè)JtextField 輸入進(jìn)程的名字。利用JcomboBox選擇各個(gè)給進(jìn)程所占有的各類資源的數(shù)目。利用按鈕添加監(jiān)聽(tīng)器實(shí)現(xiàn)添加功能。如果沒(méi)有見(jiàn)輸入進(jìn)程的名字,功能不能執(zhí)行。根據(jù)算法,所占
12、有的各類的資源的數(shù)目不能超過(guò)給進(jìn)程所需要的各類資源的最大數(shù)目。否則不會(huì)執(zhí)行。</p><p> (3)設(shè)置Request。功能執(zhí)行的時(shí)候,用JtextField 輸入進(jìn)程的名字。利用JcomboBox選擇各個(gè)給進(jìn)程所申請(qǐng)的各類資源的數(shù)目。利用按鈕添加監(jiān)聽(tīng)器實(shí)現(xiàn)添加功能。如果沒(méi)有見(jiàn)輸入進(jìn)程的名字,功能不能執(zhí)行。根據(jù)算法,所申請(qǐng)的各類的資源的數(shù)目不能超過(guò)給進(jìn)程所需要的數(shù)目,即不能超過(guò)Need中的數(shù)目。如果滿足的話,
13、還必須檢查是否超過(guò)了Available中的數(shù)目。只有這兩個(gè)條件同時(shí)滿足了,才能夠繼續(xù)執(zhí)行。</p><p> 2、對(duì)于另一個(gè)窗口,主要是通過(guò)內(nèi)部類來(lái)實(shí)現(xiàn)的。這個(gè)窗口相當(dāng)于主窗口中的一個(gè)變量。這個(gè)窗口實(shí)現(xiàn)了算法和顯示結(jié)果。</p><p> ?。?)顯示Request后的各個(gè)變量的結(jié)果。利用Jlist控件將結(jié)果顯示。因?yàn)槭褂玫氖莾?nèi)部類,所以可以自由調(diào)用外部的變量。</p>&
14、lt;p> ?。?)顯示執(zhí)行算法后的結(jié)果。同樣也是利用Jlist控件將結(jié)果顯示。執(zhí)行算法的時(shí)候,先將數(shù)據(jù)的字符串形式轉(zhuǎn)化為數(shù)字形式。然后根據(jù)銀行家算法執(zhí)行,查找到安全序列。將結(jié)果顯示。</p><p> 3、設(shè)計(jì)的過(guò)程,填入了兩個(gè)實(shí)例。一個(gè)是正確的存在安全序列的實(shí)例。一個(gè)是不存在安全序列的實(shí)例。</p><p><b> 3、模塊設(shè)計(jì):</b></p&
15、gt;<p> 程序的設(shè)計(jì)主要有兩個(gè)模塊,分別是設(shè)置數(shù)值和檢查安全性序列模塊。對(duì)于設(shè)置數(shù)值模塊,主要有添加進(jìn)程、清空進(jìn)程、進(jìn)程申請(qǐng)資源(即,Request資源)。對(duì)于檢查安全性序列就是執(zhí)行銀行家算法。</p><p> 程序運(yùn)行的時(shí)候,先是設(shè)置數(shù)據(jù),通過(guò)點(diǎn)擊添加進(jìn)程、設(shè)置Allocation和Request的值來(lái)設(shè)置數(shù)據(jù)。在點(diǎn)擊“執(zhí)行算法”,彈出對(duì)話框顯示申請(qǐng)資源后的結(jié)果。在點(diǎn)擊對(duì)話框中的執(zhí)行算
16、法按鈕進(jìn)行查找安全序列。</p><p> 其中涉及的數(shù)據(jù)結(jié)構(gòu)和模塊調(diào)用圖如下:</p><p> 1、對(duì)于設(shè)置數(shù)值模塊(包括添加進(jìn)程、清空進(jìn)程、申請(qǐng)資源)用到的數(shù)據(jù)結(jié)構(gòu)是一個(gè)類:</p><p> public class MyJlist extends JFrame implements ActionListener</p><p>
17、;<b> {</b></p><p> private JTextField current_text=new JTextField();//添加到標(biāo)簽("當(dāng)前進(jìn)程資源非配情況:")之后,添加到容器panel1的中間</p><p> private JList threadName_list;//顯示添加的進(jìn)程名字</p>
18、<p> private JList max_resource1_list;//顯示各個(gè)進(jìn)程所用到的資源1的最大數(shù)量</p><p> private String[] max_resource1_list_num=new String[10];//存儲(chǔ)各個(gè)進(jìn)程所用到的資源1的最大數(shù)量</p><p> private JList max_resource2_list;//
19、顯示各個(gè)進(jìn)程所用到的資源2的最大數(shù)量</p><p> private String[] max_resource2_list_num=new String[10];//存儲(chǔ)各個(gè)進(jìn)程所用到的資源2的最大數(shù)量</p><p> private JList max_resource3_list;//顯示各個(gè)進(jìn)程所用到的資源3的最大數(shù)量</p><p> priva
20、te String[] max_resource3_list_num=new String[10];//存儲(chǔ)各個(gè)進(jìn)程所用到的資源3的最大數(shù)量</p><p> private JList allocation_resource1_list;</p><p> //顯示各個(gè)進(jìn)程所占有的資源1的數(shù)量</p><p> private String[] alloca
21、tion_resource1_list_num=new String[10];</p><p> //存儲(chǔ)各個(gè)進(jìn)程所占有的資源1的數(shù)量</p><p> private JList allocation_resource2_list;</p><p> //顯示各個(gè)進(jìn)程所占有的資源2的數(shù)量</p><p> private Strin
22、g[] allocation_resource2_list_num=new String[10];</p><p> //存儲(chǔ)各個(gè)進(jìn)程所占有的資源2的數(shù)量</p><p> private JList allocation_resource3_list;</p><p> //顯示各個(gè)進(jìn)程所占有的資源3的數(shù)量</p><p> pri
23、vate String[] allocation_resource3_list_num=new String[10];</p><p> //存儲(chǔ)各個(gè)進(jìn)程所占有的資源3的數(shù)量</p><p> private JList need_resource1_list;</p><p> //顯示各個(gè)進(jìn)程所需要的資源1的數(shù)量</p><p>
24、 private String[] need_resource1_list_num=new String[10];</p><p> //存儲(chǔ)各個(gè)進(jìn)程所需要的資源1的數(shù)量</p><p> private JList need_resource2_list;</p><p> //顯示各個(gè)進(jìn)程所需要的資源2的數(shù)量</p><p> p
25、rivate String[] need_resource2_list_num=new String[10];</p><p> //存儲(chǔ)各個(gè)進(jìn)程所需要的資源2的數(shù)量</p><p> private JList need_resource3_list;</p><p> //顯示各個(gè)進(jìn)程所需要的資源3的數(shù)量</p><p> pri
26、vate String[] need_resource3_list_num=new String[10];</p><p> //存儲(chǔ)各個(gè)進(jìn)程所需要的資源3的數(shù)量</p><p> private JList available_resource1_list;</p><p> //顯示資源1的庫(kù)存數(shù)量</p><p> privat
27、e String[] available_resource1_list_num=new String[]{"10"};</p><p> //存儲(chǔ)資源1的庫(kù)存數(shù)量</p><p> private JList available_resource2_list;</p><p> //顯示資源2的庫(kù)存數(shù)量</p><p&g
28、t; private String[] available_resource2_list_num=new String[]{"5"};</p><p> //存儲(chǔ)資源2的庫(kù)存數(shù)量</p><p> private JList available_resource3_list;</p><p> //顯示資源3的庫(kù)存數(shù)量</p>
29、<p> private String[] available_resource3_list_num=new String[]{"7"};</p><p> //存儲(chǔ)資源3的庫(kù)存數(shù)量</p><p> private JTextField add_ThreadName;</p><p> //添加的進(jìn)程的名字</p&g
30、t;<p> private String[] name_num_add_ThreadName=new String[10];</p><p> //存儲(chǔ)所要添加的進(jìn)程的名字</p><p><b> }</b></p><p> 2、對(duì)于執(zhí)行銀行家算法的所用到的數(shù)據(jù)結(jié)構(gòu)是一個(gè)內(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> //以下是顯示申請(qǐng)資源后進(jìn)程和資源中類的情況</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í)行后的各個(gè)進(jìn)程和資源的結(jié)果</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、整個(gè)程序主要就是兩部分,在主窗口部分由添加進(jìn)程、清空進(jìn)程、進(jìn)程實(shí)例、申請(qǐng)資源、設(shè)置進(jìn)程當(dāng)前資源的占有情況、設(shè)置資源的庫(kù)存情況、執(zhí)行算法。</p><p><b> 4、
47、數(shù)據(jù)結(jié)構(gòu)說(shuō)明:</b></p><p> 程序分為兩個(gè)模塊,其中第一個(gè)模塊涉及到添加進(jìn)程、清空進(jìn)程、設(shè)置Allocation、申請(qǐng)資源等等。第二個(gè)模塊涉及到將申請(qǐng)資源的結(jié)果顯示、執(zhí)行銀行家算法。</p><p> 對(duì)于這兩個(gè)模塊的實(shí)現(xiàn)主要通過(guò)兩個(gè)類來(lái)實(shí)現(xiàn)的。</p><p> (1)第一個(gè)模塊是類public class MyJlist來(lái)實(shí)現(xiàn)的,因
48、為用的編程語(yǔ)言是JAVA,所以程序?qū)τ诟鞣N功能是顯示是通過(guò)給按鈕添加事件監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)的,即add_button.addActionListener(this);//用來(lái)實(shí)現(xiàn)添加進(jìn)程</p><p> allocation_button.addActionListener(this);</p><p> //用來(lái)設(shè)置對(duì)應(yīng)進(jìn)程的當(dāng)前各類資源的占有情況</p><p>
49、; request_button.addActionListener(this);//用來(lái)實(shí)現(xiàn)進(jìn)程對(duì)資源的申請(qǐng)</p><p> available_button.addActionListener(this);//用來(lái)設(shè)置當(dāng)前各類資源的當(dāng)前的數(shù)</p><p> clear_button.addActionListener(this);//清空各個(gè)進(jìn)程的記錄</p>
50、<p> example1_button.addActionListener(this);//實(shí)例1</p><p> example2_button.addActionListener(this);//實(shí)例2</p><p> check_safe_arry.addActionListener(this);//執(zhí)行算法,彈出對(duì)話框</p><p>
51、 (2)第二個(gè)模塊的實(shí)現(xiàn)通過(guò)一個(gè)內(nèi)部類:class ComputeDialog extends JDialog implements ActionListener,與第一模塊類似,該模塊的功能的實(shí)現(xiàn)也是通過(guò)按鈕添加事件監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)的。</p><p> check_safe_button.addActionListener(this);//實(shí)現(xiàn)銀行算法,查找到安全序列。查//不到的時(shí)候,顯示安全序列不存在。&
52、lt;/p><p> safe_arry.setText("安全序列不存在!");//安全序列不存在的時(shí)候,設(shè)置為此文本</p><p> 對(duì)于模塊在程序中的作用,第一個(gè)模塊是主體,第二個(gè)模塊是在第一個(gè)模塊的基礎(chǔ)上實(shí)現(xiàn)的。</p><p><b> 5、算法流程圖:</b></p><p> 1、
53、第一個(gè)模塊中涉及添加、清空、設(shè)置Allocation、設(shè)置Available。</p><p> (1)主程序初始化。</p><p><b> ?。?)添加功能</b></p><p><b> ?。?)清空功能</b></p><p> (4)設(shè)置Allocation</p>
54、<p> ?。?)設(shè)置Available。</p><p> ?。?)設(shè)置Request</p><p> 2、第二模塊主要是實(shí)現(xiàn)銀行家算法:</p><p> loop控制循環(huán)次數(shù),超過(guò)指定次數(shù),說(shuō)明沒(méi)有安全序列</p><p> 四、模塊調(diào)試與系統(tǒng)測(cè)試</p><p><b> 1、模塊
55、調(diào)試</b></p><p> 輸入的形式和輸入值的范圍</p><p> 程序的輸入過(guò)程主要在主窗體中,對(duì)于進(jìn)程名,可以使用任意字符,但是對(duì)于進(jìn)程的名字不能重復(fù)。如果沒(méi)有填寫(xiě)進(jìn)程的名字,程序默認(rèn)這個(gè)進(jìn)程的名字是:進(jìn)程+當(dāng)前的進(jìn)程數(shù)目。所添加的進(jìn)程數(shù)目不能超過(guò)10個(gè)進(jìn)程。對(duì)于進(jìn)程共享的資源,一共有三類,但是每一類的資源總數(shù)不能超過(guò)10個(gè)。資源的最大剩余量是10。</p
56、><p><b> 輸出的形式</b></p><p> 數(shù)據(jù)的顯示在主窗口中和子窗口中都可以顯示。將所有數(shù)據(jù)填寫(xiě)好后,單擊按鈕,會(huì)在主窗口中顯示出所顯示的數(shù)據(jù)。點(diǎn)擊“執(zhí)行算法”按鈕就會(huì)彈出一個(gè)對(duì)話框,顯示數(shù)據(jù)。對(duì)話框中點(diǎn)擊按鈕“檢查安全性”,執(zhí)行銀行家算法,將結(jié)果顯示在對(duì)話框中。</p><p><b> 程序所能達(dá)到的功能<
57、;/b></p><p> 程序功能:1、添加進(jìn)程及其最大資源。點(diǎn)擊添加按鈕進(jìn)行添加,添加的進(jìn)程的名字不能重復(fù)。2、給每一個(gè)進(jìn)程的Allocation進(jìn)行修改。點(diǎn)擊Allocation按鈕,會(huì)顯示當(dāng)前修改的進(jìn)程中的資源情況。3、清空所有記錄。點(diǎn)擊“清空”按鈕,一切都會(huì)初始化。4、提供了兩個(gè)實(shí)例。點(diǎn)擊按鈕“實(shí)例1”,顯示實(shí)例1的所有進(jìn)程及其資源的分布情況。同樣的點(diǎn)擊“實(shí)例2”。4、修改Available的數(shù)
58、值。點(diǎn)擊按鈕“Available”,顯示修改當(dāng)前各個(gè)資源的剩余量。</p><p><b> 2、系統(tǒng)測(cè)試</b></p><p> 測(cè)試的數(shù)據(jù)依照課本上的例子來(lái)寫(xiě):</p><p> 操作過(guò)程及其結(jié)果如下:</p><p><b> 3、調(diào)試分析:</b></p><p
59、> ?。?)程序測(cè)試的時(shí)候,發(fā)現(xiàn)在執(zhí)行了銀行家算法后,只要進(jìn)程超過(guò)3個(gè)很容易死機(jī)。即使不超過(guò)3個(gè)也會(huì)死機(jī)。經(jīng)過(guò)對(duì)按鈕事件處理的書(shū)寫(xiě)仔細(xì)檢查,才發(fā)現(xiàn)程序中控制循環(huán)從0開(kāi)始的變量i的數(shù)值有問(wèn)題。當(dāng)一次循環(huán)結(jié)束后,再進(jìn)行下一輪循環(huán)的時(shí)候,i的數(shù)值為1,越過(guò)了0,以至于程序死機(jī)。將其修改為-1之后,就沒(méi)有問(wèn)題了。</p><p> ?。?)對(duì)java中的控件的使用非常麻煩,在使用控件Jlist的時(shí)候,直接添加到容器
60、中,程序運(yùn)行的時(shí)候會(huì)改變大小。后來(lái)從網(wǎng)上查詢到了控件的正確使用方法,就是將控件添加到JscrollPane中,在將JscrollPane添加到容器中。</p><p> ?。?)對(duì)于Jcombobox的使用也是非常的麻煩,程序中有有一個(gè)清空功能,使用了之后必須將控件的數(shù)據(jù)都要清掉。于是使用了控件的removeallitem()函數(shù),但是一旦調(diào)用這個(gè)函數(shù)的時(shí)候,程序中的圖形的布局就要發(fā)生變化。通過(guò)查資料得知,對(duì)于控
61、件Jcombobox的使用,如果使用函數(shù)去掉它的所有數(shù)據(jù),會(huì)造成整個(gè)圖形的布局變化,這是不可避免的。因?yàn)槲沂褂玫娜萜鞯牟季止芾砥魇鞘褂玫腂orderLayout而不是FlowLayout。最后,我只能換為JtxtField這個(gè)文本編輯控件。</p><p> ?。?)對(duì)于程序中的變量的賦值,特別是對(duì)于那些沒(méi)有固定長(zhǎng)度的變量賦值是個(gè)困難問(wèn)題。開(kāi)始的時(shí)候,我為每一個(gè)資源的數(shù)目都定義了一個(gè)計(jì)數(shù)變量。但是這樣的做的結(jié)果就
62、是程序出錯(cuò),最后我改用了一個(gè)變量,那就是程序中的進(jìn)程數(shù)目的變量。這樣將變量統(tǒng)一了之后,程序的運(yùn)行不會(huì)出錯(cuò)了而且還會(huì)簡(jiǎn)潔了變量。</p><p><b> 五、用戶手冊(cè)</b></p><p> 1.、本程序的運(yùn)行環(huán)境是MyEclipse環(huán)境,使用的編程語(yǔ)言是Java語(yǔ)言,操作系統(tǒng)是</p><p> Windows Xp操作系統(tǒng)。<
63、/p><p> 2、程序無(wú)需安裝,只需要安裝了MyEclipse即可。</p><p> 3、程序使用之前,在MyEclipse中建立一個(gè)Java工程,在工程中建立一個(gè)MyJlist類,將代碼粘貼到其中,直接運(yùn)行即可。點(diǎn)擊編譯器中運(yùn)行按鈕,程序中出現(xiàn)如下情況:</p><p><b> ?。?)程序運(yùn)行:</b></p><
64、p> 從截圖中可以看出,目前系統(tǒng)的進(jìn)程數(shù)目是0,即沒(méi)有進(jìn)程。當(dāng)前各個(gè)控件的情況是空,</p><p> 這是一個(gè)初始化狀態(tài)。當(dāng)前程序中有三類資源,默認(rèn)數(shù)值為10、5、7</p><p> ?。?)在標(biāo)簽“添加進(jìn)程:”所對(duì)應(yīng)的這一列中進(jìn)行添加進(jìn)程。在“進(jìn)程名:”右面的編輯框中輸入進(jìn)程的名字,如p1。在往下,選擇每一類資源的該進(jìn)程所用到的資源的最大數(shù)目。如可以選擇進(jìn)程所需要的三類資源
65、的數(shù)目都為5。這樣方便一些。設(shè)置完之后,直接點(diǎn)擊下面的按鈕“添加”即可。這樣進(jìn)程p1就直接添加到了系統(tǒng)中。此時(shí)后,“目前系統(tǒng)中的進(jìn)程數(shù)目為:”后面顯示為1。具體的操作如下圖所示:依照以上的過(guò)程,再添加一些進(jìn)程到系統(tǒng)中。</p><p> (3)在標(biāo)簽“Allocation”所對(duì)應(yīng)的這一列中,是用來(lái)設(shè)置每個(gè)進(jìn)程的當(dāng)前所占有的資源的數(shù)目的。同樣的,在標(biāo)簽“選擇進(jìn)程:”標(biāo)簽后面的文本框中填寫(xiě)所要設(shè)置的進(jìn)程的名字。在往
66、下,選擇資源的進(jìn)程的所占有的數(shù)量,例如可以設(shè)置進(jìn)程p1當(dāng)前擁有的三類資源的數(shù)目為1,2,3。過(guò)程如下圖所示:</p><p> 同樣,根據(jù)上述過(guò)程,設(shè)置其他的進(jìn)程的數(shù)值。</p><p> ?。?)在標(biāo)簽“Request”這一類是用來(lái)設(shè)置某一個(gè)進(jìn)程是否申請(qǐng)了資源的,進(jìn)程在執(zhí)行的過(guò)程可以申請(qǐng)資源。例如進(jìn)程p1可以申請(qǐng)資源的數(shù)目為Request(2,2,2)。結(jié)果如下圖所示:</p&g
67、t;<p> ?。?)在標(biāo)簽“Available”這一列,設(shè)置當(dāng)前三類資源的剩余數(shù)目??稍O(shè)置為(2,2,2)</p><p> ?。?)點(diǎn)擊“清空”按鈕,結(jié)果與程序開(kāi)始運(yùn)行的結(jié)果是一樣的。點(diǎn)擊實(shí)例1,實(shí)例2按鈕會(huì)出現(xiàn)兩個(gè)實(shí)例。點(diǎn)擊執(zhí)行算法按鈕,會(huì)出現(xiàn)如下對(duì)話框,接著點(diǎn)擊對(duì)話框中的“檢查安全性”按鈕就可求出安全序列。</p><p><b> 六、程序清單</
68、b></p><p> 程序主要用到了一個(gè)類及其內(nèi)部類:</p><p> public class MyJlist extends JFrame implements ActionListener</p><p><b> {</b></p><p> private JTextField current
69、_text=new JTextField();//添加到標(biāo)簽("當(dāng)前進(jìn)程資源非配情況:")之后,添加到容器panel1的中間</p><p> //以下變量是為了防止找不到安全序列后,為了恢復(fù)進(jìn)程在沒(méi)有審請(qǐng)資源的時(shí)候的情況</p><p> private String request1;// 申請(qǐng)資源1的數(shù)量</p><p> priva
70、te String request2;// 申請(qǐng)資源2的數(shù)量</p><p> private String request3;// 申請(qǐng)資源3的數(shù)量</p><p> private String available1;//滿足申請(qǐng)后的資源1的剩余量</p><p> private String available2;//滿足申請(qǐng)后的資源2的剩余量<
71、/p><p> private String available3;//滿足申請(qǐng)后的資源3的剩余量</p><p> private String need1;//滿足申請(qǐng)資源后,資源1的當(dāng)前需要量</p><p> private String need2; //滿足申請(qǐng)資源后,資源2的當(dāng)前需要量</p><p> private
72、String need3; //滿足申請(qǐng)資源后,資源3的當(dāng)前需要量</p><p> private int convert=0;//控制進(jìn)程中只能有一個(gè)進(jìn)程申請(qǐng)資源</p><p> private int requestThread;//存儲(chǔ)申請(qǐng)資源進(jìn)程的索引數(shù)值,便于恢復(fù)進(jìn)程的情況</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;//添加進(jìn)程的名字文本框</p><p> private String[] name
78、_num_add_ThreadName=new String[10];</p><p> private static int num_add_ThreadName;//添加的進(jìn)程的數(shù)目</p><p> //填寫(xiě)要填寫(xiě)的進(jìn)程資源的進(jìn)程的名字</p><p> private static int index;//存儲(chǔ)要修改進(jìn)程的索引</p>&
79、lt;p> private JButton allocation_button;//Allocaion按鈕</p><p> private JTextField request_thread_name;//申請(qǐng)資源的進(jìn)程的名字</p><p> private JButton request_button;//Request按鈕</p><p> p
80、rivate JTextField available_resource1_text;</p><p> //填寫(xiě)要修改的資源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;//實(shí)例1按鈕</p><p> private JBut
82、ton example2_button;//實(shí)例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)聽(tīng)器</p><p> allocation_button.addActionListener(this); </p><p> //Allocation按鈕添加事件監(jiān)聽(tīng)器</p><p> request_button.addActionListener(this); </p><p> /
84、/Reques按鈕添加事件監(jiān)聽(tīng)器</p><p> available_button.addActionListener(this); </p><p> // Available按鈕添加事件監(jiān)聽(tīng)器</p><p> clear_button.addActionListener(this); //清空按鈕添加事件監(jiān)聽(tīng)器</p><p>
85、 example1_button.addActionListener(this);</p><p> //實(shí)例1按鈕添加事件監(jiān)聽(tīng)器</p><p> example2_button.addActionListener(this); </p><p> //實(shí)例2按鈕添加事件監(jiān)聽(tīng)器</p><p> check_safe_arry.a
86、ddActionListener(this); </p><p> //執(zhí)行算法按鈕添加事件監(jiān)聽(tīng)器</p><p><b> }</b></p><p> public void actionPerformed(ActionEvent e)//實(shí)現(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)//實(shí)現(xiàn)添加進(jìn)程功能</p><p> {convert=0;</p><p> if(num_add_ThreadName<10)//最多添加10個(gè)進(jìn)程</p><p> {if(add_ThreadName.getText().length()==0)</p><p> //進(jìn)程名字為空的
89、處理</p><p> {name_num_add_ThreadName[num_add_ThreadName]=new String("進(jìn)程"+num_add_ThreadName);</p><p> str_add=new String("進(jìn)程"+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());//獲取進(jìn)程名</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++)//判斷進(jìn)程名是否重復(fù)</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, "進(jìn)程名字 已存在!請(qǐng)重新填寫(xiě)。");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> /*添加進(jìn)程并且顯示出來(lái)*/</p><p> num_add_ThreadName++;//進(jìn)程數(shù)增加</p><p>&
94、lt;b> }</b></p><p> this.repaint();//重畫(huà)圖形}</p><p><b> else</b></p><p> JOptionPane.showMessageDialog(this, "最多添加10個(gè)進(jìn)程!");}</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> //判斷進(jìn)程的名字是否存在</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> {//獲取進(jìn)程的索引數(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ù)索引修改對(duì)應(yīng)的進(jìn)程的數(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è)置修改后的數(shù)值,并且顯示在圖形中*/</p><p> this.repain
101、t();}</p><p><b> //進(jìn)程申請(qǐng)資源</b></p><p> if(e.getSource()==request_button)</p><p> {//存儲(chǔ)數(shù)值,便于恢復(fù)</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、/查找進(jìn)程名字是否存在</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){//獲取進(jìn)程的索引數(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ù)值,便于恢復(fù)</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> //申請(qǐng)資源小于需要量,并且
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> {/*滿足資源的申請(qǐng),顯示數(shù)據(jù)</p><p> convert++;//控制只能有一個(gè)進(jìn)程滿足申請(qǐng)</p><p><b> }}</b></p><p> //修改資源的當(dāng)前的所有量</p><p> if(e.getSource()==available_b
113、utton)</p><p><b> {try</b></p><p> {convert=0;</p><p> /*將字符轉(zhuǎn)化為數(shù)字,輸入不是數(shù)字的字符串則將拋出異常}</p><p> catch( NumberFormatException e1)</p><p> {J
114、OptionPane.showMessageDialog(this, "輸入的字符不是數(shù)字!請(qǐng)重新填寫(xiě)。");}</p><p><b> }</b></p><p><b> //清空按鈕</b></p><p> if(e.getSource()==clear_button)</p>
115、;<p> {/*初始化操作*/}</p><p><b> //實(shí)例1</b></p><p> if(e.getSource()==example1_button)</p><p> {//設(shè)置進(jìn)程名字并且顯示</p><p> for(int i=0;i<5;i++)</p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告—銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)
- 操作系統(tǒng)課程設(shè)計(jì)-銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)(銀行家算法設(shè)計(jì))
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法 (3)
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法 (2)
- 操作系統(tǒng)課程設(shè)計(jì)--銀行家算法 (2)
- 操作系統(tǒng)課程設(shè)計(jì)---模擬銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)---銀行家算法實(shí)現(xiàn)
- 操作系統(tǒng)原理課程設(shè)計(jì)--銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---模擬實(shí)現(xiàn)銀行家算法
- 操作系統(tǒng)課程設(shè)計(jì)-模擬銀行家算法-課程設(shè)計(jì)
- 銀行家算法設(shè)計(jì)-操作系統(tǒng)課程設(shè)計(jì)報(bào)告書(shū)
評(píng)論
0/150
提交評(píng)論