

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