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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  一 引言</b></p><p><b>  1.1 性質(zhì)</b></p><p>  計(jì)算機(jī)系統(tǒng)是計(jì)算機(jī)系統(tǒng)中不可缺少的基本系統(tǒng)軟件,計(jì)算機(jī)系統(tǒng)是由硬件和軟件兩部分構(gòu)成的。操作系統(tǒng)實(shí)際上是一個(gè)計(jì)算機(jī)系統(tǒng)中硬、軟件資源的總指揮部。能有效的組織和管理計(jì)算機(jī)系統(tǒng)中的硬件和軟件資源、合理的組織計(jì)算機(jī)工作流程,控制程序的執(zhí)行

2、、并向用戶(hù)提供各種服務(wù)功能,使得用戶(hù)能夠合理、方便、有效的使用計(jì)算機(jī),是整個(gè)計(jì)算機(jī)系統(tǒng)能高效運(yùn)行的一組程序模塊的集合。操作系統(tǒng)在計(jì)算機(jī)體系中張非常重要的地位。本課程設(shè)計(jì)旨在加深對(duì)操作系統(tǒng)的認(rèn)識(shí)和理解。通過(guò)對(duì)操作系統(tǒng)模擬的實(shí)現(xiàn),掌握操作系統(tǒng)的工作原理和實(shí)現(xiàn)方法。提高學(xué)生分析問(wèn)題和解決問(wèn)題的能力,并提高學(xué)生的編程能力。</p><p><b>  1.2教學(xué)目的</b></p>&

3、lt;p>  通過(guò)對(duì)操作系統(tǒng)模擬的實(shí)現(xiàn),使學(xué)生加深對(duì)計(jì)算機(jī)操作系統(tǒng)的認(rèn)識(shí)和理解,掌握操作系統(tǒng)的工作原理和實(shí)現(xiàn)方法。是學(xué)生在理論知識(shí)應(yīng)用于實(shí)踐的過(guò)程中,提高學(xué)生分析問(wèn)題和解決問(wèn)題的能力。同時(shí)也提高學(xué)生的編程能力。</p><p><b>  1.3任務(wù)和要求</b></p><p>  實(shí)現(xiàn)操作系統(tǒng)的模擬,此系統(tǒng)為操作系統(tǒng)的模擬,提供命令接口和圖形借口。該系統(tǒng)包括

4、文件管理,實(shí)現(xiàn)了磁盤(pán)模擬、文件的創(chuàng)建、編輯、移動(dòng)、復(fù)制、刪除等功能。單用戶(hù)多進(jìn)程的存儲(chǔ)管理、設(shè)備管理和進(jìn)程管理部分。存儲(chǔ)管理包括主存分配與回收。設(shè)備管理包括設(shè)備的分配與回收。設(shè)備分配時(shí)采用采用先來(lái)先服務(wù)策略,設(shè)備回收時(shí)喚醒等待設(shè)備的進(jìn)程。進(jìn)程管理主要包括進(jìn)程調(diào)度,采用時(shí)間片輪轉(zhuǎn)法,實(shí)現(xiàn)了進(jìn)程的創(chuàng)建和撤銷(xiāo)、進(jìn)程的阻塞和喚醒和中斷。并且以上過(guò)程在屏幕上顯示。并提供友好的用戶(hù)使用頁(yè)面。</p><p><b>

5、;  1.4意義</b></p><p>  通過(guò)對(duì)操作系統(tǒng)模擬的實(shí)現(xiàn),加深對(duì)計(jì)算機(jī)操作系統(tǒng)的認(rèn)識(shí)和理解,提高學(xué)生把理論應(yīng)用與實(shí)際的能力。使學(xué)生的縫隙問(wèn)題和解決問(wèn)題的能力得到提高。為以后的發(fā)展打下基礎(chǔ)。</p><p><b>  1.5論文結(jié)構(gòu)安排</b></p><p>  第一章 引言 說(shuō)明本課程設(shè)計(jì)的性質(zhì)、教學(xué)目的與任務(wù)和要

6、求,意義,以及論文結(jié)構(gòu)安排。</p><p>  第二章 系統(tǒng)分析與設(shè)計(jì) 寫(xiě)出系統(tǒng)要求,分析出包含哪些功能模塊、每個(gè)模塊的計(jì)劃采用的實(shí)現(xiàn)方法和原理</p><p>  第三章 系統(tǒng)實(shí)現(xiàn) 寫(xiě)出主要模塊的實(shí)現(xiàn),包括全局變量說(shuō)明和主要功能的實(shí)現(xiàn)流程(按照模塊說(shuō))</p><p>  第四章 結(jié)束語(yǔ) 總結(jié)課程實(shí)際的體會(huì)</p><p>  二 系

7、統(tǒng)分析與設(shè)計(jì)</p><p><b>  2.1文件管理</b></p><p>  2.1.1文件的邏輯結(jié)構(gòu)</p><p>  文件的邏輯結(jié)構(gòu)采用流式結(jié)構(gòu),文件的內(nèi)容均采用文本文件,系統(tǒng)中有兩種文件,一種是存放任意字符的文件(.txt),一種是可執(zhí)行文件(.exe),可執(zhí)行文件的內(nèi)容就是系統(tǒng)內(nèi)進(jìn)程的程序體。</p><p

8、>  可執(zhí)行文件要包括如下命令:</p><p>  X=?; 給i賦值一位數(shù)</p><p><b>  X++; i加1</b></p><p><b>  X--; i減1</b></p><p>  !??; 第一個(gè)?為A,B,C中某個(gè)設(shè)備,第二個(gè)?為一位數(shù),表示使用設(shè)備的時(shí)間&

9、lt;/p><p>  end; 表示文件結(jié)束</p><p>  2.1.2文件的物理結(jié)構(gòu)</p><p>  文件的物理結(jié)構(gòu)采用索引文件,每個(gè)文件分配一個(gè)索引塊(用來(lái)存放索引的盤(pán)塊)把分配給該文件的所有盤(pán)塊號(hào)都記錄在該索引塊中,按照這種分派方式存儲(chǔ)的文件就是索引文件。由于索引塊就是一個(gè)存放許多盤(pán)塊號(hào)的盤(pán)塊,因此,為使系統(tǒng)能找到文件存放的地址,文件目錄項(xiàng)記錄該文件索

