版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 一 引言</b></p><p><b> 1.1 性質</b></p><p> 計算機系統(tǒng)是計算機系統(tǒng)中不可缺少的基本系統(tǒng)軟件,計算機系統(tǒng)是由硬件和軟件兩部分構成的。操作系統(tǒng)實際上是一個計算機系統(tǒng)中硬、軟件資源的總指揮部。能有效的組織和管理計算機系統(tǒng)中的硬件和軟件資源、合理的組織計算機工作流程,控制程序的執(zhí)行
2、、并向用戶提供各種服務功能,使得用戶能夠合理、方便、有效的使用計算機,是整個計算機系統(tǒng)能高效運行的一組程序模塊的集合。操作系統(tǒng)在計算機體系中張非常重要的地位。本課程設計旨在加深對操作系統(tǒng)的認識和理解。通過對操作系統(tǒng)模擬的實現(xiàn),掌握操作系統(tǒng)的工作原理和實現(xiàn)方法。提高學生分析問題和解決問題的能力,并提高學生的編程能力。</p><p><b> 1.2教學目的</b></p>&
3、lt;p> 通過對操作系統(tǒng)模擬的實現(xiàn),使學生加深對計算機操作系統(tǒng)的認識和理解,掌握操作系統(tǒng)的工作原理和實現(xiàn)方法。是學生在理論知識應用于實踐的過程中,提高學生分析問題和解決問題的能力。同時也提高學生的編程能力。</p><p><b> 1.3任務和要求</b></p><p> 實現(xiàn)操作系統(tǒng)的模擬,此系統(tǒng)為操作系統(tǒng)的模擬,提供命令接口和圖形借口。該系統(tǒng)包括
4、文件管理,實現(xiàn)了磁盤模擬、文件的創(chuàng)建、編輯、移動、復制、刪除等功能。單用戶多進程的存儲管理、設備管理和進程管理部分。存儲管理包括主存分配與回收。設備管理包括設備的分配與回收。設備分配時采用采用先來先服務策略,設備回收時喚醒等待設備的進程。進程管理主要包括進程調度,采用時間片輪轉法,實現(xiàn)了進程的創(chuàng)建和撤銷、進程的阻塞和喚醒和中斷。并且以上過程在屏幕上顯示。并提供友好的用戶使用頁面。</p><p><b>
5、; 1.4意義</b></p><p> 通過對操作系統(tǒng)模擬的實現(xiàn),加深對計算機操作系統(tǒng)的認識和理解,提高學生把理論應用與實際的能力。使學生的縫隙問題和解決問題的能力得到提高。為以后的發(fā)展打下基礎。</p><p><b> 1.5論文結構安排</b></p><p> 第一章 引言 說明本課程設計的性質、教學目的與任務和要
6、求,意義,以及論文結構安排。</p><p> 第二章 系統(tǒng)分析與設計 寫出系統(tǒng)要求,分析出包含哪些功能模塊、每個模塊的計劃采用的實現(xiàn)方法和原理</p><p> 第三章 系統(tǒng)實現(xiàn) 寫出主要模塊的實現(xiàn),包括全局變量說明和主要功能的實現(xiàn)流程(按照模塊說)</p><p> 第四章 結束語 總結課程實際的體會</p><p> 二 系
7、統(tǒng)分析與設計</p><p><b> 2.1文件管理</b></p><p> 2.1.1文件的邏輯結構</p><p> 文件的邏輯結構采用流式結構,文件的內(nèi)容均采用文本文件,系統(tǒng)中有兩種文件,一種是存放任意字符的文件(.txt),一種是可執(zhí)行文件(.exe),可執(zhí)行文件的內(nèi)容就是系統(tǒng)內(nèi)進程的程序體。</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> !??; 第一個?為A,B,C中某個設備,第二個?為一位數(shù),表示使用設備的時間&
9、lt;/p><p> end; 表示文件結束</p><p> 2.1.2文件的物理結構</p><p> 文件的物理結構采用索引文件,每個文件分配一個索引塊(用來存放索引的盤塊)把分配給該文件的所有盤塊號都記錄在該索引塊中,按照這種分派方式存儲的文件就是索引文件。由于索引塊就是一個存放許多盤塊號的盤塊,因此,為使系統(tǒng)能找到文件存放的地址,文件目錄項記錄該文件索
10、引塊的盤塊號和文件長度。為一個大文件分配磁盤空間時,如果所分配除去盤塊的盤塊號,已經(jīng)裝滿一索引塊時,便需再為該文件分配另一個索引塊,用于將以后繼續(xù)分配給該文件的盤塊號記錄其中,以此類推。同時,應為這些索引塊再建立一級索引,即系統(tǒng)再分配一索引塊,作為一級索引塊的索引塊,將第一塊、第二塊、第三塊、……索引塊的盤塊號寫入此索引塊中,這樣便形成了二級索引的分配方式,如果文件非常大的時候,還可以用三級、四級索引分配方式。本系統(tǒng)實現(xiàn)二級索引,如圖2
11、-1所示:</p><p><b> 2.1.3目錄結構</b></p><p> 目錄結構采用樹型目錄結構。</p><p> 目錄項內(nèi)容(16個字節(jié)):</p><p> 目錄名、文件名:6個字節(jié);</p><p> 擴展名:3個字節(jié)(可執(zhí)行文件擴展名為exe,目錄沒有擴展名);&l
12、t;/p><p> 目錄、文件屬性:1字節(jié);</p><p> 文件長度:2字節(jié)(目錄沒有長度,字節(jié)數(shù))。</p><p> 地址:直接地址項1個,一級索引項1個,二級索引1項,每項1個字節(jié);</p><p><b> 預留1字節(jié)</b></p><p> 根目錄:根目錄位置固定,占用磁盤2
13、塊,大小固定,共16項,占用模擬磁盤第1、2塊;</p><p> 子目錄;位置不固定,大小不固定</p><p> 目錄結構如圖2-2所示:</p><p><b> 2.1.4磁盤模擬</b></p><p> 磁盤的分配采用混合索引結構的分配方式。系統(tǒng)采用成組鏈接法記錄磁盤空間的使用情況。</p>
14、;<p> 空閑塊每組登記10個空閑塊,專用塊占用第0塊。</p><p> 索引塊中每個盤塊號占用4字節(jié),登記32塊。如圖2-3是空閑塊成組鏈接示意圖:</p><p><b> 2.1.5用戶接口</b></p><p> 用戶接口提供用戶命令接口,具體實現(xiàn)以下命令:</p><p> 1.創(chuàng)
15、建文件:create 文件名</p><p> 2.拷貝文件:copy 源文件名 目標文件名 (拷貝文件可同名拷貝,也可更名拷貝)</p><p> 3.刪除文件:delete 文件名</p><p> 4.移動文件:move 源文件名 目標文件名(磁盤內(nèi)和磁盤間文件移動不同,磁盤內(nèi)的移動實際只是目錄的改變,并不需要真的移動文件;磁盤間的文件移動實際上是先拷貝
16、文件到目標磁盤,然后再刪除源文件。)</p><p> 5.顯示文件:type 文件名(僅僅是顯示文件內(nèi)容)</p><p> 6.編輯文件:edit 文件名(此命令完成對文件的編輯,只讀文件不可以修改。)</p><p> 7.改變文件屬性:change 文件名 屬性(將文件在只讀和非只讀、隱藏和非隱藏之間轉換。)</p><p>
17、 8.磁盤格式化命令:format</p><p> 9.建立目錄: makdir 目錄名(建立目錄,若有同名目錄存在,則建立失敗。)</p><p> 10.刪除空目錄:rdir 目錄名(只能刪除空目錄,非空目錄不能刪除)</p><p> 11.刪除目錄:deldir 目錄名(既可以刪除空目錄,又可以刪除非空目錄,對與非空目錄,首先要刪除其下文件和目錄,然
18、后才能刪除其本身。)</p><p><b> 2.2存儲管理</b></p><p> 存儲管理部分主要實現(xiàn)主存空間的分配和回收、存儲保護。</p><p> 模擬系統(tǒng)中,內(nèi)存部分分為兩部分,一部分是系統(tǒng)區(qū),這里只存放進程控制塊,一部分是用戶區(qū),這里主要是對用戶區(qū)的管理。</p><p> 系統(tǒng)區(qū)包括pcb區(qū)域
19、、主存空間分配表。</p><p> 存儲管理采用可移動的可變分區(qū)存儲管理方式。</p><p> 采用數(shù)組來模擬主存的用戶區(qū),每個數(shù)組元素占用一個字節(jié)。實驗中主存大小為512個字節(jié)</p><p> 主存的模擬: 采用數(shù)組來模擬主存的用戶區(qū),每個數(shù)組元素占用一個字節(jié),主存大小為512個字節(jié),每個主存塊16個字節(jié) </p><p>
20、 數(shù)據(jù)結構:本次實驗采用頁式管理策略對主存進行分配和回收策略, 采用位示圖記錄主存使用情況</p><p> 主存分配策略:當有程序要存放入主存時,查看空閑塊總數(shù)是否夠用,如果夠用,先分配一塊用來存放頁表,然后查位示圖中為“0”的位,根據(jù)查到的位所在的字號和位號可計算出對應的塊號,同時在該位填上占用標志“1”,并填寫頁表;不夠用,分配失敗。</p><p> 塊號=字號*字長+位號&l
21、t;/p><p> 主存回收策略:根據(jù)頁表歸還存儲空間時,可以根據(jù)歸還塊的塊號推算出在位示圖中的位置:</p><p> 字號=[塊號/位示圖中字長]</p><p> 位號=塊號mod位示圖中字長</p><p> 然后把這一位的“1”清成“0”,表示該塊成為空閑塊了,最后回收頁表所占用空間。</p><p>
22、 屏幕顯示:主存使用情況示意圖,哪些主存已經(jīng)分配,哪些主存未分配,以不同的顏色表示(例如,紅色表示已分配,藍色表示未分配)。正在運行的進程對應指令存放的位置以特殊顏色顯示。</p><p><b> 2.3進程管理</b></p><p> 進程管理主要包括進程調度,進程的創(chuàng)建和撤銷、進程的阻塞和喚醒,中斷作用的實現(xiàn)。</p><p>
23、2.3.1主要寄存器的模擬</p><p> 用全局變量模擬重要寄存器,如cpu重要寄存器,程序狀態(tài)寄存器PSW、指令寄存器IR,程序計數(shù)器PC,數(shù)據(jù)緩沖寄存器DR等。</p><p> 2.3.2中斷的模擬</p><p> 中斷的發(fā)現(xiàn)應該是硬件的工作,這里在函數(shù)CPU中加檢測PSW的方式來模擬。在CPU()函數(shù)中,每執(zhí)行一條指令之前,先檢查PSW,判斷有無
24、中斷,若有進行中斷處理,然后再運行解釋指令。CPU函數(shù)應該不斷循環(huán)執(zhí)行的。</p><p> 2.3.3模擬中斷的種類和中斷處理方式:</p><p> 程序結束(執(zhí)行指令end形成的中斷,軟中斷):將結果寫入文件out,其中包括文件路徑名和x的值,調用進程撤銷原語撤銷進程,然后進行進程調度;</p><p> I/O中斷(設備完成輸入輸出):將輸入輸出完成的
25、進程喚醒,將等待該設備的一個進程同時喚醒。</p><p><b> 2.3.4時鐘模擬</b></p><p> 系統(tǒng)中的絕對時鐘和相對時鐘用全局變量模擬。系統(tǒng)時鐘用來記錄開機以后的時間。 這里的系統(tǒng)時鐘并不是計算機的真正的時鐘,這里所說的時間只是一個單位,例如使用vb中的時鐘控件實現(xiàn),每觸發(fā)一次timer事件,絕對時鐘增1,表示增加一個時間單位,絕
26、對時鐘減1,表示時間片消耗一個。</p><p> 2.3.5進程控制塊</p><p> 進程控制塊內(nèi)容包括進程標識符、主要寄存器內(nèi)容、進程狀態(tài)、阻塞原因等等。本模擬系統(tǒng)最多容納10個進程塊。</p><p> pcb區(qū)域用數(shù)組模擬。</p><p> 進程控制塊根據(jù)內(nèi)容的不同組成不同的隊列,空白進程控制塊鏈、就緒隊列和阻塞隊列,正
27、在運行的進程只有一個,系統(tǒng)初始時只有空白進程控制塊鏈。</p><p><b> 2.3.6進程調度</b></p><p> 采用搶占式優(yōu)先級調度算法。</p><p> 進程調度函數(shù)的主要工作是:</p><p> 將正在運行的進程保存在該進程對應進程控制塊中;</p><p> 從
28、就緒隊列中選擇一個進程;</p><p> 將這個進程中進程控制塊中記錄的各寄存器內(nèi)容恢復到CPU各個寄存器內(nèi)。</p><p><b> 2.3.7進程控制</b></p><p> 建立四個函數(shù)模擬進程創(chuàng)建、撤銷、阻塞和喚醒四個原語。</p><p> 進程創(chuàng)建create</p><p&
29、gt; 進程創(chuàng)建的主要工作是:</p><p> 第一步,申請空白進程控制塊;</p><p> 第二步,申請主存空間,申請成功,裝入主存;</p><p> 第三步,初始化進程控制塊;</p><p> 第四步,將進程鏈入就緒隊列,根據(jù)情況決定是否轉向進程調度。</p><p> 進程撤銷destory&
30、lt;/p><p> 進程撤銷的主要工作是:</p><p> 第一步,回收進程所占內(nèi)存資源;</p><p> 第二步,回收進程控制塊;</p><p> 第三步,在屏幕上顯示進程執(zhí)行結果,進程撤銷</p><p><b> 進程阻塞block</b></p><p&g
31、t; 進程阻塞的主要工作是:</p><p> 第一步,保存運行進程的CPU現(xiàn)場;</p><p> 第二步,修改進程狀態(tài);</p><p> 第三步,將進程鏈入對應的阻塞隊列,然后轉向進程調度。</p><p> 2.3.8進程的創(chuàng)建:</p><p> 進程創(chuàng)建的主要工作是:</p>&l
32、t;p> 第一步,申請空白進程控制塊;</p><p> 第二步,申請主存空間,申請成功,裝入主存;</p><p> 第三步,初始化進程控制塊;</p><p> 2.3.9進程的撤銷:</p><p> 進程撤銷的主要工作是:</p><p> 第一步,回收進程所占內(nèi)存資源;</p>
33、<p> 第二步,回收進程控制塊;</p><p> 第三步,在屏幕上顯示進程執(zhí)行結果,進程撤銷</p><p> 2.3.10 進程的阻塞:</p><p> 進程阻塞的主要工作是:</p><p> 第一步,保存運行進程的CPU現(xiàn)場;</p><p> 第二步,修改進程狀態(tài);</p&g
34、t;<p> 第三步,將進程鏈入對應的阻塞隊列,然后轉向進程調度。</p><p> 2.3.11進程的喚醒</p><p> 進程喚醒的主要工作是</p><p> 第一步,將進程由阻塞隊列中摘下;</p><p> 第二步,修改進程狀態(tài)為就緒;</p><p> 第三步,鏈入就緒隊列,根據(jù)
35、情況決定是否轉向進程調度。</p><p> 2.3.12屏幕顯示</p><p><b> 屏幕顯示要求包括:</b></p><p><b> 顯示系統(tǒng)時鐘;</b></p><p> 顯示正在運行的進程的進程名、運行的指令、中間結果、相對時鐘寄存器內(nèi)容;</p><
36、p> 顯示就緒隊列中進程名;</p><p> 顯示阻塞隊列中進程名。</p><p> 2.3.13硬件工作的模擬</p><p> 硬件工作的模擬包括中央處理器的模擬、主要寄存器的模擬、中斷的模擬和時鐘的模擬四方面。</p><p> ?、僦醒胩幚砥鞯哪M。用函數(shù)CPU( )(該函數(shù)不能有參數(shù))模擬中央處理器。該函數(shù)主要負
37、責解釋“可執(zhí)行文件”中的命令。如:給x賦值x=?;x自加x++;x自減x--;申請設備和時間!??;程序結束end;</p><p> CPU只能解釋指令寄存器IR中的指令。一個進程的運行時要根據(jù)進程執(zhí)行的位置,將對應的指令存放到指令寄存器中。</p><p> ?、谥饕拇嫫鞯哪M用全局變量模擬重要寄存器,如cpu重要寄存器,程序狀態(tài)寄存器PSW、指令寄存器IR,程序計數(shù)器PC,數(shù)據(jù)緩
38、沖寄存器DR等。</p><p> ③中斷的模擬。中斷的發(fā)現(xiàn)應該是硬件的工作,這里在函數(shù)CPU中加檢測PSW的方式來模擬。在CPU()函數(shù)中,每執(zhí)行一條指令之前,先檢查PSW,判斷有無中斷,若有進行中斷處理,然后再運行解釋指令。CPU函數(shù)應該不斷循環(huán)執(zhí)行的。</p><p> 模擬中斷的種類有如下幾種:程序結束、時間片到、I/O中斷。程序結束(執(zhí)行指令end形成的中斷,軟中斷):將結果
39、寫入文件out,其中包括文件路徑名和x的值,調用進程撤銷原語撤銷進程,然后進行進程調度;I/O中斷(設備完成輸入輸出):將輸入輸出完成的進程喚醒,將等待該設備的一個進程同時喚醒。時鐘中斷:進程時間片用完,轉為就緒,重新進程調度。</p><p> ?、軙r鐘的模擬。系統(tǒng)中的絕對時鐘和相對時鐘用全局變量模擬。系統(tǒng)時鐘用來記錄開機以后的時間。 這里的系統(tǒng)時鐘并不是計算機的真正的時鐘,這里所說的時間只是一個單位
40、,例如使用vb中的時鐘控件實現(xiàn),每觸發(fā)一次timer事件,絕對時鐘增1,表示增加一個時間單位,絕對時鐘減1。</p><p><b> 2.4設備管理</b></p><p> 設備管理主要包括設備的分配和回收。</p><p> 模擬系統(tǒng)中有A、B、C三種獨占型設備,A設備3個,B設備2個,C設備1個。</p><p
41、> 設備分配:采用先來先服務策略。</p><p> 設備回收:回收設備后,要注意喚醒等待設備的進程。</p><p> 屏幕顯示:每個設備是否被使用,哪個進程在使用該設備,哪些進程在等待使用該設備。</p><p><b> 三 系統(tǒng)實現(xiàn)</b></p><p><b> 3.1程序主頁面&
42、lt;/b></p><p> 程序主頁面如圖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>();//就緒隊列</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();//就緒隊列</p><p> public static queue wait = new queue();//阻塞隊列</p><p> public static q
49、ueue empty = new queue();//空閑PCB隊列</p><p> public static int run;</p><p> public static EQ[] eq = new EQ[6];//設備數(shù)組</p><p> public int[] ETIME = new int[6]; //各個設備的時間</p>&
50、lt;p> public static int time = 0;//表示系統(tǒng)時間</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> 建立目錄首先要找到建立目錄的位置(父目錄),然后查找該目錄是否存在,如果父目錄不存在,不能建立,如果存在,查找是否存在同名目錄,存在,不能建立,不存在,則查找一個空目錄項,,為該目錄項申請一個盤塊,并填寫目錄內(nèi)容,初
54、始目錄有我的電腦和我的電腦下的磁盤C兩個目錄。目錄創(chuàng)建過程如圖3-2所示:</p><p> 創(chuàng)建一個目錄的命令如圖3-3所示:</p><p> 3.3.2刪除空目錄:</p><p> 刪除空目錄首先要找到該目錄,如果目錄不存在,刪除失敗;如果存在,但是,是非空目錄,顯示不能刪除,操作失??;若是空目錄,將目錄在樹形目錄和磁盤中刪除,如圖3-4所示:<
55、/p><p> 刪除一個空目錄的命令如圖3-5所示:</p><p><b> 3.3.3刪除目錄</b></p><p> 刪除目錄是在刪除空目錄的基礎上增加了刪除非空目錄的功能。首先檢查要刪除的目錄是否為空,若為空,調用刪除空目錄的函數(shù),將其刪除;若不為空,深度優(yōu)先遍歷以該目錄為根節(jié)點的子樹,將其孩子節(jié)點依次都刪除,最后調用刪除空目錄的函
56、數(shù),將該目錄刪除,就完成了刪除目錄的工作。</p><p> 3.3.4文件的創(chuàng)建與刪除</p><p> 文件的創(chuàng)建與刪除,是建立在目錄的創(chuàng)建與刪除基礎之上的。只需要調用建立和刪除目錄函數(shù),建立或刪除文件目錄。然后,將該文件插入到打開文件表中就完成了一個文件的建立,刪除則對應回收操作。</p><p> 文件的建立流程如圖3-6所示:</p>
57、<p> 新建一個文件的命令如圖3-7所示:</p><p> 文件的刪除流程如圖3-8所示:</p><p> 刪除一個文件的命令如圖3-9所示:</p><p> 3.3.5文件的存儲</p><p> 建立文件和目錄后,要求可以在磁盤上長期的保存。實現(xiàn)文件的長期存儲,是通過在自己電腦的外存上,動態(tài)建立文件來實現(xiàn)的,在
58、每次模擬的磁盤有內(nèi)容的改變的時候,將內(nèi)容寫到外存的文件一次,當系統(tǒng)再次重新啟動的時候,將外存中的文件內(nèi)容讀到模擬磁盤的數(shù)組中,就實現(xiàn)了簡單的文件的長期存儲,具體代碼如下:</p><p> public File_Function(int tag)</p><p><b> {</b></p><p><b> //</b
59、></p><p> // TODO: 在此處添加構造函數(shù)邏輯</p><p><b> //</b></p><p> //建立一個文件或文本文檔來模擬磁盤,初始化時如果文件為空,則磁盤第一二塊存儲FAT表,第三塊存儲根目錄,若文件不為空,則不修改文本。</p><p> path = @"E:
60、\流星操作系統(tǒng)\流星操作系統(tǒng)\disk.txt";//建立C盤</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//從磁盤中提取數(shù)據(jù)寫入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磁盤模擬</b></p><p> 根據(jù)成組連接法,將磁盤的空閑塊進行鏈接,空閑塊的分配和
65、回收都是針對專用塊來操作的,沒分配一塊后,把空閑塊數(shù)減1,但要把一組中的第一個空閑塊分配除去之前應該把登記在該塊中的下一組的塊號及塊數(shù)保存到專用快中(原專用塊中的信息已經(jīng)無用,因為它指示的一組空閑塊都已被分配)。當歸還一塊時,只要把歸還塊的塊號登記到專用塊的當前組中且將空閑塊數(shù)加1,如果當前組已經(jīng)滿10塊,則把專用塊中的內(nèi)容寫到歸還的那塊中,該歸還塊作為新組的第一塊。</p><p> 空閑塊的分配和回收都是針
66、對專用塊來操作的,沒分配一塊后,把空閑塊數(shù)減1,但要把一組中的第一個空閑塊分配除去之前應該把登記在該塊中的下一組的塊號及塊數(shù)保存到專用快中(原專用塊中的信息已經(jīng)無用,因為它指示的一組空閑塊都已被分配),如圖3-10所示:</p><p> 當歸還一塊時,只要把歸還塊的塊號登記到專用塊的當前組中且將空閑塊數(shù)加1,如果當前組已經(jīng)滿10塊,則把專用塊中的內(nèi)容寫到歸還的那塊中,該歸還塊作為新組的第一塊,如圖3-11所示
67、:</p><p> 磁盤使用情況用文件分配表來記錄:磁盤有多少塊,該表就有多少項,某文件的一個磁盤塊號為i,則這個文件的下一個磁盤塊的塊號記錄在表的第i項。如圖3-12是空閑塊位示圖法示意圖:</p><p> 磁盤的狀態(tài)在每次分配和回收磁盤塊的函數(shù)過程中實現(xiàn),每分配一個空閑塊,將相應label由藍色改為棕色,表示該磁盤塊已經(jīng)被占用;每回收一塊磁盤塊的時候,將相應label由棕色改為
68、藍色,表示該磁盤塊空閑。如圖3-13所示:</p><p><b> 3.4用戶接口</b></p><p> 用戶接口包括命令接口和圖形接口兩種,命令接口要求用戶輸入規(guī)定格式的文字命令,系統(tǒng)判斷輸入是否正確采取相關操作。圖形借口相比于命令接口比較方便,用戶不必輸入命令,直接選擇菜單項進行操作。用戶接口如圖3-14所示:</p><p>
69、 命令接口流程圖如圖3-15所示:</p><p> 圖形接口流程如圖3-16所示:</p><p><b> 3.5進程管理</b></p><p> 進程管理頁面如圖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)分配算法進行分配,作業(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ū)登記項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ū),返回錯誤信息</p><
73、;p> return -1;</p><p> //找到可用空閑區(qū),開始分配,若空閑區(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) //沒有找到空表目</p><p>
78、<b> {</b></p><p> if (free_table[k].flag == 0) //若沒有空的已分分區(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> //申請內(nèi)存成功,返回起始地址</p><p> return ad;</p><p><b> }</b></p><p><b> }</b></p><p> 當所剩內(nèi)存不足時會出現(xiàn)報錯,如圖3-18所示</p><p> 內(nèi)存模擬
84、頁面如圖如圖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ū)表中的對應登記項</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)//回收失敗 沒找到進程</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ū),合并三項</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進程調度函數(shù):</p><p> 采用時間片輪轉調度算法,時間片為5。 </p><p> 進程調度函數(shù)的主要工作是:</p><p> 第一步,將正在運行的進程保存在該進程對應進程控制塊中;</p>
100、<p> 第二步,從就緒隊列中選擇一個進程;</p><p> 第三步,將這個進程中進程控制塊中記錄的各寄存器內(nèi)容恢復到CPU各個寄存器內(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) //就緒隊列中無進程可調度</p><p><b> return 0;</b></p><p> else //有進程可調度&
102、lt;/p><p><b> {</b></p><p> i = ready.head;//記錄取走的</p><p> if (pcb[ready.head].next == -1)//就緒隊列只有一個進程了,取走后為空</p><p> ready.tail = ready.head = -1;</p&g
103、t;<p> else //就緒隊列中不只剩下一個進程</p><p><b> {</b></p><p> ready.head = pcb[ready.head].next;</p><p><b> }</b></p><p> //顯示就緒隊列中的進程</p&
104、gt;<p><b> j = 0;</b></p><p> h = ready.head;</p><p> if (ready.head != -1)//有進程</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;//設置時間片</p><p> textBox12.Text =
108、TIME.ToString();</p><p> timer3.Enabled = true;//控制時間片的</p><p> //恢復該進程現(xiàn)場信息</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> //修改指向運行進程的指針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ù)主要負責解釋“可執(zhí)行文件”中的命令。如:給x賦值x=?;x自加x++;x自減x--;申請設備和時間!??;程序結束end;</p><p> CPU只能解釋指令寄存器IR中的指令。一個進程的運行時要根據(jù)進程執(zhí)行的位置,將對應的指令存放到指令寄存器中。</p><p> ?、谥饕拇嫫鞯哪M用全局變量模擬重要寄
112、存器,如cpu重要寄存器,程序狀態(tài)寄存器PSW、指令寄存器IR,程序計數(shù)器PC,數(shù)據(jù)緩沖寄存器DR等。</p><p> ?、壑袛嗟哪M。中斷的發(fā)現(xiàn)應該是硬件的工作,這里在函數(shù)CPU中加檢測PSW的方式來模擬。在CPU()函數(shù)中,每執(zhí)行一條指令之前,先檢查PSW,判斷有無中斷,若有進行中斷處理,然后再運行解釋指令。CPU函數(shù)應該不斷循環(huán)執(zhí)行的。</p><p> 模擬中斷的種類有如下幾種
113、:程序結束、時間片到、I/O中斷。程序結束(執(zhí)行指令end形成的中斷,軟中斷):將結果寫入文件out,其中包括文件路徑名和x的值,調用進程撤銷原語撤銷進程,然后進行進程調度;I/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> //沒有中斷</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)//沒有運行的進程</p><p><b> {</b></p><p> s = sh
116、eduling();//調度新進程</p><p> if (s == 0)//就緒隊列為空,調用閑逛進程</p><p><b> {</b></p><p><b> a = 0;</b></p><p> textBox3.Text = "閑逛進程";</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)//還有進程</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; //記錄需要占用設備多長時間</p><p> eq = IR[1];&
126、lt;/p><p> AppEquip(eq, run, a);//調用設備申請函數(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//有中斷時</p><p><b> {</b></
129、p><p> if (PSW == 1)// 程序結束</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中斷歸還設備 {</p><p><b> PSW = 0;</b></p><p> textBox4.Text = "處理I/O中斷!";</
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 模擬操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計--模擬操作系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)模擬進程課程設計
- 操作系統(tǒng)課程設計-- 操作系統(tǒng)
- 操作系統(tǒng)程序設計課程設計報告-操作系統(tǒng)模擬實現(xiàn)
- 操作系統(tǒng)課程設計---作業(yè)調度模擬
- 操作系統(tǒng)課程設計-進程調度模擬
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計-模擬銀行家算法-課程設計
- 操作系統(tǒng)課程設計-假脫機技術模擬
- 操作系統(tǒng)課程設計——進程調度模擬算法
- 操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計--模擬文件系統(tǒng)
- 《操作系統(tǒng)》課程設計-- 模擬文件管理系統(tǒng)
- 操作系統(tǒng)課程設計-磁盤調度模擬法
評論
0/150
提交評論