2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩25頁(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)課程設(shè)計(jì)</b></p><p>  題目: 操作系統(tǒng)課程設(shè)計(jì) </p><p>  學(xué) 院 工商學(xué)院 </p><p>  學(xué) 部 信息科學(xué)與工程 </p><p>  專 業(yè) 計(jì)算機(jī)類

2、 </p><p>  學(xué) 號(hào) </p><p>  姓 名 </p><p>  指導(dǎo)教師 </p><p>  2016 年 6 月 24 日</p><

3、;p><b>  目 錄</b></p><p><b>  目 錄2</b></p><p><b>  一、引言1</b></p><p>  1.1課程設(shè)計(jì)目的1</p><p>  1.2課程設(shè)計(jì)內(nèi)容1</p><p>  1.

4、3小組人數(shù)及編程語(yǔ)言1</p><p><b>  二、需求分析2</b></p><p><b>  設(shè)備管理2</b></p><p>  2.1設(shè)計(jì)任務(wù)................................................................................

5、..........................................2</p><p>  2.2設(shè)計(jì)要求..........................................................................................................................2</p><p>  三

6、 算法及數(shù)據(jù)結(jié)構(gòu)2</p><p>  3.1算法的總體思想(流程)3</p><p>  3.2 Equipment模塊3</p><p>  3.2.1 功能3</p><p>  3.2.2 數(shù)據(jù)結(jié)構(gòu)3</p><p>  3.3 cpu模塊4</p><p>  3.3.1

7、功能4</p><p>  3.3.2 數(shù)據(jù)結(jié)構(gòu)4</p><p>  3.3.3 算法5</p><p>  3.4 form1模塊5</p><p>  3.4.1 功能5</p><p>  3.4.2 算法6</p><p>  四、程序設(shè)計(jì)及實(shí)驗(yàn)6</p>

8、<p><b>  五、總結(jié)和討論9</b></p><p>  六、代碼……………………………………………………………………………………………10</p><p><b>  一、引言</b></p><p><b>  1.1課程設(shè)計(jì)目的</b></p><p>

9、;  通過(guò)模擬操作系統(tǒng)的實(shí)現(xiàn),加深對(duì)操作系統(tǒng)工作原理理解,進(jìn)一步了解操作系統(tǒng)的實(shí)現(xiàn)方法,并可練習(xí)合作完成系統(tǒng)的團(tuán)隊(duì)精神和提高程序設(shè)計(jì)能力。</p><p><b>  1.2課程設(shè)計(jì)內(nèi)容</b></p><p>  模擬采用多道程序設(shè)計(jì)方法的單用戶操作系統(tǒng),該操作系統(tǒng)包括進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理、文件管理和用戶接口四部分。</p><p>

10、<b>  1.3小組人數(shù)</b></p><p><b>  小組人員:趙林華</b></p><p><b>  張銘</b></p><p><b>  二、需求分析</b></p><p><b>  設(shè)備管理</b><

11、/p><p>  設(shè)備管理設(shè)備管理主要包括設(shè)備的分配和回收。模擬系統(tǒng)中有鼠標(biāo)、鍵盤、打印機(jī)和視頻四種設(shè)備,采用安全分配方式。設(shè)備采用設(shè)備狀態(tài)的變化還有設(shè)備顏色的變化來(lái)判斷設(shè)備所處的狀態(tài),當(dāng)創(chuàng)建文件是就指明了要調(diào)用的設(shè)備,讓后等進(jìn)程運(yùn)行時(shí)來(lái)知道調(diào)用的什么設(shè)備,最后顏色和狀態(tài)的變化來(lái)反應(yīng)調(diào)用的設(shè)備與每個(gè)設(shè)備所處的狀態(tài)。設(shè)備用JButton圖標(biāo)顯示,通過(guò)灰色和可見(jiàn)色判斷是否被調(diào)用</p><p>&

12、lt;b>  2.1設(shè)計(jì)任務(wù)</b></p><p>  設(shè)計(jì)一個(gè)設(shè)備管理分配程序,按先來(lái)先服務(wù)的算法,對(duì)設(shè)備進(jìn)行分配。</p><p><b>  2.2設(shè)計(jì)要求</b></p><p>  設(shè)備管理主要包括設(shè)備的分配和回收。</p><p>  (1)模擬系統(tǒng)中有A、B、C三種獨(dú)占型設(shè)備,A設(shè)備3個(gè)

13、,B設(shè)備2個(gè),C設(shè)備1個(gè)。</p><p>  (2)因?yàn)槟M系統(tǒng)比較小,因此只要設(shè)備表設(shè)計(jì)合理即可。</p><p>  (3)采用先來(lái)先服務(wù)分配策略,采用設(shè)備的安全分配方式。</p><p><b>  (4)屏幕顯示</b></p><p><b>  三、算法及設(shè)計(jì)結(jié)構(gòu)</b></p&