10、引塊的盤(pán)塊號(hào)和文件長(zhǎng)度。為一個(gè)大文件分配磁盤(pán)空間時(shí),如果所分配除去盤(pán)塊的盤(pán)塊號(hào),已經(jīng)裝滿(mǎn)一索引塊時(shí),便需再為該文件分配另一個(gè)索引塊,用于將以后繼續(xù)分配給該文件的盤(pán)塊號(hào)記錄其中,以此類(lèi)推。同時(shí),應(yīng)為這些索引塊再建立一級(jí)索引,即系統(tǒng)再分配一索引塊,作為一級(jí)索引塊的索引塊,將第一塊、第二塊、第三塊、……索引塊的盤(pán)塊號(hào)寫(xiě)入此索引塊中,這樣便形成了二級(jí)索引的分配方式,如果文件非常大的時(shí)候,還可以用三級(jí)、四級(jí)索引分配方式。本系統(tǒng)實(shí)現(xiàn)二級(jí)索引,如圖2

11、-1所示:</p><p><b>  2.1.3目錄結(jié)構(gòu)</b></p><p>  目錄結(jié)構(gòu)采用樹(shù)型目錄結(jié)構(gòu)。</p><p>  目錄項(xiàng)內(nèi)容(16個(gè)字節(jié)):</p><p>  目錄名、文件名:6個(gè)字節(jié);</p><p>  擴(kuò)展名:3個(gè)字節(jié)(可執(zhí)行文件擴(kuò)展名為exe,目錄沒(méi)有擴(kuò)展名);&l

12、t;/p><p>  目錄、文件屬性:1字節(jié);</p><p>  文件長(zhǎng)度:2字節(jié)(目錄沒(méi)有長(zhǎng)度,字節(jié)數(shù))。</p><p>  地址:直接地址項(xiàng)1個(gè),一級(jí)索引項(xiàng)1個(gè),二級(jí)索引1項(xiàng),每項(xiàng)1個(gè)字節(jié);</p><p><b>  預(yù)留1字節(jié)</b></p><p>  根目錄:根目錄位置固定,占用磁盤(pán)2

13、塊,大小固定,共16項(xiàng),占用模擬磁盤(pán)第1、2塊;</p><p>  子目錄;位置不固定,大小不固定</p><p>  目錄結(jié)構(gòu)如圖2-2所示:</p><p><b>  2.1.4磁盤(pán)模擬</b></p><p>  磁盤(pán)的分配采用混合索引結(jié)構(gòu)的分配方式。系統(tǒng)采用成組鏈接法記錄磁盤(pán)空間的使用情況。</p>

14、;<p>  空閑塊每組登記10個(gè)空閑塊,專(zhuān)用塊占用第0塊。</p><p>  索引塊中每個(gè)盤(pán)塊號(hào)占用4字節(jié),登記32塊。如圖2-3是空閑塊成組鏈接示意圖:</p><p><b>  2.1.5用戶(hù)接口</b></p><p>  用戶(hù)接口提供用戶(hù)命令接口,具體實(shí)現(xiàn)以下命令:</p><p>  1.創(chuàng)

15、建文件:create 文件名</p><p>  2.拷貝文件:copy 源文件名 目標(biāo)文件名 (拷貝文件可同名拷貝,也可更名拷貝)</p><p>  3.刪除文件:delete 文件名</p><p>  4.移動(dòng)文件:move 源文件名 目標(biāo)文件名(磁盤(pán)內(nèi)和磁盤(pán)間文件移動(dòng)不同,磁盤(pán)內(nèi)的移動(dòng)實(shí)際只是目錄的改變,并不需要真的移動(dòng)文件;磁盤(pán)間的文件移動(dòng)實(shí)際上是先拷貝

16、文件到目標(biāo)磁盤(pán),然后再刪除源文件。)</p><p>  5.顯示文件:type 文件名(僅僅是顯示文件內(nèi)容)</p><p>  6.編輯文件:edit 文件名(此命令完成對(duì)文件的編輯,只讀文件不可以修改。)</p><p>  7.改變文件屬性:change 文件名 屬性(將文件在只讀和非只讀、隱藏和非隱藏之間轉(zhuǎn)換。)</p><p> 

17、 8.磁盤(pán)格式化命令:format</p><p>  9.建立目錄: makdir 目錄名(建立目錄,若有同名目錄存在,則建立失敗。)</p><p>  10.刪除空目錄:rdir 目錄名(只能刪除空目錄,非空目錄不能刪除)</p><p>  11.刪除目錄:deldir 目錄名(既可以刪除空目錄,又可以刪除非空目錄,對(duì)與非空目錄,首先要?jiǎng)h除其下文件和目錄,然

18、后才能刪除其本身。)</p><p><b>  2.2存儲(chǔ)管理</b></p><p>  存儲(chǔ)管理部分主要實(shí)現(xiàn)主存空間的分配和回收、存儲(chǔ)保護(hù)。</p><p>  模擬系統(tǒng)中,內(nèi)存部分分為兩部分,一部分是系統(tǒng)區(qū),這里只存放進(jìn)程控制塊,一部分是用戶(hù)區(qū),這里主要是對(duì)用戶(hù)區(qū)的管理。</p><p>  系統(tǒng)區(qū)包括pcb區(qū)域

19、、主存空間分配表。</p><p>  存儲(chǔ)管理采用可移動(dòng)的可變分區(qū)存儲(chǔ)管理方式。</p><p>  采用數(shù)組來(lái)模擬主存的用戶(hù)區(qū),每個(gè)數(shù)組元素占用一個(gè)字節(jié)。實(shí)驗(yàn)中主存大小為512個(gè)字節(jié)</p><p>  主存的模擬: 采用數(shù)組來(lái)模擬主存的用戶(hù)區(qū),每個(gè)數(shù)組元素占用一個(gè)字節(jié),主存大小為512個(gè)字節(jié),每個(gè)主存塊16個(gè)字節(jié) </p><p> 

20、 數(shù)據(jù)結(jié)構(gòu):本次實(shí)驗(yàn)采用頁(yè)式管理策略對(duì)主存進(jìn)行分配和回收策略, 采用位示圖記錄主存使用情況</p><p>  主存分配策略:當(dāng)有程序要存放入主存時(shí),查看空閑塊總數(shù)是否夠用,如果夠用,先分配一塊用來(lái)存放頁(yè)表,然后查位示圖中為“0”的位,根據(jù)查到的位所在的字號(hào)和位號(hào)可計(jì)算出對(duì)應(yīng)的塊號(hào),同時(shí)在該位填上占用標(biāo)志“1”,并填寫(xiě)頁(yè)表;不夠用,分配失敗。</p><p>  塊號(hào)=字號(hào)*字長(zhǎng)+位號(hào)&l

