版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 模擬操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-- geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)程序設(shè)計(jì)-操作系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---操作系統(tǒng)之文件管理部分的設(shè)計(jì)與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度子系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)---作業(yè)調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)題目
評(píng)論
0/150
提交評(píng)論