操作系統(tǒng)進(jìn)程控制課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論