21、t;/p><p>  主存回收策略:根據(jù)頁(yè)表歸還存儲(chǔ)空間時(shí),可以根據(jù)歸還塊的塊號(hào)推算出在位示圖中的位置:</p><p>  字號(hào)=[塊號(hào)/位示圖中字長(zhǎng)]</p><p>  位號(hào)=塊號(hào)mod位示圖中字長(zhǎng)</p><p>  然后把這一位的“1”清成“0”,表示該塊成為空閑塊了,最后回收頁(yè)表所占用空間。</p><p> 

22、 屏幕顯示:主存使用情況示意圖,哪些主存已經(jīng)分配,哪些主存未分配,以不同的顏色表示(例如,紅色表示已分配,藍(lán)色表示未分配)。正在運(yùn)行的進(jìn)程對(duì)應(yīng)指令存放的位置以特殊顏色顯示。</p><p><b>  2.3進(jìn)程管理</b></p><p>  進(jìn)程管理主要包括進(jìn)程調(diào)度,進(jìn)程的創(chuàng)建和撤銷(xiāo)、進(jìn)程的阻塞和喚醒,中斷作用的實(shí)現(xiàn)。</p><p>  

23、2.3.1主要寄存器的模擬</p><p>  用全局變量模擬重要寄存器,如cpu重要寄存器,程序狀態(tài)寄存器PSW、指令寄存器IR,程序計(jì)數(shù)器PC,數(shù)據(jù)緩沖寄存器DR等。</p><p>  2.3.2中斷的模擬</p><p>  中斷的發(fā)現(xiàn)應(yīng)該是硬件的工作,這里在函數(shù)CPU中加檢測(cè)PSW的方式來(lái)模擬。在CPU()函數(shù)中,每執(zhí)行一條指令之前,先檢查PSW,判斷有無(wú)

24、中斷,若有進(jìn)行中斷處理,然后再運(yùn)行解釋指令。CPU函數(shù)應(yīng)該不斷循環(huán)執(zhí)行的。</p><p>  2.3.3模擬中斷的種類(lèi)和中斷處理方式:</p><p>  程序結(jié)束(執(zhí)行指令end形成的中斷,軟中斷):將結(jié)果寫(xiě)入文件out,其中包括文件路徑名和x的值,調(diào)用進(jìn)程撤銷(xiāo)原語(yǔ)撤銷(xiāo)進(jìn)程,然后進(jìn)行進(jìn)程調(diào)度;</p><p>  I/O中斷(設(shè)備完成輸入輸出):將輸入輸出完成的

25、進(jìn)程喚醒,將等待該設(shè)備的一個(gè)進(jìn)程同時(shí)喚醒。</p><p><b>  2.3.4時(shí)鐘模擬</b></p><p>  系統(tǒng)中的絕對(duì)時(shí)鐘和相對(duì)時(shí)鐘用全局變量模擬。系統(tǒng)時(shí)鐘用來(lái)記錄開(kāi)機(jī)以后的時(shí)間。 這里的系統(tǒng)時(shí)鐘并不是計(jì)算機(jī)的真正的時(shí)鐘,這里所說(shuō)的時(shí)間只是一個(gè)單位,例如使用vb中的時(shí)鐘控件實(shí)現(xiàn),每觸發(fā)一次timer事件,絕對(duì)時(shí)鐘增1,表示增加一個(gè)時(shí)間單位,絕

26、對(duì)時(shí)鐘減1,表示時(shí)間片消耗一個(gè)。</p><p>  2.3.5進(jìn)程控制塊</p><p>  進(jìn)程控制塊內(nèi)容包括進(jìn)程標(biāo)識(shí)符、主要寄存器內(nèi)容、進(jìn)程狀態(tài)、阻塞原因等等。本模擬系統(tǒng)最多容納10個(gè)進(jìn)程塊。</p><p>  pcb區(qū)域用數(shù)組模擬。</p><p>  進(jìn)程控制塊根據(jù)內(nèi)容的不同組成不同的隊(duì)列,空白進(jìn)程控制塊鏈、就緒隊(duì)列和阻塞隊(duì)列,正

27、在運(yùn)行的進(jìn)程只有一個(gè),系統(tǒng)初始時(shí)只有空白進(jìn)程控制塊鏈。</p><p><b>  2.3.6進(jìn)程調(diào)度</b></p><p>  采用搶占式優(yōu)先級(jí)調(diào)度算法。</p><p>  進(jìn)程調(diào)度函數(shù)的主要工作是:</p><p>  將正在運(yùn)行的進(jìn)程保存在該進(jìn)程對(duì)應(yīng)進(jìn)程控制塊中;</p><p>  從

28、就緒隊(duì)列中選擇一個(gè)進(jìn)程;</p><p>  將這個(gè)進(jìn)程中進(jìn)程控制塊中記錄的各寄存器內(nèi)容恢復(fù)到CPU各個(gè)寄存器內(nèi)。</p><p><b>  2.3.7進(jìn)程控制</b></p><p>  建立四個(gè)函數(shù)模擬進(jìn)程創(chuàng)建、撤銷(xiāo)、阻塞和喚醒四個(gè)原語(yǔ)。</p><p>  進(jìn)程創(chuàng)建create</p><p&

29、gt;  進(jìn)程創(chuàng)建的主要工作是:</p><p>  第一步,申請(qǐng)空白進(jìn)程控制塊;</p><p>  第二步,申請(qǐng)主存空間,申請(qǐng)成功,裝入主存;</p><p>  第三步,初始化進(jìn)程控制塊;</p><p>  第四步,將進(jìn)程鏈入就緒隊(duì)列,根據(jù)情況決定是否轉(zhuǎn)向進(jìn)程調(diào)度。</p><p>  進(jìn)程撤銷(xiāo)destory&

30、lt;/p><p>  進(jìn)程撤銷(xiāo)的主要工作是:</p><p>  第一步,回收進(jìn)程所占內(nèi)存資源;</p><p>  第二步,回收進(jìn)程控制塊;</p><p>  第三步,在屏幕上顯示進(jìn)程執(zhí)行結(jié)果,進(jìn)程撤銷(xiāo)</p><p><b>  進(jìn)程阻塞block</b></p><p&g

31、t;  進(jìn)程阻塞的主要工作是:</p><p>  第一步,保存運(yùn)行進(jìn)程的CPU現(xiàn)場(chǎng);</p><p>  第二步,修改進(jìn)程狀態(tài);</p><p>  第三步,將進(jìn)程鏈入對(duì)應(yīng)的阻塞隊(duì)列,然后轉(zhuǎn)向進(jìn)程調(diào)度。</p><p>  2.3.8進(jìn)程的創(chuàng)建:</p><p>  進(jìn)程創(chuàng)建的主要工作是:</p>&l