14、gt;<p>  3.1算法的總體思想(流程)</p><p>  設(shè)備管理的功能是按照設(shè)備的類型和系統(tǒng)采用的分配策略,為請(qǐng)求I/O進(jìn)程分配一條傳輸信息的完整通路。合理的控制I/O的控制過(guò)程,可最大限度的實(shí)現(xiàn)CPU與設(shè)備、設(shè)備與設(shè)備之間的并行工作。</p><p>  1.監(jiān)視所有設(shè)備。為了能對(duì)設(shè)備實(shí)施有效的分配和控制,系統(tǒng)能獲取設(shè)備的狀態(tài)。設(shè)備狀態(tài)保存在設(shè)備控制表(Devi

15、ceTable)中,并動(dòng)態(tài)的記錄狀態(tài)的變化及有關(guān)信息。</p><p>  2.制定分配策略。按先來(lái)先服務(wù)的算法,進(jìn)行設(shè)備分配。</p><p>  3.設(shè)備的分配。把設(shè)備分配給進(jìn)程。</p><p>  4.設(shè)備回收。當(dāng)進(jìn)程運(yùn)行完畢后,要釋放設(shè)備,則系統(tǒng)必須回收,一邊其他進(jìn)程使用。</p><p><b>  圖3.1</b

16、></p><p>  3.2 Equipment模塊</p><p><b>  3.2.1 功能</b></p><p>  記錄設(shè)備的狀態(tài)及相關(guān)信息</p><p><b>  檢查設(shè)備是否被調(diào)用</b></p><p><b>  對(duì)設(shè)備進(jìn)行分配<

17、;/b></p><p>  進(jìn)程結(jié)束對(duì)設(shè)備進(jìn)行回收</p><p>  3.2.2 數(shù)據(jù)結(jié)構(gòu)</p><p>  一個(gè)DeviceTable類、一個(gè)DeviceTable函數(shù)。</p><p>  DeviceTable是設(shè)備分配表,說(shuō)明設(shè)備的分配狀況,是否被占用。</p><p>  Device類說(shuō)明了設(shè)備

18、是如何使用的。每個(gè)設(shè)備是否被使用,哪個(gè)進(jìn)程在使用該設(shè)備,哪些進(jìn)程在等待使用該設(shè)備。</p><p><b>  3.3 cpu模塊</b></p><p><b>  3.3.1 功能</b></p><p>  進(jìn)程對(duì)設(shè)備的調(diào)用,當(dāng)進(jìn)程使用設(shè)備時(shí),檢查設(shè)備是否空閑。如果空閑,則調(diào)用該設(shè)備;如果設(shè)備正被使用,則將該進(jìn)程阻塞

19、到該設(shè)備的阻塞隊(duì)列中,等到設(shè)備空閑時(shí),再被喚醒,調(diào)用設(shè)備。</p><p>  3.3.2 數(shù)據(jù)結(jié)構(gòu)</p><p>  一個(gè)設(shè)備的枚舉類型DeviceType,一個(gè)cpu函數(shù)。</p><p>  Cpu函數(shù)中調(diào)用Equipment模塊中的函數(shù)對(duì)設(shè)備進(jìn)行檢測(cè)。如果設(shè)備空閑,就調(diào)用該設(shè)備;如果設(shè)備真在被使用,則該進(jìn)程被阻塞到該設(shè)備的阻塞隊(duì)列中。</p>

20、<p><b>  3.3.3 算法</b></p><p>  通過(guò)調(diào)用Equipment模塊中的函數(shù)對(duì)設(shè)背進(jìn)行檢測(cè):如果設(shè)備空閑,則使用該設(shè)備;如果設(shè)備正在工作,則進(jìn)程被阻塞。</p><p>  3.4 form1模塊</p><p><b>  3.4.1 功能</b></p><p

21、><b>  界面管理</b></p><p>  啟動(dòng)進(jìn)程,如果要使用設(shè)備,按先來(lái)先服務(wù)的算法調(diào)用設(shè)備。此模塊中有一個(gè)設(shè)備調(diào)用函數(shù)public int Allocate(DeviceType type),根據(jù)設(shè)備的物理名調(diào)用設(shè)備,并將信息顯示顯示到界面中。</p><p><b>  3.4.2 算法</b></p><

