版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《操作系統(tǒng)原理》</b></p><p> 課 程 設(shè) 計(jì) 報(bào) 告 書</p><p> 題 目: 進(jìn)程控制模塊 </p><p> 學(xué) 號(hào): </p><p> 學(xué)生姓名: </p>
2、<p> 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)卓越班</p><p> 指導(dǎo)教師: </p><p> 2014年 12月 26日</p><p><b> 目 錄</b></p><p><b> 1. 系統(tǒng)功能1</b></p&
3、gt;<p><b> 2. 系統(tǒng)設(shè)計(jì)2</b></p><p> 2.1. 總體設(shè)計(jì)2</p><p> 2.2. 詳細(xì)設(shè)計(jì)2</p><p> 2.2.1. 函數(shù)2</p><p> 2.2.2. 數(shù)據(jù)結(jié)構(gòu)3</p><p> 2.2.3. 算法4<
4、/p><p><b> 3. 系統(tǒng)實(shí)現(xiàn)5</b></p><p> 3.1. 開發(fā)工具及語(yǔ)言5</p><p> 3.2. 實(shí)現(xiàn)步驟5</p><p><b> 3.3. 代碼5</b></p><p> 4. 系統(tǒng)測(cè)試與分析21</p><
5、;p><b> 5. 總結(jié)25</b></p><p><b> 系統(tǒng)功能</b></p><p> 實(shí)現(xiàn)進(jìn)程調(diào)度算法選擇,有先來(lái)先服務(wù)調(diào)度算法和優(yōu)先級(jí)調(diào)度算法;</p><p><b> 實(shí)現(xiàn)進(jìn)程的創(chuàng)建;</b></p><p><b> 實(shí)現(xiàn)進(jìn)程
6、的終止;</b></p><p><b> 實(shí)現(xiàn)進(jìn)程的阻塞;</b></p><p><b> 實(shí)現(xiàn)進(jìn)程的喚醒;</b></p><p> 實(shí)現(xiàn)手動(dòng)調(diào)度進(jìn)程和進(jìn)程自動(dòng)執(zhí)行兩種模式;</p><p><b> 許可</b></p><p&g
7、t;<b> 時(shí)間片用完</b></p><p> I/O完成進(jìn)程調(diào)度</p><p><b> I/O請(qǐng)求終止</b></p><p><b> 系統(tǒng)設(shè)計(jì)</b></p><p><b> 總體設(shè)計(jì)</b></p><p
8、> 定義3個(gè)類,JieMian類、Process類、List類。</p><p> JieMian類中布局程序界面,調(diào)用進(jìn)程的創(chuàng)建、執(zhí)行、終止、阻塞、喚醒等函數(shù)。</p><p> Process類模擬進(jìn)程,有3個(gè)變量,進(jìn)程的名字 name、進(jìn)程的時(shí)間片time、進(jìn)程的優(yōu)先級(jí)priority,還有對(duì)這3個(gè)變量賦值和得到變量的值得get函數(shù)、set函數(shù)。</p>&
9、lt;p> List類有兩個(gè)變量,LinkedList<Process> readyList,就緒隊(duì)列;</p><p> LinkedList<Process> blockList,阻塞隊(duì)列。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p><b> 函數(shù)</b><
10、/p><p> 包括函數(shù)聲明(返回值、函數(shù)名、形參)和功能描述。</p><p> JieMian():調(diào)用initframe()函數(shù),初始化程序界面</p><p> void initframe():初始化程序界面</p><p> void actionPerformed(ActionEvent e):事件監(jiān)聽函數(shù),屬于庫(kù)函數(shù),重寫
11、該函數(shù),實(shí)現(xiàn)所有按鈕的事件的監(jiān)聽。</p><p> void selectModel():選擇手動(dòng)或自動(dòng)模式;</p><p> void selectAlgorithm():選擇調(diào)度算法的函數(shù);</p><p> void paiXu():當(dāng)"先來(lái)先服務(wù)算法"轉(zhuǎn)到“優(yōu)先級(jí)算法”,對(duì)就緒隊(duì)列的進(jìn)程按優(yōu)先級(jí)降序排序;</p>
12、<p> void autoModel():進(jìn)入自動(dòng)模式,刷新按鈕,啟動(dòng)線程;</p><p> void run():線程類的線程函數(shù),實(shí)現(xiàn)自動(dòng)執(zhí)行就緒隊(duì)列中的進(jìn)程,將時(shí)間片用完的進(jìn)程再放回到就緒隊(duì)列。</p><p> void manualModel():進(jìn)入手動(dòng)模式的函數(shù),刷新按鈕。</p><p> void createProcess(
13、):創(chuàng)建進(jìn)程,當(dāng)創(chuàng)建進(jìn)程的條件不滿足時(shí),提示錯(cuò)誤,成功創(chuàng)建進(jìn)程后,將進(jìn)程按照先來(lái)先服務(wù)算法或優(yōu)先級(jí)算法將進(jìn)程添加到就緒隊(duì)列,然后刷新就緒隊(duì)列的表格。</p><p> paiXu(Process process):根據(jù)進(jìn)程優(yōu)先級(jí)算法,給就緒隊(duì)列的進(jìn)程排序,如果優(yōu)先級(jí)相同,按先來(lái)先服務(wù)的方式排序;</p><p> void runProcess ():手動(dòng)模式下,執(zhí)行進(jìn)程的函數(shù),將就緒
14、隊(duì)列的第一進(jìn)程取出執(zhí)行,并顯示正在被執(zhí)行的進(jìn)程。</p><p> void readyProcess():手動(dòng)模式下,讓正在執(zhí)行的進(jìn)程結(jié)束執(zhí)行,再放回到就緒隊(duì)列。</p><p> void blockProcess():阻塞進(jìn)程,將正在執(zhí)行的進(jìn)程阻塞,進(jìn)程被阻塞后放到阻塞隊(duì)列,然后刷新阻塞隊(duì)列的表格。</p><p> void wakeUpProcess
15、():喚醒阻塞隊(duì)列里的第一個(gè)阻塞的進(jìn)程,將喚醒的進(jìn)程按照先來(lái)先服務(wù)的算法或者優(yōu)先級(jí)算法放到就緒隊(duì)列中,并刷新就緒隊(duì)列的表格。</p><p> void shutDownProcess():終止進(jìn)程,將正在執(zhí)行的進(jìn)程終止。</p><p> void refresh_ReadyList():刷新就緒隊(duì)列表格,把就緒隊(duì)列里的就緒進(jìn)程顯示在就緒隊(duì)列的表格中;</p><
16、p> void refresh_BlockList():刷新阻塞隊(duì)列表格,把阻塞隊(duì)列的阻塞進(jìn)程顯示在阻塞隊(duì)列的表格中;</p><p> void main(String arg[]):主函數(shù),庫(kù)函數(shù),JieMian jm = new JieMian();實(shí)例化一個(gè)JieMian類的對(duì)象。</p><p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p>
17、<p> 包括數(shù)據(jù)結(jié)構(gòu)的定義。</p><p> PCB的數(shù)據(jù)結(jié)構(gòu)的定義:</p><p><b> //進(jìn)程類</b></p><p> public class Process {</p><p> public String name;//進(jìn)程名</p><p> pu
18、blic int time;//時(shí)間</p><p> public int priority;//進(jìn)程優(yōu)先級(jí)</p><p> public int num;//輪轉(zhuǎn)次數(shù)</p><p> public String getName() {</p><p> return name;</p><p><
19、b> }</b></p><p> public void setName(String name) {</p><p> this.name = name;</p><p><b> }</b></p><p> public int getTime() {</p><p
20、> return time;</p><p><b> }</b></p><p> public void setTime(int time) {</p><p> this.time = time;</p><p><b> }</b></p><p>
21、 public int getPriority() {</p><p> return priority;</p><p><b> }</b></p><p> public void setPriority(int priority) {</p><p> this.priority = priority;&
22、lt;/p><p><b> }</b></p><p> public int getNum() {</p><p> return num;</p><p><b> }</b></p><p> public void setNum(int num) {</
23、p><p> this.num = num;</p><p><b> }</b></p><p><b> }</b></p><p> 就緒隊(duì)列和阻塞隊(duì)列的數(shù)據(jù)結(jié)構(gòu)的定義</p><p> public class List {</p><p&g
24、t; static LinkedList<Process> readyList = new LinkedList<Process>();//就緒隊(duì)列</p><p> static LinkedList<Process> blockList = new LinkedList<Process>();//阻塞隊(duì)列</p><p><b&
25、gt; }</b></p><p><b> 算法</b></p><p> 采用自然語(yǔ)言、流程圖、N-S圖、偽代碼任一種描述。</p><p> 步驟1、選擇模式,否則不能開始程序;</p><p> 步驟2、選擇調(diào)度算法,否則不能創(chuàng)建進(jìn)程;</p><p> 事件1、創(chuàng)
26、建進(jìn)程;(1)輸入進(jìn)程名字,名字要唯一,否則不能創(chuàng)建進(jìn)程;選擇進(jìn)程的時(shí)間片,默認(rèn)時(shí)間片為1;選擇進(jìn)程優(yōu)先級(jí),默認(rèn)優(yōu)先級(jí)為1;(2)判斷就緒隊(duì)列是否為空,若不為空則不能創(chuàng)建進(jìn)程;(3)使用正則表達(dá)式驗(yàn)證進(jìn)程名是否合法,否則不能創(chuàng)建進(jìn)程;(4)、創(chuàng)建進(jìn)程成功,將進(jìn)程插入就緒隊(duì)列,并在就緒隊(duì)列表格中顯示。</p><p> 事件2、執(zhí)行進(jìn)程;(1)判斷就緒隊(duì)列是否為空,即是否有可執(zhí)行的進(jìn)程;(2)、從就緒隊(duì)列取出一個(gè)
27、進(jìn)程,賦值給runningProcess變量。</p><p> 事件3、阻塞進(jìn)程;(1)判斷是否有正在執(zhí)行的進(jìn)程;(2)、判斷阻塞隊(duì)列是否已滿;</p><p> 、滿足阻塞條件,將正在執(zhí)行的進(jìn)程放入阻塞隊(duì)列;</p><p> 事件4、喚醒進(jìn)程;(1)判斷是否有可喚醒的進(jìn)程;(2)判斷就緒隊(duì)列是否已滿;</p><p> ?。?)按
28、照已選擇的調(diào)度算法,將被喚醒進(jìn)程放入就緒隊(duì)列,并刷新就緒隊(duì)列表格,將進(jìn)程移出阻塞隊(duì)列。</p><p> 事件5、終止進(jìn)程;判斷是否有正在執(zhí)行的進(jìn)程,結(jié)束進(jìn)程,令runningProcess=null;</p><p><b> 系統(tǒng)實(shí)現(xiàn)</b></p><p><b> 開發(fā)工具及語(yǔ)言</b></p>
29、<p> 開發(fā)工具:myeclipse</p><p><b> 語(yǔ)言:java</b></p><p><b> 實(shí)現(xiàn)步驟</b></p><p> 步驟一:創(chuàng)建界面,初始化界面;</p><p> 步驟二:創(chuàng)建PCB,初始化PCB;</p><p>
30、 步驟三:創(chuàng)建鏈表,初始化鏈表;</p><p><b> 代碼</b></p><p> import java.awt.Color;</p><p> import java.awt.Container;</p><p> import java.awt.Font;</p><p>
31、 import java.awt.GridLayout;</p><p> import java.awt.event.ActionEvent;</p><p> import java.awt.event.ActionListener;</p><p> import java.awt.event.FocusAdapter;</p><
32、p> import java.awt.event.FocusEvent;</p><p> import java.awt.event.FocusListener;</p><p> import java.util.regex.Matcher;</p><p> import java.util.regex.Pattern;</p>&
33、lt;p> import javax.swing.BorderFactory;</p><p> import javax.swing.JButton;</p><p> import javax.swing.JComboBox;</p><p> import javax.swing.JFrame;</p><p> imp
34、ort javax.swing.JLabel;</p><p> import javax.swing.JOptionPane;</p><p> import javax.swing.JPanel;</p><p> import javax.swing.JScrollPane;</p><p> import javax.swin
35、g.JTable;</p><p> import javax.swing.JTextArea;</p><p> import javax.swing.ListSelectionModel;</p><p> public class JieMian extends Thread implements ActionListener {</p>
36、<p> public JFrame frame = new JFrame();</p><p> public Container cont = frame.getContentPane();</p><p> public JPanel top_pan=new JPanel();</p><p> public JPanel bottom_pa
37、n = new JPanel();//放ready_pan、ready_pan</p><p> public JPanel ready_pan=new JPanel(new GridLayout(1,0));//放就緒隊(duì)列表格的panel</p><p> public JPanel block_pan=new JPanel(new GridLayout(1,0));//放阻塞隊(duì)列表
38、格的panel</p><p> public JLabel top_lab = new JLabel();</p><p> public JLabel suanF_lab = new JLabel();//顯示采用的算法</p><p> public JLabel top_lab2 = new JLabel();</p><p>
39、 public JButton confirm_bn = new JButton();</p><p> public JButton ready_bn = new JButton();//就緒按鈕</p><p> public static JButton shutdown_bn = new JButton();//終止按鈕</p><p> publi
40、c static JButton runn_bn = new JButton();//執(zhí)行按鈕</p><p> public JButton block_bn = new JButton();//阻塞按鈕</p><p> public JButton wakeUp_bn = new JButton();//就緒按鈕</p><p> public JTex
41、tArea create_tx = new JTextArea();//創(chuàng)建進(jìn)程的文本框</p><p> public JButton create_bn = new JButton();//創(chuàng)建進(jìn)程的按鈕</p><p> public static JComboBox set_auto_manual=new JComboBox();//下拉框,選擇模式</p>
42、<p> public JLabel auto_manual_lab = new JLabel();//標(biāo)簽</p><p> public JComboBox suanFa=new JComboBox();//下拉框,選擇調(diào)度算法</p><p> public JButton suanFa_bn = new JButton();</p><p&
43、gt; public JComboBox sdept_com=new JComboBox();//下拉框,選擇進(jìn)程時(shí)間片</p><p> public JLabel time_lab = new JLabel();</p><p> public JComboBox priority=new JComboBox();//下拉框,選擇進(jìn)程優(yōu)先級(jí)</p><
44、p> public JLabel priority_lab = new JLabel();//優(yōu)先級(jí)標(biāo)簽</p><p> public JComboBox num=new JComboBox();//下拉框,選擇進(jìn)程輪轉(zhuǎn)次數(shù)</p><p> public JLabel num_lab = new JLabel();//輪轉(zhuǎn)次數(shù)標(biāo)簽</p><p>
45、 public JScrollPane scrollPane;//滾動(dòng)條</p><p> public JTable table; //表格</p><p> public String[] columnName = {"就緒隊(duì)列","優(yōu)先級(jí)"};</p><p> public Object[][
46、] data = new Object[12][2];</p><p> public ListSelectionModel cellSelectionModel;//就緒隊(duì)列的</p><p> public ListSelectionModel cellSelectionModel2;//阻塞隊(duì)列的</p><p> public JScrollPane
47、 scrollPane2;//滾動(dòng)條</p><p> public JTable table2; //表格</p><p> public String[] columnName2 = {"阻塞隊(duì)列"};</p><p> public Object[][] data2 = new Object[12][1];</
48、p><p> //用于判斷按鈕是否需要刷新的變量</p><p> int model1 = 0;//記錄當(dāng)前模式的前一個(gè)模式,0:初始值;1:自動(dòng)模式;2:手動(dòng)模式</p><p> int model2 = 0;//記錄當(dāng)前模</p><p> int algorithm = 0;//記錄選取的算法模式;0:初始值;1:先來(lái)先服務(wù);2
49、:優(yōu)先級(jí)算法</p><p> boolean flag = false;//記錄就緒隊(duì)列是否為空</p><p> public Process runningProcess = null;//記錄正在執(zhí)行的進(jìn)程</p><p> public boolean threadFlag = false;//記錄線程是否在執(zhí)行</p><
50、p> public boolean runStart = false;//記錄線程的run()函數(shù)是否開始了</p><p> public JieMian(){</p><p> this.initframe();</p><p><b> }</b></p><p><b> @Overri
51、de</b></p><p> public void actionPerformed(ActionEvent e) {</p><p> // TODO Auto-generated method stub</p><p> JButton bn=(JButton)e.getSource();</p><p> if(b
52、n == confirm_bn){</p><p> //選擇手動(dòng)模式或自動(dòng)模式</p><p> this.selectModel();</p><p> }else if(bn == suanFa_bn){//選擇算法</p><p> this.selectAlgorithm();</p><p> }
53、else if(bn==create_bn){//創(chuàng)建進(jìn)程</p><p> this.createProcess();</p><p> }else if(bn==block_bn){//阻塞進(jìn)程</p><p> this.blockProcess();</p><p> }else if(bn == wakeUp_bn){//喚
54、醒進(jìn)程</p><p> this.wakeUpProcess();</p><p> }else if(bn == shutdown_bn){//終止進(jìn)程</p><p> this.shutDownProcess();</p><p> }else if(bn == runn_bn){//執(zhí)行進(jìn)程 </p><
55、p> this.runProcess();</p><p> }else if(bn == ready_bn){//就緒</p><p> this.readyProcess();</p><p><b> }</b></p><p><b> }</b></p>&l
56、t;p> //選擇手動(dòng)或自動(dòng)模式</p><p> public void selectModel(){</p><p> create_bn.setEnabled(true);</p><p> //JOptionPane.showMessageDialog(frame, "選擇模式","asd", JOpti
57、onPane.WARNING_MESSAGE);</p><p> //判斷自動(dòng)模式還是手動(dòng)模式</p><p> if(String.valueOf((String)set_auto_manual.getSelectedItem()).equals("自動(dòng)")){//是自動(dòng)模式</p><p> model1 = model2;</
58、p><p> model2 = 1;</p><p> if(model1 == 0 || model1 == 2){//第一次選擇模式或者前一個(gè)模式是手動(dòng)模式</p><p> this.autoModel();</p><p><b> }</b></p><p> }else if(S
59、tring.valueOf((String)set_auto_manual.getSelectedItem()).equals("手動(dòng)")){</p><p> model1 = model2;</p><p> model2 = 2;//手動(dòng)模式</p><p> this.manualModel();</p><p&
60、gt;<b> }</b></p><p><b> }</b></p><p><b> //選擇算法</b></p><p> public void selectAlgorithm(){</p><p> if(String.valueOf((String)su
61、anFa.getSelectedItem()).equals("先來(lái)先服務(wù)")){//是先來(lái)先服務(wù)算法</p><p> algorithm = 1;</p><p> suanF_lab.setText("先來(lái)先服務(wù)");</p><p> }else if(String.valueOf((String)suanFa.
62、getSelectedItem()).equals("優(yōu)先級(jí)算法")){</p><p> algorithm = 2;</p><p> suanF_lab.setText("優(yōu)先級(jí)算法");</p><p> if(List.readyList.size() > 1){//如果就緒隊(duì)列不為空,調(diào)用排序函數(shù)<
63、;/p><p> this.paiXu();</p><p> this.refresh_ReadyList();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
64、<p> //當(dāng)"先來(lái)先服務(wù)算法"轉(zhuǎn)到“優(yōu)先級(jí)算法”,對(duì)就緒隊(duì)列按降序排序</p><p> public void paiXu(){</p><p> Process process;</p><p> int n=List.readyList.size();//得到就緒隊(duì)列的長(zhǎng)度</p><p>
65、 for(int i=1;i<=n-1;i++){//比較n-1輪</p><p> for(int j=0;j<=n-2;j++){</p><p> if(List.readyList.get(j).getPriority() < List.readyList.get(j+1).getPriority()){</p><p> proc
66、ess = List.readyList.get(j);</p><p> List.readyList.set(j, List.readyList.get(j+1));</p><p> List.readyList.set(j+1, process);</p><p><b> }</b></p><p>&l
67、t;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //進(jìn)入自動(dòng)模式</b></p><p> public void autoModel(){</p><p
68、> System.out.println("進(jìn)入自動(dòng)模式");</p><p> //判斷是否需要刷新按鈕</p><p> if(model1 != model2){//需要刷新</p><p> wakeUp_bn.setEnabled(true);</p><p> block_bn.setEnabl
69、ed(true);</p><p> shutdown_bn.setEnabled(false);</p><p> ready_bn.setEnabled(false);</p><p> runn_bn.setEnabled(false);</p><p> model1 = model2;</p><p>
70、;<b> }</b></p><p> if(runStart==false){</p><p> this.start();</p><p> runStart = true;</p><p><b> }</b></p><p> System.out.pr
71、intln("退出了自動(dòng)模式");</p><p><b> }</b></p><p> public void run(){</p><p> threadFlag = true;</p><p> System.out.println("線程開始");</p&g
72、t;<p> while(true){System.out.println("");</p><p> //當(dāng)就緒隊(duì)列不為空,取出第一個(gè)進(jìn)程執(zhí)行</p><p> if(model2 == 1){//是自動(dòng)模式</p><p> if(flag){//就緒隊(duì)列不為空</p><p><b>
73、 try{</b></p><p> if(runningProcess != null){//如果有正在被執(zhí)行的進(jìn)程,把進(jìn)程加入到就緒隊(duì)列</p><p> List.readyList.add(runningProcess);</p><p> this.refresh_ReadyList();//刷新就緒隊(duì)列的表格</p>&
74、lt;p> runningProcess = null; </p><p><b> }</b></p><p> runningProcess = List.readyList.getFirst();//取出第一個(gè)就緒進(jìn)程</p><p> top_lab2.setText("進(jìn)程 "+runningPr
75、ocess.getName()+".exe 正在執(zhí)行");</p><p> System.out.println(runningProcess.getName()+".exe"+"正在執(zhí)行");</p><p> List.readyList.removeFirst();//將第一個(gè)進(jìn)程移出就緒隊(duì)列</p>&
76、lt;p> this.refresh_ReadyList();//刷新就緒隊(duì)列的表格</p><p> Thread.sleep(runningProcess.getTime()*1000);</p><p> runningProcess.num--;//將進(jìn)程的輪轉(zhuǎn)次數(shù)減一 </p><p> if(runningProcess.num == 0)
77、{//如果輪轉(zhuǎn)次數(shù)等于0,則結(jié)束進(jìn)程</p><p> System.out.println("進(jìn)程"+runningProcess.getName()+"執(zhí)行完畢");</p><p> runningProcess = null;</p><p><b> }</b></p&g
78、t;<p> if(model2!=2){//線程睡眠期間沒(méi)有轉(zhuǎn)換到手動(dòng)模式</p><p> if(runningProcess!=null){//如果剛剛被執(zhí)行的進(jìn)程沒(méi)有被阻塞 ,就加入到就緒隊(duì)列</p><p> if(algorithm == 2){//如果采用了優(yōu)先級(jí)算法,則調(diào)用排序函數(shù)</p><p> this.paiXu(run
79、ningProcess);</p><p> }else if(algorithm == 1){//如果采用的是先來(lái)先服務(wù)算法,則直接將進(jìn)程添加到就緒隊(duì)列</p><p> List.readyList.add(runningProcess);</p><p><b> }</b></p><p> //List
80、.readyList.add(runningProcess);</p><p> this.refresh_ReadyList();//刷新就緒隊(duì)列的表格</p><p><b> }</b></p><p> runningProcess = null;</p><p> if(List.readyList.s
81、ize()==0){//判斷據(jù)需隊(duì)列是否為空</p><p> flag=false;</p><p> top_lab2.setText("就緒隊(duì)列為空");</p><p><b> }else{</b></p><p> flag=true;</p><p>&l
82、t;b> }</b></p><p><b> }</b></p><p> }catch(Exception e){}</p><p><b> }</b></p><p><b> }</b></p><p>
83、<b> }</b></p><p><b> }</b></p><p><b> //手動(dòng)模式</b></p><p> public void manualModel(){</p><p> System.out.println("進(jìn)入手動(dòng)模式&quo
84、t;);</p><p> //判斷是否需要刷新按鈕</p><p> if(model1 != model2){//需要刷新</p><p> ready_bn.setEnabled(true);</p><p> shutdown_bn.setEnabled(true);</p><p> block_b
85、n.setEnabled(true);</p><p> runn_bn.setEnabled(true);</p><p> wakeUp_bn.setEnabled(true);</p><p> model1 = model2; </p><p><b> }</b></p>&l
86、t;p> System.out.println("退出手動(dòng)模式");</p><p><b> }</b></p><p><b> //創(chuàng)建進(jìn)程的函數(shù)</b></p><p> public void createProcess(){</p><p> //先判
87、斷就緒隊(duì)列是否為滿</p><p> if(List.readyList.size()==11){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進(jìn)程失敗,就緒隊(duì)列已滿】","asd", JOptionPane.WARNING_MESSAGE);</p><p><
88、;b> return ;</b></p><p><b> }</b></p><p> String processName = create_tx.getText();//得到進(jìn)程名</p><p> //正則表達(dá)式驗(yàn)證進(jìn)程名</p><p> Pattern p=Pattern.comp
89、ile("^[A-Za-z0-9]+$"); </p><p> Matcher m=p.matcher(processName);</p><p> if(!m.matches()){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進(jìn)程失敗,進(jìn)程名只能由字母和數(shù)字組成】&qu
90、ot;,"asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p> //與正在執(zhí)行的進(jìn)程對(duì)比,判斷進(jìn)程名是否重復(fù)</p><p> if(running
91、Process != null){</p><p> if(runningProcess.getName().equals(processName)){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進(jìn)程失敗,進(jìn)程重名】","asd", JOptionPane.WARNING_MESSAGE)
92、;</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> //與就緒隊(duì)列中的進(jìn)程對(duì)比,判斷進(jìn)程名是否重復(fù)</p><p> for(int i=0;i&l
93、t;List.readyList.size();i++){//遍歷就緒隊(duì)列</p><p> if(processName.equals(List.readyList.get(i).name) ){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進(jìn)程失敗,進(jìn)程重名】","asd", JOpti
94、onPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> //與阻塞隊(duì)列中的進(jìn)程對(duì)比,判斷進(jìn)程名是否重復(fù)</p><
95、;p> for(int i=0;i<List.blockList.size();i++){//遍歷就緒隊(duì)列</p><p> if(processName.equals(List.blockList.get(i).name) ){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進(jìn)程失敗,進(jìn)程重名】"
96、,"asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> String Time = S
97、tring.valueOf((String)sdept_com.getSelectedItem());//得到時(shí)間片</p><p> String Priority = String.valueOf((String)priority.getSelectedItem());//得到優(yōu)先級(jí)</p><p> String Num = String.valueOf((String)num.
98、getSelectedItem());//得到輪轉(zhuǎn)次數(shù)</p><p> int processTime = Integer.parseInt(Time);</p><p> int processPriority = Integer.parseInt(Priority);</p><p> int processNum = Integer.parseInt(
99、Num);</p><p> Process process = new Process();</p><p> process.setName(processName);</p><p> process.setTime(processTime);</p><p> process.setPriority(processPriori
100、ty);</p><p> process.setNum(processNum);</p><p> if(algorithm == 2){//如果采用了優(yōu)先級(jí)算法,則調(diào)用排序函數(shù)</p><p> this.paiXu(process);</p><p> }else if(algorithm == 1){//如果采用的是先來(lái)先服務(wù)
101、算法,則直接將進(jìn)程添加到就緒隊(duì)列</p><p> List.readyList.addLast(process);//將進(jìn)程加入就緒隊(duì)列</p><p><b> }else{</b></p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進(jìn)程失敗,請(qǐng)選擇調(diào)度算法】",&
102、quot;asd", JOptionPane.WARNING_MESSAGE);</p><p><b> }</b></p><p> for(int i=0;i<List.readyList.size();i++){//遍歷就緒隊(duì)列,將進(jìn)程取到tab中</p><p> data[i][0]=List.readyLis
103、t.get(i).getName()+".exe";</p><p> data[i][1]=List.readyList.get(i).getPriority();</p><p><b> }</b></p><p> //刷新就緒隊(duì)列表格</p><p> ready_pan.add(s
104、crollPane);</p><p> flag=true;</p><p> if(model2 == 1){</p><p> if(threadFlag == false){this.start();}</p><p><b> }</b></p><p><b>
105、; }</b></p><p> //根據(jù)進(jìn)程優(yōu)先級(jí)算法,給就緒隊(duì)列的進(jìn)程排序,如果優(yōu)先級(jí)相同,按先來(lái)先服務(wù)的方式排序</p><p> public void paiXu(Process process){</p><p> if(List.readyList.size() == 0){//如果就緒隊(duì)列為空,直接添加進(jìn)程</p>
106、<p> List.readyList.add(process);</p><p> }else{//如果就緒隊(duì)列不為空</p><p> //進(jìn)程按照優(yōu)先級(jí)升序排序,將一個(gè)進(jìn)程插入升序排序的就緒隊(duì)列中去</p><p> int i,k=0;</p><p> for(i=0;i<List.readyList.si
107、ze();i++){</p><p> if(List.readyList.get(i).getPriority() < process.getPriority()){</p><p><b> break;</b></p><p><b> }</b></p><p><b>
108、; }</b></p><p> k=i;//要插入的位置 </p><p> List.readyList.addLast(List.readyList.get(List.readyList.size()-1));</p><p> for(i=List.readyList.size()-1;i>k;i--){</p>&l
109、t;p> List.readyList.set(i, List.readyList.get(i-1));//倒序移動(dòng)各進(jìn)程</p><p><b> }</b></p><p> List.readyList.set(k, process);</p><p><b> }</b></p><
110、;p><b> }</b></p><p> //手動(dòng)模式下執(zhí)行線程的函數(shù)</p><p> public void runProcess (){</p><p> //JOptionPane.showMessageDialog(frame, "執(zhí)行","asd", JOptionPane.
111、WARNING_MESSAGE);</p><p> if(flag){//當(dāng)就緒隊(duì)列不為空,取出第一個(gè)進(jìn)程執(zhí)行</p><p> //判斷是否有進(jìn)程正在執(zhí)行</p><p> if(runningProcess != null){</p><p><b> //有進(jìn)程正在執(zhí)行</b></p>&
112、lt;p> JOptionPane.showMessageDialog(frame, "執(zhí)行失敗!!!,有進(jìn)程正在執(zhí)行","asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p&
113、gt;<p> runningProcess = List.readyList.getFirst();//取出第一個(gè)就緒進(jìn)程</p><p> top_lab2.setText("進(jìn)程 "+runningProcess.getName()+".exe 正在執(zhí)行");</p><p> System.out.println(ru
114、nningProcess.getName()+".exe"+"正在執(zhí)行");</p><p> List.readyList.removeFirst();//將第一個(gè)進(jìn)程移出就緒隊(duì)列</p><p> this.refresh_ReadyList();//刷新就緒隊(duì)列的表格</p><p> if(List.readyL
115、ist.size()==0){//判斷據(jù)需隊(duì)列是否為空</p><p> flag=false;</p><p> //top_lab2.setText("就緒隊(duì)列為空");</p><p><b> }else{</b></p><p> flag=true;</p><
116、p><b> }</b></p><p><b> }else{</b></p><p> JOptionPane.showMessageDialog(frame, "執(zhí)行失敗!!!,沒(méi)有可執(zhí)行的進(jìn)程","asd", JOptionPane.WARNING_MESSAGE);</p>
117、<p><b> }</b></p><p><b> }</b></p><p> //在手動(dòng)模式下,使進(jìn)程就緒</p><p> public void readyProcess(){</p><p> //JOptionPane.showMessageDialog(fr
118、ame, "就緒","asd", JOptionPane.WARNING_MESSAGE);</p><p> //判斷是否有正在執(zhí)行的進(jìn)程</p><p> if(runningProcess == null){</p><p> JOptionPane.showMessageDialog(frame, "失
119、敗,沒(méi)有正在執(zhí)行的進(jìn)程","asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p> if(algorithm == 2){//如果采用了優(yōu)先級(jí)算法,則調(diào)用排序函數(shù)&l
120、t;/p><p> this.paiXu(runningProcess);</p><p> }else if(algorithm == 1){//如果采用的是先來(lái)先服務(wù)算法,則直接將進(jìn)程添加到就緒隊(duì)列</p><p> List.readyList.add(runningProcess);</p><p><b> }<
121、/b></p><p> this.refresh_ReadyList();//刷新就緒隊(duì)列的表格</p><p> runningProcess = null;</p><p> top_lab2.setText("");</p><p><b> }</b></p>&
122、lt;p><b> //阻塞進(jìn)程的函數(shù)</b></p><p> public void blockProcess(){</p><p> //JOptionPane.showMessageDialog(frame, "阻塞","asd", JOptionPane.WARNING_MESSAGE);</p>
123、;<p> //判斷是否有正在執(zhí)行的進(jìn)程</p><p> if(runningProcess == null){</p><p> JOptionPane.showMessageDialog(frame, "不可阻塞,沒(méi)有正在執(zhí)行的進(jìn)程","asd", JOptionPane.WARNING_MESSAGE);</p>
124、;<p><b> return;</b></p><p> }else if( List.blockList.size() == 11 ){//阻塞隊(duì)列已滿,不能阻塞 </p><p> JOptionPane.showMessageDialog(frame, "不可阻塞,阻塞隊(duì)列已滿","asd", JO
125、ptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }else{</b></p><p> System.out.println("進(jìn)程"+runningProcess.getName()+".exe&quo
126、t;+"被阻塞了");</p><p> List.blockList.add(runningProcess);//將正在執(zhí)行的進(jìn)程加到阻塞的隊(duì)列</p><p> this.refresh_BlockList();//刷新阻塞隊(duì)列的表格</p><p> runningProcess=null;</p><p>
127、 top_lab2.setText("");</p><p> if(List.readyList.size()==0){//判斷據(jù)需隊(duì)列是否為空</p><p> flag=false;</p><p> top_lab2.setText("就緒隊(duì)列為空");</p><p><b>
128、 }else{</b></p><p> flag=true;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //喚醒阻塞進(jìn)程
129、</b></p><p> public void wakeUpProcess(){</p><p> //JOptionPane.showMessageDialog(frame, "使進(jìn)程就緒","asd", JOptionPane.WARNING_MESSAGE);</p><p> //判斷阻塞隊(duì)列中是
130、否有進(jìn)程</p><p> if(List.blockList.size() == 0){</p><p> JOptionPane.showMessageDialog(frame, "沒(méi)有可喚醒的進(jìn)程","asd", JOptionPane.WARNING_MESSAGE);</p><p><b> ret
溫馨提示
- 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)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程管理系統(tǒng)
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程的創(chuàng)建
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì) (2)
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度模擬設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度程序設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論