32、t;p>  第一步,申請(qǐng)空白進(jìn)程控制塊;</p><p>  第二步,申請(qǐng)主存空間,申請(qǐng)成功,裝入主存;</p><p>  第三步,初始化進(jìn)程控制塊;</p><p>  2.3.9進(jìn)程的撤銷(xiāo):</p><p>  進(jìn)程撤銷(xiāo)的主要工作是:</p><p>  第一步,回收進(jìn)程所占內(nèi)存資源;</p>

33、<p>  第二步,回收進(jìn)程控制塊;</p><p>  第三步,在屏幕上顯示進(jìn)程執(zhí)行結(jié)果,進(jìn)程撤銷(xiāo)</p><p>  2.3.10 進(jìn)程的阻塞:</p><p>  進(jìn)程阻塞的主要工作是:</p><p>  第一步,保存運(yùn)行進(jìn)程的CPU現(xiàn)場(chǎng);</p><p>  第二步,修改進(jìn)程狀態(tài);</p&g

34、t;<p>  第三步,將進(jìn)程鏈入對(duì)應(yīng)的阻塞隊(duì)列,然后轉(zhuǎn)向進(jìn)程調(diào)度。</p><p>  2.3.11進(jìn)程的喚醒</p><p>  進(jìn)程喚醒的主要工作是</p><p>  第一步,將進(jìn)程由阻塞隊(duì)列中摘下;</p><p>  第二步,修改進(jìn)程狀態(tài)為就緒;</p><p>  第三步,鏈入就緒隊(duì)列,根據(jù)

35、情況決定是否轉(zhuǎn)向進(jìn)程調(diào)度。</p><p>  2.3.12屏幕顯示</p><p><b>  屏幕顯示要求包括:</b></p><p><b>  顯示系統(tǒng)時(shí)鐘;</b></p><p>  顯示正在運(yùn)行的進(jìn)程的進(jìn)程名、運(yùn)行的指令、中間結(jié)果、相對(duì)時(shí)鐘寄存器內(nèi)容;</p><

36、p>  顯示就緒隊(duì)列中進(jìn)程名;</p><p>  顯示阻塞隊(duì)列中進(jìn)程名。</p><p>  2.3.13硬件工作的模擬</p><p>  硬件工作的模擬包括中央處理器的模擬、主要寄存器的模擬、中斷的模擬和時(shí)鐘的模擬四方面。</p><p> ?、僦醒胩幚砥鞯哪M。用函數(shù)CPU( )(該函數(shù)不能有參數(shù))模擬中央處理器。該函數(shù)主要負(fù)

37、責(zé)解釋“可執(zhí)行文件”中的命令。如:給x賦值x=?;x自加x++;x自減x--;申請(qǐng)?jiān)O(shè)備和時(shí)間!??;程序結(jié)束end;</p><p>  CPU只能解釋指令寄存器IR中的指令。一個(gè)進(jìn)程的運(yùn)行時(shí)要根據(jù)進(jìn)程執(zhí)行的位置,將對(duì)應(yīng)的指令存放到指令寄存器中。</p><p>  ②主要寄存器的模擬用全局變量模擬重要寄存器,如cpu重要寄存器,程序狀態(tài)寄存器PSW、指令寄存器IR,程序計(jì)數(shù)器PC,數(shù)據(jù)緩

38、沖寄存器DR等。</p><p> ?、壑袛嗟哪M。中斷的發(fā)現(xiàn)應(yīng)該是硬件的工作,這里在函數(shù)CPU中加檢測(cè)PSW的方式來(lái)模擬。在CPU()函數(shù)中,每執(zhí)行一條指令之前,先檢查PSW,判斷有無(wú)中斷,若有進(jìn)行中斷處理,然后再運(yùn)行解釋指令。CPU函數(shù)應(yīng)該不斷循環(huán)執(zhí)行的。</p><p>  模擬中斷的種類(lèi)有如下幾種:程序結(jié)束、時(shí)間片到、I/O中斷。程序結(jié)束(執(zhí)行指令end形成的中斷,軟中斷):將結(jié)果

39、寫(xiě)入文件out,其中包括文件路徑名和x的值,調(diào)用進(jìn)程撤銷(xiāo)原語(yǔ)撤銷(xiāo)進(jìn)程,然后進(jìn)行進(jìn)程調(diào)度;I/O中斷(設(shè)備完成輸入輸出):將輸入輸出完成的進(jìn)程喚醒,將等待該設(shè)備的一個(gè)進(jìn)程同時(shí)喚醒。時(shí)鐘中斷:進(jìn)程時(shí)間片用完,轉(zhuǎn)為就緒,重新進(jìn)程調(diào)度。</p><p> ?、軙r(shí)鐘的模擬。系統(tǒng)中的絕對(duì)時(shí)鐘和相對(duì)時(shí)鐘用全局變量模擬。系統(tǒng)時(shí)鐘用來(lái)記錄開(kāi)機(jī)以后的時(shí)間。 這里的系統(tǒng)時(shí)鐘并不是計(jì)算機(jī)的真正的時(shí)鐘,這里所說(shuō)的時(shí)間只是一個(gè)單位

40、,例如使用vb中的時(shí)鐘控件實(shí)現(xiàn),每觸發(fā)一次timer事件,絕對(duì)時(shí)鐘增1,表示增加一個(gè)時(shí)間單位,絕對(duì)時(shí)鐘減1。</p><p><b>  2.4設(shè)備管理</b></p><p>  設(shè)備管理主要包括設(shè)備的分配和回收。</p><p>  模擬系統(tǒng)中有A、B、C三種獨(dú)占型設(shè)備,A設(shè)備3個(gè),B設(shè)備2個(gè),C設(shè)備1個(gè)。</p><p

41、>  設(shè)備分配:采用先來(lái)先服務(wù)策略。</p><p>  設(shè)備回收:回收設(shè)備后,要注意喚醒等待設(shè)備的進(jìn)程。</p><p>  屏幕顯示:每個(gè)設(shè)備是否被使用,哪個(gè)進(jìn)程在使用該設(shè)備,哪些進(jìn)程在等待使用該設(shè)備。</p><p><b>  三 系統(tǒng)實(shí)現(xiàn)</b></p><p><b>  3.1程序主頁(yè)面&

42、lt;/b></p><p>  程序主頁(yè)面如圖3-1所示:</p><p><b>  3.2全局變量</b></p><p>  public const int n = 10, m = 10;</p><p>  public static Free_table[] free_table = new Free

43、_table[n];//空閑分區(qū)表</p><p>  public static Used_table[] used_table = new Used_table[m];//已分分區(qū)表</p><p>  public static Used_table[] buffer = new Used_table[n];</p><p>  public static c