22、;p>  先來(lái)先服務(wù)(FCFS, First Come First Service)分配算法:</p><p>  每一設(shè)備有一隊(duì)列管理,當(dāng)多個(gè)作業(yè)或任務(wù)對(duì)同一設(shè)備提出I/O請(qǐng)求時(shí),該算法把請(qǐng)求的先后次序排成一個(gè)等待該設(shè)備的隊(duì)列,設(shè)備分配程序把設(shè)備分配給隊(duì)列中的第一各作業(yè)。</p><p><b>  四、程序設(shè)計(jì)與實(shí)驗(yàn)</b></p><p

23、>  對(duì)著目錄節(jié)點(diǎn)點(diǎn)擊右鍵可以添加執(zhí)行文件,文本文件和新目錄</p><p>  點(diǎn)擊新建執(zhí)行文件,輸入文件名稱</p><p>  彈出內(nèi)容窗口,輸入內(nèi)容,然后退出保存,同時(shí)也可以用菜單欄編輯選項(xiàng)</p><p>  點(diǎn)擊是以后,創(chuàng)建成功,執(zhí)行文件擴(kuò)展名為.exe,此時(shí)磁盤顯示占用:</p><p><b>  磁盤情況&l

24、t;/b></p><p>  這是創(chuàng)建文件的過(guò)程就結(jié)束了。</p><p><b>  圖4-1</b></p><p>  進(jìn)程調(diào)用設(shè)備。先調(diào)用A類設(shè)備, A類設(shè)備一共有三個(gè),如果有空閑的設(shè)備,則進(jìn)程就可調(diào)用;否則將進(jìn)程阻塞到設(shè)備A的阻塞隊(duì)列中,等待設(shè)備,等到A類設(shè)備有空閑設(shè)備時(shí),就喚醒該進(jìn)程,在斷點(diǎn)處繼續(xù)進(jìn)行程序。再調(diào)用B類設(shè)備,

25、B類設(shè)備一共有兩個(gè),如果有空閑的設(shè)備,則進(jìn)程就可調(diào)用;否則將進(jìn)程阻塞到設(shè)備B的阻塞隊(duì)列中,等待設(shè)備,等到B類設(shè)備有空閑設(shè)備時(shí),就喚醒該進(jìn)程,在斷點(diǎn)處繼續(xù)進(jìn)行程序。最后調(diào)用C類設(shè)備, C類設(shè)備只有一個(gè),C設(shè)備是臨界資源,如果C設(shè)備空閑,則進(jìn)程就可調(diào)用;否則將進(jìn)程阻塞到設(shè)備C的阻塞隊(duì)列中,等待設(shè)備,等到C設(shè)備空閑,就喚醒該進(jìn)程,在斷點(diǎn)處繼續(xù)進(jìn)行程序。</p><p><b>  五、總結(jié)和討論</b&

26、gt;</p><p>  設(shè)備管理主要監(jiān)視所有設(shè)備的狀態(tài),制定分配策略,完成設(shè)備的分配回收,合理的控制I/O的控制過(guò)程,最大限度的實(shí)現(xiàn)CPU與設(shè)備、設(shè)備與設(shè)備之間的把并行工作。</p><p>  通過(guò)對(duì)這次操作系統(tǒng)課程設(shè)計(jì)的親自參與和操作,使我深刻體會(huì)到了:只要你想做只要你想學(xué)沒(méi)有弄不懂得事情,工程里面也不能不在乎細(xì)節(jié),等等。感覺(jué)很受益匪淺。懂得了操作系統(tǒng)包括的四部分內(nèi)容:文件管理和用

27、戶接口、存儲(chǔ)管理、設(shè)備管理、進(jìn)程管理之間的內(nèi)在聯(lián)系。加深了我對(duì)這門課程的理解。鍛煉了自己在考慮全局也不是細(xì)節(jié)的能力。通過(guò)這次實(shí)驗(yàn),再一次熟悉并深入掌握了程序設(shè)計(jì)語(yǔ)言和界面設(shè)計(jì)。同時(shí),我也深深體會(huì)到了團(tuán)隊(duì)的重要性,如果沒(méi)有同組人的互相鼓勵(lì)和督促我跟本不能很快的完成任務(wù)。一滴水的力量是有限的,但匯聚成溪流將是美麗的。雖然我們每個(gè)人的力量都是有限的,但是激烈的討論、相互的鼓勵(lì)使我們?cè)趯?shí)踐中成長(zhǎng)。感謝和我一起面對(duì)的同伴們,因?yàn)橛心銈兾也抛兊们趭^

