

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 《操作系統(tǒng)原理》</b></p><p> 課 程 設(shè) 計 報 告 書</p><p> 題 目: 進程控制模塊 </p><p> 學 號: </p><p> 學生姓名: </p>
2、<p> 專 業(yè):計算機科學與技術(shù)卓越班</p><p> 指導教師: </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è)計2</b></p><p> 2.1. 總體設(shè)計2</p><p> 2.2. 詳細設(shè)計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)實現(xiàn)5</b></p><p> 3.1. 開發(fā)工具及語言5</p><p> 3.2. 實現(xiàn)步驟5</p><p><b> 3.3. 代碼5</b></p><p> 4. 系統(tǒng)測試與分析21</p><
5、;p><b> 5. 總結(jié)25</b></p><p><b> 系統(tǒng)功能</b></p><p> 實現(xiàn)進程調(diào)度算法選擇,有先來先服務(wù)調(diào)度算法和優(yōu)先級調(diào)度算法;</p><p><b> 實現(xiàn)進程的創(chuàng)建;</b></p><p><b> 實現(xiàn)進程
6、的終止;</b></p><p><b> 實現(xiàn)進程的阻塞;</b></p><p><b> 實現(xiàn)進程的喚醒;</b></p><p> 實現(xiàn)手動調(diào)度進程和進程自動執(zhí)行兩種模式;</p><p><b> 許可</b></p><p&g
7、t;<b> 時間片用完</b></p><p> I/O完成進程調(diào)度</p><p><b> I/O請求終止</b></p><p><b> 系統(tǒng)設(shè)計</b></p><p><b> 總體設(shè)計</b></p><p
8、> 定義3個類,JieMian類、Process類、List類。</p><p> JieMian類中布局程序界面,調(diào)用進程的創(chuàng)建、執(zhí)行、終止、阻塞、喚醒等函數(shù)。</p><p> Process類模擬進程,有3個變量,進程的名字 name、進程的時間片time、進程的優(yōu)先級priority,還有對這3個變量賦值和得到變量的值得get函數(shù)、set函數(shù)。</p>&
9、lt;p> List類有兩個變量,LinkedList<Process> readyList,就緒隊列;</p><p> LinkedList<Process> blockList,阻塞隊列。</p><p><b> 詳細設(shè)計</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ù),屬于庫函數(shù),重寫
11、該函數(shù),實現(xiàn)所有按鈕的事件的監(jiān)聽。</p><p> void selectModel():選擇手動或自動模式;</p><p> void selectAlgorithm():選擇調(diào)度算法的函數(shù);</p><p> void paiXu():當"先來先服務(wù)算法"轉(zhuǎn)到“優(yōu)先級算法”,對就緒隊列的進程按優(yōu)先級降序排序;</p>
12、<p> void autoModel():進入自動模式,刷新按鈕,啟動線程;</p><p> void run():線程類的線程函數(shù),實現(xiàn)自動執(zhí)行就緒隊列中的進程,將時間片用完的進程再放回到就緒隊列。</p><p> void manualModel():進入手動模式的函數(shù),刷新按鈕。</p><p> void createProcess(
13、):創(chuàng)建進程,當創(chuàng)建進程的條件不滿足時,提示錯誤,成功創(chuàng)建進程后,將進程按照先來先服務(wù)算法或優(yōu)先級算法將進程添加到就緒隊列,然后刷新就緒隊列的表格。</p><p> paiXu(Process process):根據(jù)進程優(yōu)先級算法,給就緒隊列的進程排序,如果優(yōu)先級相同,按先來先服務(wù)的方式排序;</p><p> void runProcess ():手動模式下,執(zhí)行進程的函數(shù),將就緒
14、隊列的第一進程取出執(zhí)行,并顯示正在被執(zhí)行的進程。</p><p> void readyProcess():手動模式下,讓正在執(zhí)行的進程結(jié)束執(zhí)行,再放回到就緒隊列。</p><p> void blockProcess():阻塞進程,將正在執(zhí)行的進程阻塞,進程被阻塞后放到阻塞隊列,然后刷新阻塞隊列的表格。</p><p> void wakeUpProcess
15、():喚醒阻塞隊列里的第一個阻塞的進程,將喚醒的進程按照先來先服務(wù)的算法或者優(yōu)先級算法放到就緒隊列中,并刷新就緒隊列的表格。</p><p> void shutDownProcess():終止進程,將正在執(zhí)行的進程終止。</p><p> void refresh_ReadyList():刷新就緒隊列表格,把就緒隊列里的就緒進程顯示在就緒隊列的表格中;</p><
16、p> void refresh_BlockList():刷新阻塞隊列表格,把阻塞隊列的阻塞進程顯示在阻塞隊列的表格中;</p><p> void main(String arg[]):主函數(shù),庫函數(shù),JieMian jm = new JieMian();實例化一個JieMian類的對象。</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> //進程類</b></p><p> public class Process {</p><p> public String name;//進程名</p><p> pu
18、blic int time;//時間</p><p> public int priority;//進程優(yōu)先級</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> 就緒隊列和阻塞隊列的數(shù)據(jù)結(jié)構(gòu)的定義</p><p> public class List {</p><p&g
24、t; static LinkedList<Process> readyList = new LinkedList<Process>();//就緒隊列</p><p> static LinkedList<Process> blockList = new LinkedList<Process>();//阻塞隊列</p><p><b&
25、gt; }</b></p><p><b> 算法</b></p><p> 采用自然語言、流程圖、N-S圖、偽代碼任一種描述。</p><p> 步驟1、選擇模式,否則不能開始程序;</p><p> 步驟2、選擇調(diào)度算法,否則不能創(chuàng)建進程;</p><p> 事件1、創(chuàng)
26、建進程;(1)輸入進程名字,名字要唯一,否則不能創(chuàng)建進程;選擇進程的時間片,默認時間片為1;選擇進程優(yōu)先級,默認優(yōu)先級為1;(2)判斷就緒隊列是否為空,若不為空則不能創(chuàng)建進程;(3)使用正則表達式驗證進程名是否合法,否則不能創(chuàng)建進程;(4)、創(chuàng)建進程成功,將進程插入就緒隊列,并在就緒隊列表格中顯示。</p><p> 事件2、執(zhí)行進程;(1)判斷就緒隊列是否為空,即是否有可執(zhí)行的進程;(2)、從就緒隊列取出一個
27、進程,賦值給runningProcess變量。</p><p> 事件3、阻塞進程;(1)判斷是否有正在執(zhí)行的進程;(2)、判斷阻塞隊列是否已滿;</p><p> 、滿足阻塞條件,將正在執(zhí)行的進程放入阻塞隊列;</p><p> 事件4、喚醒進程;(1)判斷是否有可喚醒的進程;(2)判斷就緒隊列是否已滿;</p><p> (3)按
28、照已選擇的調(diào)度算法,將被喚醒進程放入就緒隊列,并刷新就緒隊列表格,將進程移出阻塞隊列。</p><p> 事件5、終止進程;判斷是否有正在執(zhí)行的進程,結(jié)束進程,令runningProcess=null;</p><p><b> 系統(tǒng)實現(xiàn)</b></p><p><b> 開發(fā)工具及語言</b></p>
29、<p> 開發(fā)工具:myeclipse</p><p><b> 語言:java</b></p><p><b> 實現(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));//放就緒隊列表格的panel</p><p> public JPanel block_pan=new JPanel(new GridLayout(1,0));//放阻塞隊列表
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)建進程的文本框</p><p> public JButton create_bn = new JButton();//創(chuàng)建進程的按鈕</p><p> public static JComboBox set_auto_manual=new JComboBox();//下拉框,選擇模式</p>
42、<p> public JLabel auto_manual_lab = new JLabel();//標簽</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();//下拉框,選擇進程時間片</p><p> public JLabel time_lab = new JLabel();</p><p> public JComboBox priority=new JComboBox();//下拉框,選擇進程優(yōu)先級</p><
44、p> public JLabel priority_lab = new JLabel();//優(yōu)先級標簽</p><p> public JComboBox num=new JComboBox();//下拉框,選擇進程輪轉(zhuǎn)次數(shù)</p><p> public JLabel num_lab = new JLabel();//輪轉(zhuǎn)次數(shù)標簽</p><p>
45、 public JScrollPane scrollPane;//滾動條</p><p> public JTable table; //表格</p><p> public String[] columnName = {"就緒隊列","優(yōu)先級"};</p><p> public Object[][
46、] data = new Object[12][2];</p><p> public ListSelectionModel cellSelectionModel;//就緒隊列的</p><p> public ListSelectionModel cellSelectionModel2;//阻塞隊列的</p><p> public JScrollPane
47、 scrollPane2;//滾動條</p><p> public JTable table2; //表格</p><p> public String[] columnName2 = {"阻塞隊列"};</p><p> public Object[][] data2 = new Object[12][1];</
48、p><p> //用于判斷按鈕是否需要刷新的變量</p><p> int model1 = 0;//記錄當前模式的前一個模式,0:初始值;1:自動模式;2:手動模式</p><p> int model2 = 0;//記錄當前模</p><p> int algorithm = 0;//記錄選取的算法模式;0:初始值;1:先來先服務(wù);2
49、:優(yōu)先級算法</p><p> boolean flag = false;//記錄就緒隊列是否為空</p><p> public Process runningProcess = null;//記錄正在執(zhí)行的進程</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> //選擇手動模式或自動模式</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)建進程</p><p> this.createProcess();</p><p> }else if(bn==block_bn){//阻塞進程</p><p> this.blockProcess();</p><p> }else if(bn == wakeUp_bn){//喚
54、醒進程</p><p> this.wakeUpProcess();</p><p> }else if(bn == shutdown_bn){//終止進程</p><p> this.shutDownProcess();</p><p> }else if(bn == runn_bn){//執(zhí)行進程 </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> //選擇手動或自動模式</p><p> public void selectModel(){</p><p> create_bn.setEnabled(true);</p><p> //JOptionPane.showMessageDialog(frame, "選擇模式","asd", JOpti
57、onPane.WARNING_MESSAGE);</p><p> //判斷自動模式還是手動模式</p><p> if(String.valueOf((String)set_auto_manual.getSelectedItem()).equals("自動")){//是自動模式</p><p> model1 = model2;</
58、p><p> model2 = 1;</p><p> if(model1 == 0 || model1 == 2){//第一次選擇模式或者前一個模式是手動模式</p><p> this.autoModel();</p><p><b> }</b></p><p> }else if(S
59、tring.valueOf((String)set_auto_manual.getSelectedItem()).equals("手動")){</p><p> model1 = model2;</p><p> model2 = 2;//手動模式</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("先來先服務(wù)")){//是先來先服務(wù)算法</p><p> algorithm = 1;</p><p> suanF_lab.setText("先來先服務(wù)");</p><p> }else if(String.valueOf((String)suanFa.
62、getSelectedItem()).equals("優(yōu)先級算法")){</p><p> algorithm = 2;</p><p> suanF_lab.setText("優(yōu)先級算法");</p><p> if(List.readyList.size() > 1){//如果就緒隊列不為空,調(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> //當"先來先服務(wù)算法"轉(zhuǎn)到“優(yōu)先級算法”,對就緒隊列按降序排序</p><p> public void paiXu(){</p><p> Process process;</p><p> int n=List.readyList.size();//得到就緒隊列的長度</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> //進入自動模式</b></p><p> public void autoModel(){</p><p
68、> System.out.println("進入自動模式");</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("退出了自動模式");</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> //當就緒隊列不為空,取出第一個進程執(zhí)行</p><p> if(model2 == 1){//是自動模式</p><p> if(flag){//就緒隊列不為空</p><p><b>
73、 try{</b></p><p> if(runningProcess != null){//如果有正在被執(zhí)行的進程,把進程加入到就緒隊列</p><p> List.readyList.add(runningProcess);</p><p> this.refresh_ReadyList();//刷新就緒隊列的表格</p>&
74、lt;p> runningProcess = null; </p><p><b> }</b></p><p> runningProcess = List.readyList.getFirst();//取出第一個就緒進程</p><p> top_lab2.setText("進程 "+runningPr
75、ocess.getName()+".exe 正在執(zhí)行");</p><p> System.out.println(runningProcess.getName()+".exe"+"正在執(zhí)行");</p><p> List.readyList.removeFirst();//將第一個進程移出就緒隊列</p>&
76、lt;p> this.refresh_ReadyList();//刷新就緒隊列的表格</p><p> Thread.sleep(runningProcess.getTime()*1000);</p><p> runningProcess.num--;//將進程的輪轉(zhuǎn)次數(shù)減一 </p><p> if(runningProcess.num == 0)
77、{//如果輪轉(zhuǎn)次數(shù)等于0,則結(jié)束進程</p><p> System.out.println("進程"+runningProcess.getName()+"執(zhí)行完畢");</p><p> runningProcess = null;</p><p><b> }</b></p&g
78、t;<p> if(model2!=2){//線程睡眠期間沒有轉(zhuǎn)換到手動模式</p><p> if(runningProcess!=null){//如果剛剛被執(zhí)行的進程沒有被阻塞 ,就加入到就緒隊列</p><p> if(algorithm == 2){//如果采用了優(yōu)先級算法,則調(diào)用排序函數(shù)</p><p> this.paiXu(run
79、ningProcess);</p><p> }else if(algorithm == 1){//如果采用的是先來先服務(wù)算法,則直接將進程添加到就緒隊列</p><p> List.readyList.add(runningProcess);</p><p><b> }</b></p><p> //List
80、.readyList.add(runningProcess);</p><p> this.refresh_ReadyList();//刷新就緒隊列的表格</p><p><b> }</b></p><p> runningProcess = null;</p><p> if(List.readyList.s
81、ize()==0){//判斷據(jù)需隊列是否為空</p><p> flag=false;</p><p> top_lab2.setText("就緒隊列為空");</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> //手動模式</b></p><p> public void manualModel(){</p><p> System.out.println("進入手動模式&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("退出手動模式");</p><p><b> }</b></p><p><b> //創(chuàng)建進程的函數(shù)</b></p><p> public void createProcess(){</p><p> //先判
87、斷就緒隊列是否為滿</p><p> if(List.readyList.size()==11){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進程失敗,就緒隊列已滿】","asd", JOptionPane.WARNING_MESSAGE);</p><p><
88、;b> return ;</b></p><p><b> }</b></p><p> String processName = create_tx.getText();//得到進程名</p><p> //正則表達式驗證進程名</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)建進程失敗,進程名只能由字母和數(shù)字組成】&qu
90、ot;,"asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p> //與正在執(zhí)行的進程對比,判斷進程名是否重復</p><p> if(running
91、Process != null){</p><p> if(runningProcess.getName().equals(processName)){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進程失敗,進程重名】","asd", JOptionPane.WARNING_MESSAGE)
92、;</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> //與就緒隊列中的進程對比,判斷進程名是否重復</p><p> for(int i=0;i&l
93、t;List.readyList.size();i++){//遍歷就緒隊列</p><p> if(processName.equals(List.readyList.get(i).name) ){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進程失敗,進程重名】","asd", JOpti
94、onPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> //與阻塞隊列中的進程對比,判斷進程名是否重復</p><
95、;p> for(int i=0;i<List.blockList.size();i++){//遍歷就緒隊列</p><p> if(processName.equals(List.blockList.get(i).name) ){</p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進程失敗,進程重名】"
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());//得到時間片</p><p> String Priority = String.valueOf((String)priority.getSelectedItem());//得到優(yōu)先級</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)先級算法,則調(diào)用排序函數(shù)</p><p> this.paiXu(process);</p><p> }else if(algorithm == 1){//如果采用的是先來先服務(wù)
101、算法,則直接將進程添加到就緒隊列</p><p> List.readyList.addLast(process);//將進程加入就緒隊列</p><p><b> }else{</b></p><p> JOptionPane.showMessageDialog(frame, "【創(chuàng)建進程失敗,請選擇調(diào)度算法】",&
102、quot;asd", JOptionPane.WARNING_MESSAGE);</p><p><b> }</b></p><p> for(int i=0;i<List.readyList.size();i++){//遍歷就緒隊列,將進程取到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> //刷新就緒隊列表格</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ù)進程優(yōu)先級算法,給就緒隊列的進程排序,如果優(yōu)先級相同,按先來先服務(wù)的方式排序</p><p> public void paiXu(Process process){</p><p> if(List.readyList.size() == 0){//如果就緒隊列為空,直接添加進程</p>
106、<p> List.readyList.add(process);</p><p> }else{//如果就緒隊列不為空</p><p> //進程按照優(yōu)先級升序排序,將一個進程插入升序排序的就緒隊列中去</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));//倒序移動各進程</p><p><b> }</b></p><p> List.readyList.set(k, process);</p><p><b> }</b></p><
110、;p><b> }</b></p><p> //手動模式下執(zhí)行線程的函數(shù)</p><p> public void runProcess (){</p><p> //JOptionPane.showMessageDialog(frame, "執(zhí)行","asd", JOptionPane.
111、WARNING_MESSAGE);</p><p> if(flag){//當就緒隊列不為空,取出第一個進程執(zhí)行</p><p> //判斷是否有進程正在執(zhí)行</p><p> if(runningProcess != null){</p><p><b> //有進程正在執(zhí)行</b></p>&
112、lt;p> JOptionPane.showMessageDialog(frame, "執(zhí)行失敗!!!,有進程正在執(zhí)行","asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p&
113、gt;<p> runningProcess = List.readyList.getFirst();//取出第一個就緒進程</p><p> top_lab2.setText("進程 "+runningProcess.getName()+".exe 正在執(zhí)行");</p><p> System.out.println(ru
114、nningProcess.getName()+".exe"+"正在執(zhí)行");</p><p> List.readyList.removeFirst();//將第一個進程移出就緒隊列</p><p> this.refresh_ReadyList();//刷新就緒隊列的表格</p><p> if(List.readyL
115、ist.size()==0){//判斷據(jù)需隊列是否為空</p><p> flag=false;</p><p> //top_lab2.setText("就緒隊列為空");</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í)行失敗!!!,沒有可執(zhí)行的進程","asd", JOptionPane.WARNING_MESSAGE);</p>
117、<p><b> }</b></p><p><b> }</b></p><p> //在手動模式下,使進程就緒</p><p> public void readyProcess(){</p><p> //JOptionPane.showMessageDialog(fr
118、ame, "就緒","asd", JOptionPane.WARNING_MESSAGE);</p><p> //判斷是否有正在執(zhí)行的進程</p><p> if(runningProcess == null){</p><p> JOptionPane.showMessageDialog(frame, "失
119、敗,沒有正在執(zhí)行的進程","asd", JOptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p> if(algorithm == 2){//如果采用了優(yōu)先級算法,則調(diào)用排序函數(shù)&l
120、t;/p><p> this.paiXu(runningProcess);</p><p> }else if(algorithm == 1){//如果采用的是先來先服務(wù)算法,則直接將進程添加到就緒隊列</p><p> List.readyList.add(runningProcess);</p><p><b> }<
121、/b></p><p> this.refresh_ReadyList();//刷新就緒隊列的表格</p><p> runningProcess = null;</p><p> top_lab2.setText("");</p><p><b> }</b></p>&
122、lt;p><b> //阻塞進程的函數(shù)</b></p><p> public void blockProcess(){</p><p> //JOptionPane.showMessageDialog(frame, "阻塞","asd", JOptionPane.WARNING_MESSAGE);</p>
123、;<p> //判斷是否有正在執(zhí)行的進程</p><p> if(runningProcess == null){</p><p> JOptionPane.showMessageDialog(frame, "不可阻塞,沒有正在執(zhí)行的進程","asd", JOptionPane.WARNING_MESSAGE);</p>
124、;<p><b> return;</b></p><p> }else if( List.blockList.size() == 11 ){//阻塞隊列已滿,不能阻塞 </p><p> JOptionPane.showMessageDialog(frame, "不可阻塞,阻塞隊列已滿","asd", JO
125、ptionPane.WARNING_MESSAGE);</p><p><b> return;</b></p><p><b> }else{</b></p><p> System.out.println("進程"+runningProcess.getName()+".exe&quo
126、t;+"被阻塞了");</p><p> List.blockList.add(runningProcess);//將正在執(zhí)行的進程加到阻塞的隊列</p><p> this.refresh_BlockList();//刷新阻塞隊列的表格</p><p> runningProcess=null;</p><p>
127、 top_lab2.setText("");</p><p> if(List.readyList.size()==0){//判斷據(jù)需隊列是否為空</p><p> flag=false;</p><p> top_lab2.setText("就緒隊列為空");</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> //喚醒阻塞進程
129、</b></p><p> public void wakeUpProcess(){</p><p> //JOptionPane.showMessageDialog(frame, "使進程就緒","asd", JOptionPane.WARNING_MESSAGE);</p><p> //判斷阻塞隊列中是
130、否有進程</p><p> if(List.blockList.size() == 0){</p><p> JOptionPane.showMessageDialog(frame, "沒有可喚醒的進程","asd", JOptionPane.WARNING_MESSAGE);</p><p><b> ret
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)進程調(diào)度課程設(shè)計
- 操作系統(tǒng)進程調(diào)度課程設(shè)計
- 操作系統(tǒng)模擬進程課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---進程管理系統(tǒng)
- 進程調(diào)度算法 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計---進程的創(chuàng)建
- 操作系統(tǒng)進程調(diào)度課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計--進程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計-進程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計---進程調(diào)度算法
- 進程調(diào)度算法操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--進程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 進程調(diào)度算法操作系統(tǒng)課程設(shè)計 (2)
- 操作系統(tǒng)課程設(shè)計——進程調(diào)度模擬算法
- 操作系統(tǒng)_進程調(diào)度算法課程設(shè)計報告
- 操作系統(tǒng)課程設(shè)計——進程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計---進程調(diào)度模擬設(shè)計
- 操作系統(tǒng)課程設(shè)計--進程調(diào)度程序設(shè)計
評論
0/150
提交評論