44、har[] mm = new char[512];//模擬內(nèi)存</p><p>  private List<Label> mems = new List<Label>();//內(nèi)存</p><p>  private List<TextBox> readys = new List<TextBox>();//就緒隊(duì)列</p>&

45、lt;p>  private List<TextBox> waitsn = new List<TextBox>();//阻塞名字</p><p>  private List<TextBox> waitsr = new List<TextBox>();//阻塞原因</p><p>  public static char useeq =

46、 'U';</p><p>  public static string a0, a1, a2, a3, a4, a5;</p><p>  public static int running = 1;</p><p>  public static int already = 2;</p><p>  public stat

47、ic int blocking = 3;</p><p>  public static int PC, PSW, DR, TIME, TIME2;</p><p>  public static char AX, BX, CX, DX;</p><p>  public static char[] IR = new char[4];</p><

48、p>  public static PCB[] pcb = new PCB[10];</p><p>  public static queue ready = new queue();//就緒隊(duì)列</p><p>  public static queue wait = new queue();//阻塞隊(duì)列</p><p>  public static q

49、ueue empty = new queue();//空閑PCB隊(duì)列</p><p>  public static int run;</p><p>  public static EQ[] eq = new EQ[6];//設(shè)備數(shù)組</p><p>  public int[] ETIME = new int[6]; //各個(gè)設(shè)備的時(shí)間</p>&

50、lt;p>  public static int time = 0;//表示系統(tǒng)時(shí)間</p><p>  public const int minisize = 2;</p><p>  //-------------------文件-----------------------------</p><p>  private List<Label>

51、; memc = new List<Label>();</p><p>  public File_Function c = new File_Function(0);</p><p>  public static int aaa = 0;</p><p>  public static int bbb = 0;</p><p>

52、;  private List<Label> memc = new List<Label>();</p><p>  public File_Function c = new File_Function(0);</p><p>  public static int aaa = 0;</p><p>  public static int b

53、bb = 0;</p><p><b>  3.3文件管理</b></p><p>  3.3.1創(chuàng)建目錄:</p><p>  建立目錄首先要找到建立目錄的位置(父目錄),然后查找該目錄是否存在,如果父目錄不存在,不能建立,如果存在,查找是否存在同名目錄,存在,不能建立,不存在,則查找一個(gè)空目錄項(xiàng),,為該目錄項(xiàng)申請(qǐng)一個(gè)盤(pán)塊,并填寫(xiě)目錄內(nèi)容,初

54、始目錄有我的電腦和我的電腦下的磁盤(pán)C兩個(gè)目錄。目錄創(chuàng)建過(guò)程如圖3-2所示:</p><p>  創(chuàng)建一個(gè)目錄的命令如圖3-3所示:</p><p>  3.3.2刪除空目錄:</p><p>  刪除空目錄首先要找到該目錄,如果目錄不存在,刪除失??;如果存在,但是,是非空目錄,顯示不能刪除,操作失敗;若是空目錄,將目錄在樹(shù)形目錄和磁盤(pán)中刪除,如圖3-4所示:<

55、/p><p>  刪除一個(gè)空目錄的命令如圖3-5所示:</p><p><b>  3.3.3刪除目錄</b></p><p>  刪除目錄是在刪除空目錄的基礎(chǔ)上增加了刪除非空目錄的功能。首先檢查要?jiǎng)h除的目錄是否為空,若為空,調(diào)用刪除空目錄的函數(shù),將其刪除;若不為空,深度優(yōu)先遍歷以該目錄為根節(jié)點(diǎn)的子樹(shù),將其孩子節(jié)點(diǎn)依次都刪除,最后調(diào)用刪除空目錄的函

56、數(shù),將該目錄刪除,就完成了刪除目錄的工作。</p><p>  3.3.4文件的創(chuàng)建與刪除</p><p>  文件的創(chuàng)建與刪除,是建立在目錄的創(chuàng)建與刪除基礎(chǔ)之上的。只需要調(diào)用建立和刪除目錄函數(shù),建立或刪除文件目錄。然后,將該文件插入到打開(kāi)文件表中就完成了一個(gè)文件的建立,刪除則對(duì)應(yīng)回收操作。</p><p>  文件的建立流程如圖3-6所示:</p>

57、<p>  新建一個(gè)文件的命令如圖3-7所示:</p><p>  文件的刪除流程如圖3-8所示:</p><p>  刪除一個(gè)文件的命令如圖3-9所示:</p><p>  3.3.5文件的存儲(chǔ)</p><p>  建立文件和目錄后,要求可以在磁盤(pán)上長(zhǎng)期的保存。實(shí)現(xiàn)文件的長(zhǎng)期存儲(chǔ),是通過(guò)在自己電腦的外存上,動(dòng)態(tài)建立文件來(lái)實(shí)現(xiàn)的,在

58、每次模擬的磁盤(pán)有內(nèi)容的改變的時(shí)候,將內(nèi)容寫(xiě)到外存的文件一次,當(dāng)系統(tǒng)再次重新啟動(dòng)的時(shí)候,將外存中的文件內(nèi)容讀到模擬磁盤(pán)的數(shù)組中,就實(shí)現(xiàn)了簡(jiǎn)單的文件的長(zhǎng)期存儲(chǔ),具體代碼如下:</p><p>  public File_Function(int tag)</p><p><b>  {</b></p><p><b>  //</b

59、></p><p>  // TODO: 在此處添加構(gòu)造函數(shù)邏輯</p><p><b>  //</b></p><p>  //建立一個(gè)文件或文本文檔來(lái)模擬磁盤(pán),初始化時(shí)如果文件為空,則磁盤(pán)第一二塊存儲(chǔ)FAT表,第三塊存儲(chǔ)根目錄,若文件不為空,則不修改文本。</p><p>  path = @"E:

60、\流星操作系統(tǒng)\流星操作系統(tǒng)\disk.txt";//建立C盤(pán)</p><p>  if (!File.Exists(path))</p><p><b>  {</b></p><p>  FileStream fs = new FileStream(path, FileMode.CreateNew);</p><

61、;p>  fs.Seek(0, SeekOrigin.Begin);</p><p>  fs.Write(disk, 0, 8192);</p><p>  for (int i = 0; i < 3; i++)</p><p>  FAT[i] = 255;</p><p>  for (int i = 3; i < 1

62、28; i++)</p><p>  FAT[i] = 0;</p><p>  fs.Seek(0, SeekOrigin.Begin);</p><p>  fs.Write(FAT, 0, 128);</p><p>  fs.Close();</p><p><b>  }</b><

63、/p><p>  else//從磁盤(pán)中提取數(shù)據(jù)寫(xiě)入FAT表中</p><p><b>  {</b></p><p>  FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);</p><p>  fs.Read(FAT, 0, 128);&