28、。更感謝給予我們諄諄教導(dǎo)的老師,在我們猶豫困惑時(shí)給予我們指導(dǎo),謝謝您!</p><p>  通過(guò)java的Swing編程,簡(jiǎn)單的模擬了一下操作系統(tǒng),部分功能并不完善,希望在之后的日子里可以做的更好;</p><p>  充分的體現(xiàn)的面相對(duì)象的思想,簡(jiǎn)單的通過(guò)時(shí)間片輪轉(zhuǎn)的調(diào)度算法實(shí)現(xiàn)操作系統(tǒng)的進(jìn)程模塊</p><p>  小組成員的充分配合,分工合作共同完成一個(gè)項(xiàng)目的

29、團(tuán)結(jié)協(xié)作精神</p><p><b>  六、代碼</b></p><p><b>  程序代碼</b></p><p>  using System;</p><p>  using System.Collections.Generic;</p><p>  using S

30、ystem.Text;</p><p>  using System.Windows.Forms;</p><p>  namespace OS.ClassFolder</p><p><b>  {</b></p><p>  public enum Interrupt</p><p><

31、b>  {</b></p><p><b>  IO,</b></p><p><b>  End,</b></p><p><b>  No</b></p><p><b>  }</b></p><p>  p

32、ublic enum ProcessState</p><p><b>  {</b></p><p><b>  Block,</b></p><p><b>  Ready,</b></p><p><b>  Execute,</b></p&g

33、t;<p><b>  White</b></p><p><b>  }</b></p><p>  public enum DeviceType</p><p><b>  {</b></p><p><b>  a,</b></p

34、><p><b>  b,</b></p><p><b>  c,</b></p><p><b>  no</b></p><p>  } </p><p>  public struct PCB</p><p>

35、<b>  {</b></p><p>  public int ProcessID; //進(jìn)程塊的編號(hào)(0-9)</p><p>  public string ProcessName; //使用該進(jìn)程塊的進(jìn)程名</p><p>  public i

36、nt PageAdress; //頁(yè)表的首地址</p><p>  public int Sum; //頁(yè)表的長(zhǎng)度 </p><p>  public int PC; //各個(gè)寄存器的狀態(tài)</p>

37、;<p>  public string IR;</p><p>  public int DR;</p><p>  public Interrupt PSW;</p><p>  public int Pri; //優(yōu)先級(jí)</p><p>  public in

38、t WaitTime; //要使用設(shè)備多長(zhǎng)時(shí)間</p><p>  public int GetDeviceTime; //獲得設(shè)備的時(shí)間</p><p>  public int ExecuteTime; //開(kāi)始執(zhí)行的時(shí)間</p>

39、<p>  public DeviceType NeedDevice; //申請(qǐng)失敗的設(shè)備類型</p><p>  public DeviceType HaveDevice; //正在使用的設(shè)備類型</p><p>  public int DN;

40、 //使用的是哪個(gè)設(shè)備</p><p>  public string BlockReason; //阻塞的原因</p><p>  public int Next;</p><p><b>  }</b></p><p><b>  class CPU<

41、/b></p><p><b>  {</b></p><p>  public int PC;</p><p>  public int DR;</p><p>  public string IR;</p><p>  public Interrupt PSW;</p>

42、<p>  public Interrupt PSW1;</p><p>  public PCB[] PCBArray=new PCB[10];</p><p>  public DateTime XTTime;</p><p>  public int XDTime;</p><p>  public int White;//空

43、白</p><p>  public int Ready;//就緒</p><p>  public int Block;//阻塞</p><p>  public int Execute;//執(zhí)行</p><p>  private DeviceType type;</p><p>  private int tim

44、e;</p><p>  public OS.ClassFolder.MainRam ram = new MainRam();</p><p>  public OS.ClassFolder.Device Dev = new Device();</p><p>  private void Init()</p><p><b>  

45、{</b></p><p><b>  //</b></p><p><b>  //初始化PCB塊</b></p><p><b>  //</b></p><p>  White = 0;</p><p>  Ready =Block=E

46、xecute=10;</p><p>  for (int i = 0; i < 10; i++)</p><p><b>  {</b></p><p>  PCBArray[i].ProcessID = i;</p><p>  PCBArray[i].Next = i + 1;</p><

47、p><b>  }</b></p><p><b>  //</b></p><p><b>  //初始化寄存器</b></p><p><b>  //</b></p><p><b>  PC = 0;</b></p

48、><p>  PSW = Interrupt.No;</p><p>  PSW1 = Interrupt.No;</p><p><b>  IR = "";</b></p><p><b>  //</b></p><p><b>  //初始化

49、時(shí)間</b></p><p><b>  //</b></p><p>  XTTime = Convert.ToDateTime("00:00:00");</p><p>  XDTime = 0;</p><p><b>  }</b></p>&l

50、t;p><b>  //</b></p><p><b>  //構(gòu)造函數(shù)</b></p><p><b>  //</b></p><p>  public CPU()</p><p><b>  {</b></p><p>

51、;<b>  Init();</b></p><p><b>  }</b></p><p>  #region cpu類的事件和委托</p><p><b>  //</b></p><p>  //申請(qǐng)?jiān)O(shè)備的事件和委托</p><p><b&g

52、t;  //</b></p><p>  public class DeviceStateChangeEventArgs : EventArgs</p><p><b>  {</b></p><p>  private int _Atime;</p><p>  private DeviceType _ty

53、pe;</p><p>  private int _DN;</p><p>  private string _processname;</p><p>  private int _needtime;</p><p>  public int Atime</p><p><b>  {</b>

54、</p><p>  get { return _Atime; }</p><p>  set { _Atime = value; }</p><p><b>  }</b></p><p>  public DeviceType type</p><p><b>  {</b&g

55、t;</p><p>  get { return _type; }</p><p>  set { _type = value;}</p><p><b>  }</b></p><p>  public int DN</p><p><b>  {</b></p&g

56、t;<p>  get { return _DN; }</p><p>  set { _DN = value;}</p><p><b>  }</b></p><p>  public string processname</p><p><b>  {</b></p>

57、<p>  get { return _processname; }</p><p>  set { _processname = value; }</p><p><b>  }</b></p><p>  public int needtime</p><p><b>  {</b>

58、;</p><p>  get { return _needtime; }</p><p>  set { _needtime = value;}</p><p><b>  }</b></p><p><b>  }</b></p><p>  public delegat

59、e void DeviceStateChangeEventHander(object sender, DeviceStateChangeEventArgs e);</p><p>  public event DeviceStateChangeEventHander DeviceStateChange;</p><p>  public delegate void ErrorIREvent

60、Hander(object sender, EventArgs e);</p><p>  public event ErrorIREventHander ErrorIR;</p><p>  public delegate void QueueChangeHander(object sender, EventArgs e);</p><p>  public ev

61、ent QueueChangeHander QueueChange;</p><p>  public delegate void FinishIRHander(object sender,EventArgs e);</p><p>  public event FinishIRHander FinishIR;</p><p>  public delegate v

62、oid ExecuteIsWhiteHander(object sender, EventArgs e);</p><p>  public event ExecuteIsWhiteHander ExecuteIsWhite;</p><p>  #endregion</p><p><b>  //</b></p><p&

63、gt;  //空閑PCB鏈表的操作</p><p><b>  //</b></p><p>  public int GetOneFromWhite()</p><p><b>  {</b></p><p>  int a = White;</p><p><b&g

64、t;  if (a<10)</b></p><p><b>  {</b></p><p>  White = PCBArray[a].Next; </p><p><b>  }</b></p><p><b>  return a;</

65、b></p><p><b>  }</b></p><p>  public void InsertOneToWhite(int a)</p><p><b>  {</b></p><p>  PCBArray[a].Next = White;</p><p>  

66、White = a;</p><p><b>  }</b></p><p><b>  //</b></p><p>  //就緒PCB鏈表的操作</p><p><b>  //</b></p><p>  public void InsertOne

67、ToReady(int a)</p><p><b>  {</b></p><p>  PCBArray[a].Next = Ready;</p><p>  Ready = a;</p><p><b>  }</b></p><p>  public void GetO

68、neFromReady(int a)</p><p><b>  {</b></p><p>  int b = Ready;</p><p>  if (a == b)</p><p><b>  {</b></p><p>  Ready = PCBArray[a].Ne

69、xt;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  while (b < 10)</p><p><b>  {</b>&l

70、t;/p><p>  if (PCBArray[b].Next == a)</p><p><b>  {</b></p><p>  PCBArray[b].Next = PCBArray[PCBArray[b].Next].Next;</p><p><b>  }</b></p>&

71、lt;p>  b = PCBArray[b].Next;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //</b></p><

72、p>  //阻塞PCB鏈表的操作</p><p><b>  //</b></p><p>  public void InsertOneToBlock(int a)</p><p><b>  {</b></p><p>  PCBArray[a].Next = Block;</p&g

73、t;<p>  Block = a;</p><p><b>  }</b></p><p><b>  //</b></p><p>  //Creat函數(shù),創(chuàng)建進(jìn)程</p><p><b>  //</b></p><p>  publ

74、ic void Creat(string Name,string str)</p><p><b>  {</b></p><p><b>  //</b></p><p>  //申請(qǐng)PCB,a>10,則申請(qǐng)失敗</p><p><b>  //</b></p&g

75、t;<p>  int a = GetOneFromWhite();</p><p><b>  int b;</b></p><p>  if (str.Length > 0)</p><p><b>  {</b></p><p>  int sum = (str.Lengt

76、h + 15) / 16;</p><p>  if (a < 10)</p><p><b>  {</b></p><p>  if (ram.Judge(sum) == true)</p><p><b>  {</b></p><p><b>  //

77、</b></p><p>  //分配內(nèi)存并加載到內(nèi)存</p><p><b>  //</b></p><p>  b = ram.Allocate(sum);</p><p>  ram.LoadContent(str, b);</p><p><b>  //</

78、b></p><p><b>  //初始化PCB</b></p><p><b>  //</b></p><p>  PCBArray[a].ProcessName = Name;</p><p>  PCBArray[a].PageAdress = b;</p><p

79、>  PCBArray[a].Sum = sum;</p><p>  PCBArray[a].PC = 0;</p><p>  PCBArray[a].IR = "";</p><p>  PCBArray[a].DR = 0;</p><p>  PCBArray[a].PSW = Interrupt.No;&

80、lt;/p><p>  PCBArray[a].WaitTime = -10;</p><p>  PCBArray[a].Pri = 1024 / str.Length;</p><p>  PCBArray[a].ExecuteTime = 0;</p><p>  PCBArray[a].NeedDevice = DeviceType.no

81、;</p><p>  PCBArray[a].HaveDevice = DeviceType.no;</p><p>  PCBArray[a].GetDeviceTime = 0;</p><p>  PCBArray[a].DN = -1;</p><p>  PCBArray[a].BlockReason = ""

82、;</p><p>  InsertOneToReady(a);</p><p><b>  //</b></p><p>  //是否轉(zhuǎn)向進(jìn)程調(diào)度</p><p><b>  //</b></p><p>  int c = JudgeAttemper();</p&g

83、t;<p>  if (c < 10)</p><p><b>  {</b></p><p>  Attemper(c);</p><p><b>  }</b></p><p><b>  }</b></p><p><b&

84、gt;  else</b></p><p><b>  {</b></p><p>  InsertOneToWhite(a);</p><p>  MessageBox.Show("內(nèi)存不足或文件太長(zhǎng),創(chuàng)建進(jìn)程失敗", "消息", MessageBoxButtons.OK, MessageB

85、oxIcon.Error);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  MessageB

86、ox.Show("PCB塊不足,創(chuàng)建進(jìn)程失敗", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  e

87、lse</b></p><p><b>  {</b></p><p>  MessageBox.Show("文件為空,不能創(chuàng)建進(jìn)程","錯(cuò)誤",MessageBoxButtons.OK,MessageBoxIcon.Error);</p><p><b>  }</b>

88、</p><p><b>  }</b></p><p><b>  //</b></p><p>  //Destroy函數(shù),撤銷程序</p><p><b>  //</b></p><p>  public void Destory(int a)&

89、lt;/p><p><b>  {</b></p><p><b>  //</b></p><p><b>  //回收內(nèi)存</b></p><p><b>  //</b></p><p>  int p = PCBArray[a]

90、.PageAdress;</p><p>  int sum = PCBArray[a].Sum;</p><p>  ram.DeAllocate(p,sum);</p><p><b>  //</b></p><p><b>  //回收PCB塊</b></p><p>

91、;<b>  //</b></p><p>  InsertOneToWhite(a);</p><p>  Execute = 10;</p><p><b>  //</b></p><p><b>  //顯示結(jié)果</b></p><p><

92、b>  //</b></p><p><b>  //</b></p><p><b>  //</b></p><p><b>  //</b></p><p><b>  }</b></p><p><b

93、>  //</b></p><p>  //BlockProcess函數(shù),阻塞進(jìn)程</p><p><b>  //</b></p><p>  public void BlockProcess(int a,DeviceType b,int time)</p><p><b>  {</

94、b></p><p><b>  //</b></p><p><b>  //保護(hù)CPU現(xiàn)場(chǎng)</b></p><p><b>  //</b></p><p>  PCBArray[a].PC = PC;</p><p>  PCBArray[a

95、].IR = IR;</p><p>  PCBArray[a].DR = DR;</p><p><b>  //</b></p><p>  //判斷申請(qǐng)?jiān)O(shè)備是否成功,根據(jù)不同情況填寫B(tài)lockReason項(xiàng)</p><p><b>  //</b></p><p>  

96、bool d = Dev.JudgeDevice(b);</p><p>  if (d == false)</p><p><b>  {</b></p><p>  PCBArray[a].NeedDevice = b;</p><p>  PCBArray[a].HaveDevice = DeviceType.no

97、;</p><p>  PCBArray[a].BlockReason = "申請(qǐng)" + b + "設(shè)備失敗";</p><p>  PCBArray[a].PC = PCBArray[a].PC - 4;</p><p><b>  }</b></p><p><b>

98、  else</b></p><p><b>  {</b></p><p>  PCBArray[a].DN = Dev.Allocate(b);</p><p>  PCBArray[a].HaveDevice = b;</p><p>  PCBArray[a].NeedDevice = DeviceT

99、ype.no;</p><p>  PCBArray[a].GetDeviceTime = XDTime;</p><p>  PCBArray[a].WaitTime = time;</p><p>  PCBArray[a].BlockReason = "等待IO輸入輸出";</p><p>  if (DeviceS

100、tateChange != null)</p><p><b>  {</b></p><p>  DeviceStateChangeEventArgs e=new DeviceStateChangeEventArgs();</p><p>  e.DN = PCBArray[a].DN;</p><p>  e.typ

101、e = b;</p><p>  e.processname = PCBArray[a].ProcessName;</p><p>  e.needtime = time;</p><p>  e.Atime = XDTime;</p><p>  DeviceStateChange(null,e);</p><p>

102、  } </p><p><b>  }</b></p><p><b>  //</b></p><p><b>  //修改進(jìn)程狀態(tài)</b></p><p><b>  //</b></p><p>  I

103、nsertOneToBlock(a);</p><p>  Execute = 10;</p><p><b>  //</b></p><p><b>  //轉(zhuǎn)向進(jìn)程調(diào)度</b></p><p><b>  //</b></p><p>  int

104、c = JudgeAttemper();</p><p>  if (c < 10)</p><p><b>  {</b></p><p>  Attemper(c);</p><p><b>  }</b></p><p><b>  }</b>

105、;</p><p><b>  //</b></p><p>  //WakeUp函數(shù),喚醒進(jìn)程</p><p><b>  //</b></p><p>  public void WakeUp(int ID,DeviceType device)</p><p><b

106、>  {</b></p><p><b>  //</b></p><p><b>  //喚醒自己</b></p><p><b>  //</b></p><p>  int d = Block;</p><p>  if (Blo

107、ck == ID)</p><p><b>  {</b></p><p>  Block = PCBArray[ID].Next;</p><p>  InsertOneToReady(ID);</p><p><b>  }</b></p><p><b>  

108、else</b></p><p><b>  {</b></p><p>  while (PCBArray[d].Next < 10)</p><p><b>  {</b></p><p>  if (PCBArray[d].Next == ID)</p><

109、;p><b>  {</b></p><p>  PCBArray[d].Next = PCBArray[ID].Next;</p><p>  InsertOneToReady(ID);</p><p><b>  break;</b></p><p><b>  }</b&

110、gt;</p><p>  d = PCBArray[d].Next;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //</b></p><p><b>  //檢查第一個(gè)節(jié)點(diǎn)&l

111、t;/b></p><p><b>  //</b></p><p>  while(Block<10&&PCBArray[Block].NeedDevice == device)</p><p><b>  {</b></p><p>  int h = Block;&

112、lt;/p><p>  Block = PCBArray[h].Next;</p><p>  InsertOneToReady(h);</p><p><b>  }</b></p><p><b>  //</b></p><p><b>  //檢查其他節(jié)點(diǎn)<

113、;/b></p><p><b>  //</b></p><p>  if(Block<10)</p><p><b>  {</b></p><p>  int a = Block;</p><p>  while (PCBArray[a].Next <

114、 10)</p><p><b>  {</b></p><p>  if (PCBArray[PCBArray[a].Next].NeedDevice == device)</p><p><b>  {</b></p><p>  int h = PCBArray[a].Next;</p&

115、gt;<p>  PCBArray[a].Next = PCBArray[PCBArray[a].Next].Next;</p><p>  InsertOneToReady(h);</p><p><b>  }</b></p><p><b>  else</b></p><p>

116、<b>  {</b></p><p>  a = PCBArray[a].Next;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  in

117、t c = JudgeAttemper();</p><p>  if (c < 10)</p><p><b>  {</b></p><p>  Attemper(c);</p><p><b>  }</b></p><p><b>  }</b&

118、gt;</p><p><b>  //</b></p><p>  //判斷是否需要進(jìn)行進(jìn)程的調(diào)度,若需要?jiǎng)t返回進(jìn)程塊號(hào)(0-9),不需要?jiǎng)t返回10</p><p><b>  //</b></p><p>  public int JudgeAttemper()</p><p

119、><b>  {</b></p><p><b>  //</b></p><p>  //選出就緒鏈表中優(yōu)先級(jí)最高</p><p><b>  //</b></p><p><b>  int k;</b></p><p>

120、  if (Ready < 10)</p><p><b>  {</b></p><p>  int p = Ready;</p><p>  int a = PCBArray[Ready].Pri;</p><p>  k = Ready;

121、 //優(yōu)先級(jí)最高的塊號(hào)</p><p>  while (PCBArray[p].Next < 10)</p><p><b>  {</b></p><p>  if (PCBArray[PCBArray[p].Next].Pri > a)</p><p><b>  {</b>&l

122、t;/p><p>  a = PCBArray[PCBArray[p].Next].Pri;</p><p>  k = PCBArray[p].Next;</p><p><b>  }</b></p><p>  p = PCBArray[p].Next;</p><p><b>  }

123、</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  return 10;</p><p><b>  }</b>&l

124、t;/p><p><b>  //</b></p><p>  //跟執(zhí)行鏈表內(nèi)的PCB塊進(jìn)行比較</p><p><b>  //</b></p><p>  if (Execute < 10)</p><p><b>  {</b></p&g

125、t;<p>  if (PCBArray[k].Pri > PCBArray[Execute].Pri)</p><p><b>  {</b></p><p><b>  return k;</b></p><p><b>  }</b></p><p>

126、<b>  else</b></p><p><b>  {</b></p><p>  return 10;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  e

127、lse</b></p><p><b>  {</b></p><p><b>  return k;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&

128、gt;  //</b></p><p><b>  //進(jìn)程調(diào)度函數(shù)</b></p><p><b>  //</b></p><p>  public void Attemper(int a)</p><p><b>  {</b></p><

129、p><b>  //</b></p><p><b>  //保護(hù)CPU現(xiàn)場(chǎng)</b></p><p><b>  //</b></p><p>  if (Execute < 10)</p><p><b>  {</b></p>

130、<p>  PCBArray[Execute].PC = PC;</p><p>  PCBArray[Execute].IR = IR;</p><p>  PCBArray[Execute].DR = DR;</p><p>  InsertOneToReady(Execute);</p><p><b>  }&l

131、t;/b></p><p><b>  //</b></p><p>  //選擇一個(gè)進(jìn)程,初始化CPU中的寄存器</p><p><b>  //</b></p><p>  GetOneFromReady(a);</p><p>  Execute = a;<

132、/p><p>  PC = PCBArray[a].PC;</p><p>  IR = PCBArray[a].IR;</p><p>  DR = PCBArray[a].DR;</p><p><b>  }</b></p><p><b>  //</b></p&g

133、t;<p><b>  //主函數(shù)cpu</b></p><p><b>  //</b></p><p>  public void cpu()</p><p><b>  {</b></p><p><b>  if (true)</b>

134、</p><p><b>  {</b></p><p>  switch (PSW)</p><p><b>  {</b></p><p>  case Interrupt.End:</p><p><b>  {</b></p>&l

135、t;p><b>  //</b></p><p><b>  //寫入out文件</b></p><p><b>  //</b></p><p>  // </p><p>  //撤銷進(jìn)程,進(jìn)行進(jìn)程調(diào)度</p><p>&

136、lt;b>  //</b></p><p>  Destory(Execute);</p><p>  int a = JudgeAttemper();</p><p>  if (a < 10)</p><p><b>  {</b></p><p>  Attemper

137、(a);</p><p><b>  }</b></p><p>  PSW = Interrupt.No;</p><p><b>  break;</b></p><p><b>  }</b></p><p>  case Interrupt.IO

138、:</p><p><b>  {</b></p><p>  BlockProcess(Execute,type,time);</p><p>  PSW = Interrupt.No;</p><p><b>  break;</b></p><p><b> 

139、 }</b></p><p><b>  default:</b></p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><

140、;b>  }</b></p><p>  switch (PSW1)</p><p><b>  {</b></p><p>  case Interrupt.IO:</p><p><b>  {</b></p><p>  int b = Block;&

141、lt;/p><p>  while (b < 10)</p><p><b>  {</b></p><p>  if (XDTime - PCBArray[b].GetDeviceTime - 1 == PCBArray[b].WaitTime)</p><p><b>  {</b></

142、p><p>  Dev.DeAllocate(PCBArray[b].HaveDevice, PCBArray[b].DN); </p><p>  WakeUp(b, PCBArray[b].HaveDevice);</p><p>  PCBArray[b].DN = -1;</p>&

143、lt;p>  PCBArray[b].GetDeviceTime = 0;</p><p>  PCBArray[b].HaveDevice = DeviceType.no;</p><p>  PCBArray[b].WaitTime = -10;</p><p><b>  }</b></p><p>  b

144、= PCBArray[b].Next;</p><p><b>  }</b></p><p>  PSW1 = Interrupt.No;</p><p><b>  break;</b></p><p><b>  }</b></p><p><

145、;b>  default:</b></p><p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論