64、lt;/p><p>  fs.Close();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  3.3.6磁盤(pán)模擬</b></p><p>  根據(jù)成組連接法,將磁盤(pán)的空閑塊進(jìn)行鏈接,空閑塊的分配和

65、回收都是針對(duì)專(zhuān)用塊來(lái)操作的,沒(méi)分配一塊后,把空閑塊數(shù)減1,但要把一組中的第一個(gè)空閑塊分配除去之前應(yīng)該把登記在該塊中的下一組的塊號(hào)及塊數(shù)保存到專(zhuān)用快中(原專(zhuān)用塊中的信息已經(jīng)無(wú)用,因?yàn)樗甘镜囊唤M空閑塊都已被分配)。當(dāng)歸還一塊時(shí),只要把歸還塊的塊號(hào)登記到專(zhuān)用塊的當(dāng)前組中且將空閑塊數(shù)加1,如果當(dāng)前組已經(jīng)滿(mǎn)10塊,則把專(zhuān)用塊中的內(nèi)容寫(xiě)到歸還的那塊中,該歸還塊作為新組的第一塊。</p><p>  空閑塊的分配和回收都是針

66、對(duì)專(zhuān)用塊來(lái)操作的,沒(méi)分配一塊后,把空閑塊數(shù)減1,但要把一組中的第一個(gè)空閑塊分配除去之前應(yīng)該把登記在該塊中的下一組的塊號(hào)及塊數(shù)保存到專(zhuān)用快中(原專(zhuān)用塊中的信息已經(jīng)無(wú)用,因?yàn)樗甘镜囊唤M空閑塊都已被分配),如圖3-10所示:</p><p>  當(dāng)歸還一塊時(shí),只要把歸還塊的塊號(hào)登記到專(zhuān)用塊的當(dāng)前組中且將空閑塊數(shù)加1,如果當(dāng)前組已經(jīng)滿(mǎn)10塊,則把專(zhuān)用塊中的內(nèi)容寫(xiě)到歸還的那塊中,該歸還塊作為新組的第一塊,如圖3-11所示

67、:</p><p>  磁盤(pán)使用情況用文件分配表來(lái)記錄:磁盤(pán)有多少塊,該表就有多少項(xiàng),某文件的一個(gè)磁盤(pán)塊號(hào)為i,則這個(gè)文件的下一個(gè)磁盤(pán)塊的塊號(hào)記錄在表的第i項(xiàng)。如圖3-12是空閑塊位示圖法示意圖:</p><p>  磁盤(pán)的狀態(tài)在每次分配和回收磁盤(pán)塊的函數(shù)過(guò)程中實(shí)現(xiàn),每分配一個(gè)空閑塊,將相應(yīng)label由藍(lán)色改為棕色,表示該磁盤(pán)塊已經(jīng)被占用;每回收一塊磁盤(pán)塊的時(shí)候,將相應(yīng)label由棕色改為

68、藍(lán)色,表示該磁盤(pán)塊空閑。如圖3-13所示:</p><p><b>  3.4用戶(hù)接口</b></p><p>  用戶(hù)接口包括命令接口和圖形接口兩種,命令接口要求用戶(hù)輸入規(guī)定格式的文字命令,系統(tǒng)判斷輸入是否正確采取相關(guān)操作。圖形借口相比于命令接口比較方便,用戶(hù)不必輸入命令,直接選擇菜單項(xiàng)進(jìn)行操作。用戶(hù)接口如圖3-14所示:</p><p> 

69、 命令接口流程圖如圖3-15所示:</p><p>  圖形接口流程如圖3-16所示:</p><p><b>  3.5進(jìn)程管理</b></p><p>  進(jìn)程管理頁(yè)面如圖3-17所示:</p><p>  3.5.1分配內(nèi)存空間函數(shù):</p><p>  public int allocat

70、e(int t, int xk, string str)</p><p>  { //采用最優(yōu)分配算法進(jìn)行分配,作業(yè)名是J,作業(yè)大小是xk</p><p>  int i, k, j, a, b;</p><p><b>  int ad;</b></p><p><b>  k = -1;</b>

71、</p><p>  for (i = 0; i < n; i++)</p><p>  { //尋找空間大于xk的最小空閑區(qū)登記項(xiàng)k</p><p>  if (free_table[i].length >= xk & free_table[i].flag == 1)</p><p>  if (k == -1 ||

72、 free_table[i].length < free_table[k].length)</p><p><b>  k = i;</b></p><p><b>  }</b></p><p>  if (k == -1) //未找到可用空閑區(qū),返回錯(cuò)誤信息</p><

73、;p>  return -1;</p><p>  //找到可用空閑區(qū),開(kāi)始分配,若空閑區(qū)大小與要求分配的空間差小于minisize大小,則空閑區(qū)全部分配出去,</p><p>  //若空閑區(qū)大小與要求的空間差大于minisize大小,則從空閑區(qū)劃出一部分分配。</p><p>  if (free_table[k].length <= minisiz

74、e)</p><p><b>  {</b></p><p>  free_table[k].flag = 0;</p><p>  ad = free_table[k].address;</p><p>  xk = free_table[k].length;</p><p><b>

75、  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  free_table[k].length = free_table[k].length - xk;</p><p>  ad = free_table[k].addr

76、ess;</p><p>  free_table[k].address = ad + xk;//從上往下分</p><p><b>  }</b></p><p><b>  i = 0;</b></p><p>  while (!(used_table[i].flag == -1 &

77、i < m))</p><p><b>  {</b></p><p>  i++; //尋找已分配表的空表目</p><p><b>  }</b></p><p>  if (i >= m) //沒(méi)有找到空表目</p><p>

78、<b>  {</b></p><p>  if (free_table[k].flag == 0) //若沒(méi)有空的已分分區(qū)表,則要修改空閑分區(qū)表</p><p>  free_table[k].flag = 1;</p><p><b>  else</b></p><p>  

79、free_table[k].length = free_table[k].length + xk;</p><p>  return -1;</p><p><b>  }</b></p><p>  else //若找到則修改已分分區(qū)表并裝入主存</p><p><b>  {</b>

80、</p><p>  used_table[i].address = ad;</p><p>  used_table[i].length = xk;</p><p>  used_table[i].flag = t;</p><p>  for (j = 0; j < xk; j++)</p><p><

81、b>  {</b></p><p>  mm[ad + j] = str[j];</p><p><b>  }</b></p><p><b>  //改變內(nèi)存塊顏色</b></p><p>  a = ad / 4;</p><p>  b = xk /

82、 4;</p><p>  for (i = a; i < a + b; i++)</p><p><b>  {</b></p><p>  mems[i].BackColor = Color.Yellow;//修改顏色變回占內(nèi)存狀態(tài)</p><p><b>  }</b></p>

83、;<p>  //申請(qǐng)內(nèi)存成功,返回起始地址</p><p>  return ad;</p><p><b>  }</b></p><p><b>  }</b></p><p>  當(dāng)所剩內(nèi)存不足時(shí)會(huì)出現(xiàn)報(bào)錯(cuò),如圖3-18所示</p><p>  內(nèi)存模擬

84、頁(yè)面如圖如圖3-19所示</p><p>  3.5.2回收內(nèi)存空間函數(shù):</p><p>  public int reclaim(int r)</p><p><b>  {</b></p><p>  int i, k, j, s, t, a, b;</p><p><b>  i

85、nt S, L;</b></p><p>  //尋找已分分區(qū)表中的對(duì)應(yīng)登記項(xiàng)</p><p><b>  s = 0;</b></p><p>  while (used_table[s].flag != r & s < m)</p><p><b>  s++;</b>

86、</p><p>  if (s >= m)//回收失敗 沒(méi)找到進(jìn)程</p><p><b>  return 0;</b></p><p>  used_table[s].flag = -1;</p><p>  S = used_table[s].address;</p><p>  L

87、 = used_table[s].length;</p><p><b>  //修改內(nèi)存塊顏色</b></p><p>  a = S / 4;</p><p>  b = L / 4;</p><p>  for (i = a; i < a + b; i++)</p><p><b

88、>  {</b></p><p>  mems[i].BackColor = Color.Blue;//修改顏色變回不占內(nèi)存狀態(tài)</p><p><b>  }</b></p><p>  //尋找回收分區(qū)的上下鄰空閑區(qū),上鄰表目k,下鄰表目j</p><p><b>  j = -1;<

89、;/b></p><p><b>  k = -1;</b></p><p><b>  i = 0;</b></p><p>  while (i < n & (j == -1 || k == -1))</p><p><b>  {</b></p&

90、gt;<p>  if (free_table[i].flag == 1)</p><p>  {if (free_table[i].address + free_table[i].length == S) k = i;//找到上鄰</p><p>  if (free_table[i].address == S + L) j = i;//找到下鄰</p>&l

91、t;p><b>  }</b></p><p><b>  i++;</b></p><p><b>  }</b></p><p>  if (k != -1)</p><p><b>  {</b></p><p>  i

92、f (j != -1) //上下都有空閑區(qū),合并三項(xiàng)</p><p><b>  {</b></p><p>  free_table[k].length = free_table[k].length + free_table[j].length + L;</p><p>  free_table[j].flag = 0;</p&g

93、t;<p><b>  }</b></p><p>  else //上鄰空閑區(qū),下鄰非空閑區(qū),與上鄰合并</p><p>  free_table[k].length = free_table[k].length + L;</p><p><b>  }</b></p>

94、<p><b>  else</b></p><p><b>  {</b></p><p>  if (j != -1) //上鄰非空閑區(qū),下鄰空閑區(qū),與下鄰合并</p><p><b>  {</b></p><p>  free_table[j].addr

95、ess = S;</p><p>  free_table[j].length = free_table[j].length + L;</p><p><b>  }</b></p><p><b>  else</b></p><p>  { //上下鄰都為非空閑區(qū),回收區(qū)域直接填

96、入</p><p><b>  t = 0;</b></p><p>  while (free_table[t].flag == 1 & t < n)</p><p><b>  t++;</b></p><p>  if (t >= n)</p><p&g

97、t;<b>  {</b></p><p>  used_table[s].flag = r;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  free_table[t].address = S;</p&

98、gt;<p>  free_table[t].length = L;</p><p>  free_table[t].flag = 1;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 1;</b

99、></p><p><b>  }</b></p><p>  3.5.3進(jìn)程調(diào)度函數(shù):</p><p>  采用時(shí)間片輪轉(zhuǎn)調(diào)度算法,時(shí)間片為5。 </p><p>  進(jìn)程調(diào)度函數(shù)的主要工作是:</p><p>  第一步,將正在運(yùn)行的進(jìn)程保存在該進(jìn)程對(duì)應(yīng)進(jìn)程控制塊中;</p>

100、<p>  第二步,從就緒隊(duì)列中選擇一個(gè)進(jìn)程;</p><p>  第三步,將這個(gè)進(jìn)程中進(jìn)程控制塊中記錄的各寄存器內(nèi)容恢復(fù)到CPU各個(gè)寄存器內(nèi)。</p><p>  public int sheduling()</p><p><b>  {</b></p><p>  int i, j, s, h;<

101、;/p><p>  char[] a = new char[4];</p><p>  if (ready.tail == -1 & ready.head == -1) //就緒隊(duì)列中無(wú)進(jìn)程可調(diào)度</p><p><b>  return 0;</b></p><p>  else //有進(jìn)程可調(diào)度&

102、lt;/p><p><b>  {</b></p><p>  i = ready.head;//記錄取走的</p><p>  if (pcb[ready.head].next == -1)//就緒隊(duì)列只有一個(gè)進(jìn)程了,取走后為空</p><p>  ready.tail = ready.head = -1;</p&g

103、t;<p>  else //就緒隊(duì)列中不只剩下一個(gè)進(jìn)程</p><p><b>  {</b></p><p>  ready.head = pcb[ready.head].next;</p><p><b>  }</b></p><p>  //顯示就緒隊(duì)列中的進(jìn)程</p&

104、gt;<p><b>  j = 0;</b></p><p>  h = ready.head;</p><p>  if (ready.head != -1)//有進(jìn)程</p><p><b>  {</b></p><p>  while (pcb[h].next != -1)/

105、/不是唯一的</p><p><b>  {</b></p><p>  readys[j].Text = pcb[h].name.ToString();</p><p>  h = pcb[h].next;</p><p><b>  j++;</b></p><p>&l

106、t;b>  }</b></p><p>  readys[j].Text = pcb[h].name.ToString();</p><p><b>  j++;</b></p><p><b>  }</b></p><p>  for (s = j; s < 10; s+

107、+)</p><p><b>  {</b></p><p>  readys[s].Text = "";</p><p><b>  }</b></p><p>  TIME = 5;//設(shè)置時(shí)間片</p><p>  textBox12.Text =

108、TIME.ToString();</p><p>  timer3.Enabled = true;//控制時(shí)間片的</p><p>  //恢復(fù)該進(jìn)程現(xiàn)場(chǎng)信息</p><p>  AX = pcb[i].ax;</p><p>  BX = pcb[i].bx;</p><p>  CX = pcb[i].cx;<

109、;/p><p>  DX = pcb[i].dx;</p><p>  // PSW = pcb[i].psw;</p><p>  PC = pcb[i].pc;</p><p>  DR = pcb[i].dr;</p><p>  //修改指向運(yùn)行進(jìn)程的指針run</p><p><b

110、>  run = i;</b></p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  3.5.4 CPU函數(shù):</p><p> ?、?/p>

111、中央處理器的模擬。用函數(shù)CPU( )(該函數(shù)不能有參數(shù))模擬中央處理器。該函數(shù)主要負(fù)責(zé)解釋“可執(zhí)行文件”中的命令。如:給x賦值x=?;x自加x++;x自減x--;申請(qǐng)?jiān)O(shè)備和時(shí)間!??;程序結(jié)束end;</p><p>  CPU只能解釋指令寄存器IR中的指令。一個(gè)進(jìn)程的運(yùn)行時(shí)要根據(jù)進(jìn)程執(zhí)行的位置,將對(duì)應(yīng)的指令存放到指令寄存器中。</p><p>  ②主要寄存器的模擬用全局變量模擬重要寄

112、存器,如cpu重要寄存器,程序狀態(tài)寄存器PSW、指令寄存器IR,程序計(jì)數(shù)器PC,數(shù)據(jù)緩沖寄存器DR等。</p><p>  ③中斷的模擬。中斷的發(fā)現(xiàn)應(yīng)該是硬件的工作,這里在函數(shù)CPU中加檢測(cè)PSW的方式來(lái)模擬。在CPU()函數(shù)中,每執(zhí)行一條指令之前,先檢查PSW,判斷有無(wú)中斷,若有進(jìn)行中斷處理,然后再運(yùn)行解釋指令。CPU函數(shù)應(yīng)該不斷循環(huán)執(zhí)行的。</p><p>  模擬中斷的種類(lèi)有如下幾種

113、:程序結(jié)束、時(shí)間片到、I/O中斷。程序結(jié)束(執(zhí)行指令end形成的中斷,軟中斷):將結(jié)果寫(xiě)入文件out,其中包括文件路徑名和x的值,調(diào)用進(jìn)程撤銷(xiāo)原語(yǔ)撤銷(xiāo)進(jìn)程,然后進(jìn)行進(jìn)程調(diào)度;I/O中斷(設(shè)備完成輸入輸出):將輸入輸出完成的進(jìn)程喚醒,將等待該設(shè)備的一個(gè)進(jìn)程同時(shí)喚醒。時(shí)鐘中斷:進(jìn)程時(shí)間片用完,轉(zhuǎn)為就緒,重新進(jìn)程調(diào)度。</p><p>  public void CPU()</p><p>&l

114、t;b>  {</b></p><p><b>  int a, s;</b></p><p><b>  char eq;</b></p><p><b>  //沒(méi)有中斷</b></p><p>  //if (flag1 == 0 & flag2

115、 == 0 & flag3 == 0)</p><p>  if (PSW == 0)</p><p><b>  {</b></p><p>  if (run == -1)//沒(méi)有運(yùn)行的進(jìn)程</p><p><b>  {</b></p><p>  s = sh

116、eduling();//調(diào)度新進(jìn)程</p><p>  if (s == 0)//就緒隊(duì)列為空,調(diào)用閑逛進(jìn)程</p><p><b>  {</b></p><p><b>  a = 0;</b></p><p>  textBox3.Text = "閑逛進(jìn)程";</p&

117、gt;<p>  textBox4.Text = "";</p><p>  textBox5.Text = "";</p><p>  textBox12.Text = "";</p><p><b>  return;</b></p><p>

118、<b>  }</b></p><p><b>  }</b></p><p>  else //if ( run != -1)//還有進(jìn)程</p><p><b>  {</b></p><p>  AX = mm[pcb[run].pc]; //讀出指令</p>

119、;<p>  BX = mm[pcb[run].pc + 1];</p><p>  CX = mm[pcb[run].pc + 2];</p><p>  DX = mm[pcb[run].pc + 3];</p><p>  mems[PC / 4 - 1].BackColor = Color.Yellow;//修改顏色變回占內(nèi)存狀態(tài)</p&

120、gt;<p>  PC = pcb[run].pc + 4;</p><p>  pcb[run].pc = PC;</p><p>  pcb[run].ax = AX;</p><p>  pcb[run].bx = BX;</p><p>  pcb[run].cx = CX;</p><p>  

121、pcb[run].dx = DX;</p><p><b>  }</b></p><p>  IR[0] = AX;</p><p>  IR[1] = BX;</p><p>  IR[2] = CX;</p><p>  IR[3] = DX;</p><p><

122、;b>  //解釋指令</b></p><p>  textBox4.Text = IR[0].ToString() + IR[1].ToString() + IR[2].ToString() + IR[3].ToString();</p><p>  if (IR[1] == '=')</p><p><b>  {&l

123、t;/b></p><p>  DR = (int)(IR[2]) - 48;</p><p><b>  }</b></p><p>  else if (IR[1] == '+')</p><p><b>  {</b></p><p><b&

124、gt;  DR++;</b></p><p><b>  }</b></p><p>  else if (IR[1] == '-')</p><p><b>  {</b></p><p><b>  DR--;</b></p>&l

125、t;p><b>  }</b></p><p>  else if (IR[0] == '!')</p><p><b>  {</b></p><p>  a = (int)(IR[2]) - 48; //記錄需要占用設(shè)備多長(zhǎng)時(shí)間</p><p>  eq = IR[1];&

126、lt;/p><p>  AppEquip(eq, run, a);//調(diào)用設(shè)備申請(qǐng)函數(shù)</p><p><b>  }</b></p><p>  else if (IR[0] == 'e')</p><p><b>  {</b></p><p>  if (P

127、SW == 0)</p><p>  { PSW = 1; }</p><p><b>  else</b></p><p>  timer6.Enabled = true;</p><p><b>  }</b></p><p><b>  else</b&

128、gt;</p><p><b>  { //非法輸入</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else//有中斷時(shí)</p><p><b>  {</b></

129、p><p>  if (PSW == 1)// 程序結(jié)束</p><p><b>  {</b></p><p><b>  int x;</b></p><p><b>  x = run;</b></p><p><b>  PSW = 0;&

130、lt;/b></p><p><b>  run = -1;</b></p><p>  timer3.Enabled = false;</p><p>  textBox4.Text = "處理end中斷!";</p><p>  destroy(x);</p><p>

131、;<b>  }</b></p><p>  else if (PSW == 2) //------------I/O中斷歸還設(shè)備 {</p><p><b>  PSW = 0;</b></p><p>  textBox4.Text = "處理I/O中斷!";</

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論