第一篇:操作系統(tǒng)調(diào)研報(bào)告
操作系統(tǒng)調(diào)研報(bào)告
隨著日常生活的數(shù)字化發(fā)展,計(jì)算機(jī)作成為了工作、學(xué)習(xí)、娛樂(lè)所不可或缺的一部分,而操作系統(tǒng)通過(guò)組織和管理軟硬件資源,使之協(xié)調(diào)一致并高效地完成各種用戶的工作,成為現(xiàn)代電腦必不可少的系統(tǒng)軟件,是電腦的靈魂所在。從設(shè)計(jì)者角度看,操作系統(tǒng)是計(jì)算機(jī)軟硬件資源的管理和控制機(jī)構(gòu),其目的是充分利用軟硬件資源;從用戶角度看,操作為用戶提供了方便簡(jiǎn)單的使用計(jì)算機(jī)的環(huán)境。因此本次關(guān)于操作系統(tǒng)的調(diào)研,我們著眼于操作系統(tǒng)提供的各種接口,通過(guò)分析操作系統(tǒng)提供的各種接口,更深入的了解操作系統(tǒng)的組成,了解操作系統(tǒng)的原理,從而提高我們對(duì)計(jì)算機(jī)這一系統(tǒng)整體上的認(rèn)識(shí),具體的認(rèn)識(shí)、深入的了解計(jì)算機(jī)的工作方式、原理。同時(shí),對(duì)我們以后在使用計(jì)算機(jī)進(jìn)行工作與學(xué)習(xí)時(shí)遇到問(wèn)題快速準(zhǔn)確的解決提供一些幫助。因?yàn)?,操作系統(tǒng)管理了所有的計(jì)算機(jī)資源,一切的應(yīng)用軟件都是運(yùn)行于基礎(chǔ)之上的。
操作系統(tǒng)提供給用戶的接口,隨著操作系統(tǒng)的發(fā)展逐漸的發(fā)展著。最初,操作系統(tǒng)是沒(méi)有提供圖形化的接口給用戶,那個(gè)時(shí)候使用計(jì)算機(jī)就是一種復(fù)雜而麻煩的事,需要使用者花費(fèi)大量的時(shí)間在學(xué)習(xí)命令及其使用之上,而不是將時(shí)間專注與利用計(jì)算機(jī)以及操作系統(tǒng)這一工具解決其他的問(wèn)題。也因此,在圖形化的界面沒(méi)有出現(xiàn)以前,計(jì)算機(jī)大都應(yīng)用于專業(yè)人群之中,應(yīng)用于對(duì)計(jì)算機(jī)有深入了解的用戶之中。到如今,大家以及很習(xí)慣于通過(guò)圖形化界面,通過(guò)鼠標(biāo)來(lái)使用計(jì)算機(jī)。但,我覺(jué)得對(duì)于命令式的接口,我們還是有必要做一定的了解。同時(shí),操作系統(tǒng)還有另外一種接口,即程序接口。實(shí)際上命令接口與圖形接口的實(shí)現(xiàn)都是依賴于程序接口。顧名思義,程序接口是提供給程序用的。一下分別介紹這三種接口。
命令接口
在當(dāng)前幾乎所有的計(jì)算機(jī),包括大、中型機(jī)到微型機(jī)的操作系統(tǒng)都向用戶提供了命令接口,以實(shí)現(xiàn)用戶與計(jì)算機(jī)之間的交互。命令接口可以理解為計(jì)算機(jī)為了與用戶溝通所使用的語(yǔ)言,用戶使用命令接口來(lái)與計(jì)算機(jī)進(jìn)行交互時(shí),首先必須在終端上鍵入正確的操作命令,由終端處理程序接收用戶鍵入的命令,并將它顯示在終端屏幕上。當(dāng)一條命令輸入完成后,操作系統(tǒng)的命令解釋程序?qū)τ脩糨斎氲拿钸M(jìn)行分析,然后執(zhí)行相應(yīng)的命令處理程序。操作系統(tǒng)的命令接口都應(yīng)包括一組命令、終端處理程序和命令解釋程序。其中,命令解釋程序的主要作用是在屏幕上給出提示符,請(qǐng)求用戶輸入命令,然后讀入命令,并識(shí)別命令,再轉(zhuǎn)到相應(yīng)的命令處理程序去執(zhí)行,并將處理結(jié)果送屏幕上顯示。若用戶鍵入的命令有錯(cuò),命令解釋程序未能識(shí)別,或在執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,則顯示出錯(cuò)信息。并將處理結(jié)果送屏幕上顯示。
對(duì)DOS來(lái)說(shuō),命令行程序分為內(nèi)部命令和外部命令,內(nèi)部命令是隨command.com裝入內(nèi)存的,而外部命令是一條一條單獨(dú)的可執(zhí)行文件。內(nèi)部命令都集中在根目錄下的command.com文件里,電腦每次啟動(dòng)時(shí)都會(huì)將這個(gè)文件讀入內(nèi)存,也就是說(shuō)在電腦運(yùn)行時(shí),這些內(nèi)部命令都駐留在內(nèi)存中,用dir命令是看不到這些內(nèi)部命令的。外部命令都是以一個(gè)個(gè)獨(dú)立的文件存放在磁盤上的,它們都是以com和exe為后綴的文件,例如我們常用的一些可執(zhí)行文件,它們并不常駐內(nèi)存,只有在電腦需要時(shí),才會(huì)被調(diào)入內(nèi)存。
大家比較熟悉的命令解釋程序有MS-DOS/windows 98的command.com,windows 2000/xp/vista/7的cmd.exe以及UNIX/Linux的shell程序。
圖形接口
圖形用戶界面或圖形用戶接口(Graphical User Interface,GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作環(huán)境用戶接口。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來(lái)說(shuō)更為簡(jiǎn)便易用。GUI的廣泛應(yīng)用是當(dāng)今計(jì)算機(jī)發(fā)展的重大成就之一,它極大地方便了非專業(yè)用戶的使用人們從此不再需要死記硬背大量的命令,取而代之的是可用用通過(guò)窗口、菜單、按鍵等方式來(lái)方便地進(jìn)行操作。
圖形接口的組成一般如下:
桌面:在啟動(dòng)時(shí)顯示,也是界面中最底層,有時(shí)也指代包括窗口、文件瀏覽器在內(nèi)的“桌面環(huán)境”。在桌面上由于可以重疊顯示窗口,因此可以實(shí)現(xiàn)多任務(wù)化。一般的界面中,桌面上放有各種應(yīng)用程序和數(shù)據(jù)的圖標(biāo),用戶可以依此開(kāi)始工作。桌面與既存的文件夾構(gòu)成里面相違背,所以要以特殊位置的文件夾的參照形式來(lái)定義內(nèi)容。
視窗:應(yīng)用程序?yàn)槭褂脭?shù)據(jù)而在圖形用戶界面中設(shè)置的基本單元。應(yīng)用程序和數(shù)據(jù)在窗口內(nèi)實(shí)現(xiàn)一體化。在窗口中,用戶可以在窗口中操作應(yīng)用程序,進(jìn)行數(shù)據(jù)的管理、生成和編輯。通常在窗口四周設(shè)有菜單、圖標(biāo),數(shù)據(jù)放在中央。
在窗口中,根據(jù)各種數(shù)據(jù)/應(yīng)用程序的內(nèi)容設(shè)有標(biāo)題欄,一般放在窗口的最上方,并在其中設(shè)有最大化、最小化(隱藏窗口,并非消除數(shù)據(jù))、最前面、縮進(jìn)(僅顯示標(biāo)題欄)等動(dòng)作按鈕,可以簡(jiǎn)單地對(duì)窗口進(jìn)行操作。
單一文件界面(Single Document Interface)
在窗口中,一個(gè)數(shù)據(jù)在一個(gè)窗口內(nèi)完成的方式。在這種情況下,數(shù)據(jù)和顯示窗口的數(shù)量是一樣的。若要在其他應(yīng)用程序的窗口使用數(shù)據(jù),將相應(yīng)生成新的窗口。因此窗口數(shù)量多,管理復(fù)雜。
多文件界面(Multiple Document Interface)
在一個(gè)窗口之內(nèi)進(jìn)行多個(gè)數(shù)據(jù)管理的方式。這種情況下,窗口的管理簡(jiǎn)單化,但是操作變?yōu)殡p重管理。
標(biāo)簽:多文件界面的數(shù)據(jù)管理方式中使用的一種界面,將數(shù)據(jù)的標(biāo)題在窗口中并排,通過(guò)選擇標(biāo)簽標(biāo)題顯示必要的數(shù)據(jù),這樣使得接入數(shù)據(jù)方式變得更為便捷。
上述中,多文件界面主要是微軟視窗系統(tǒng)采用。而在其他環(huán)境中,通常多是單文件界面,所以無(wú)所謂單一/多文件界面的稱呼問(wèn)題。
菜單:將系統(tǒng)可以執(zhí)行的命令以階層的方式顯示出來(lái)的一個(gè)界面。一般置于畫(huà)面的最上方或者最下方,應(yīng)用程序能使用的所有命令幾乎全部都能放入。重要程度一般是從左到右,越往右重要度越低。命定的層次根據(jù)應(yīng)用程序的不同而不同,一般重視文件的操作、編輯功能,因此放在最左邊,然后往右有各種設(shè)置等操作,最右邊往往設(shè)有幫助。一般使用鼠標(biāo)的第一按鈕進(jìn)行操作。
即時(shí)菜單:與應(yīng)用程序準(zhǔn)備好的層次菜單不同,在菜單欄以外的地方,通過(guò)鼠標(biāo)的第二按鈕調(diào)出的菜單稱為“即時(shí)菜單”。根據(jù)調(diào)出位置的不同,菜單內(nèi)容即時(shí)變化,列出所指示的對(duì)象目前可以進(jìn)行的操作。
圖標(biāo):顯示在管理數(shù)據(jù)的應(yīng)用程序中的數(shù)據(jù),或者顯示應(yīng)用程序本身。數(shù)據(jù)管理程序,即在文件夾中用戶數(shù)據(jù)的管理、進(jìn)行特定數(shù)據(jù)管理的程序的情況下,數(shù)據(jù)通過(guò)圖標(biāo)顯示出來(lái)。通常情況下顯示的是數(shù)據(jù)的內(nèi)容或者與數(shù)據(jù)相關(guān)聯(lián)的應(yīng)用程序的圖案。另外,點(diǎn)擊數(shù)據(jù)的圖標(biāo),一般可以之間完成啟動(dòng)相關(guān)應(yīng)用程序以后再顯示數(shù)據(jù)本身這兩個(gè)步驟的工作。應(yīng)用程序的圖標(biāo)只能用于啟動(dòng)應(yīng)用程序。
按鈕:菜單中,利用程度高的命令用圖形表示出來(lái),配置在應(yīng)用程序中,成為按鈕。應(yīng)用程序中的按鈕,通常可以代替菜單。一些使用程度高的命令,不必通過(guò)菜單一層層
翻動(dòng)才能調(diào)出,極大提高了工作效率。但是,各種用戶使用的命令頻率是不一樣的,因此這種配置一般都是可以由用戶自定義編輯。
回收站:為了實(shí)現(xiàn)文件刪除的“假安全“功能而設(shè)置了”回收站“(垃圾桶)功能。在文件刪除的時(shí)候,暫時(shí)將其移動(dòng)到系統(tǒng)特定的地方,一旦用戶發(fā)現(xiàn)刪除錯(cuò)誤,還可以將其找回,從而實(shí)現(xiàn)防止錯(cuò)誤刪除的目的。在麥金塔系統(tǒng)中,垃圾桶不僅可以刪除文件,還可以進(jìn)行各種各樣對(duì)象的刪除功能,如將可移動(dòng)硬盤從系統(tǒng)中移出,將光盤從光驅(qū)中取出等等。
應(yīng)用程序啟動(dòng)器:從圖形界面上啟動(dòng)應(yīng)用程序有很多方式,有好幾種操作系統(tǒng)都采用菜單形式的程序啟動(dòng)器。NEXTSTEP和Mac OS X中有一種稱為dock的操作面板型的工具,可以存放各種文件和應(yīng)用程序的信息,并通過(guò)鼠標(biāo)點(diǎn)擊調(diào)出。
圖形用戶界面的任務(wù)管理
在圖形用戶界面中,用戶操作是以窗口為單位的。除了MDI和Mac OS以外,大多都是“窗口數(shù)量=任務(wù)數(shù)量”。因此在看整體界面的時(shí)候,怎樣進(jìn)行任務(wù)管理是很重要的。Windows等操作系統(tǒng)中,最常用的方式是在桌面上設(shè)置一個(gè)棒狀的”任務(wù)欄“,放置各種窗口的圖標(biāo)和標(biāo)題,確保系統(tǒng)的可操作性和可視性,方便對(duì)窗口進(jìn)行管理。其他的方法包括,在桌面上的菜單中添加各個(gè)窗口管理菜單,在桌面上顯示任務(wù)的圖標(biāo),用虛擬桌面的方式表面增加桌面的數(shù)量等等。在Mac OS X系統(tǒng)中使用Dock進(jìn)行任務(wù)管理,但是還有Exposé進(jìn)行窗口一覽顯示模式的功能。
指針設(shè)備的操作:圖形用戶界面的基本操作是,用指針設(shè)備(一般是鼠標(biāo))進(jìn)行指示操作,然后使用設(shè)備上的按鈕(通常為兩到三個(gè))進(jìn)行動(dòng)作的激活。因此”位置“和”指示“都非常明了,從而實(shí)現(xiàn)可視操作。
指示的內(nèi)容根據(jù)位置而不同。在數(shù)據(jù)管理應(yīng)用程序中,第一按鈕進(jìn)行指針?biāo)谖恢脭?shù)據(jù)的選擇,而兩次連續(xù)按鈕(所謂“雙擊”)可以調(diào)出預(yù)制的應(yīng)用程序開(kāi)始處理數(shù)據(jù)。第二按鈕通常用來(lái)顯示即時(shí)菜單。第二按鈕調(diào)出的菜單可以再用第一按鈕進(jìn)行選擇打操作。第三按鈕在X Window System中比較常用。另外,最近四鍵、五鍵鼠標(biāo)相繼問(wèn)世,各個(gè)按鈕可以在操作系統(tǒng)中進(jìn)行動(dòng)作定義。
程序接口
程序接口即應(yīng)用編程接口,應(yīng)用編程接口允許應(yīng)用程序調(diào)用操作系統(tǒng)的服務(wù)和功能。程序接口由一組系統(tǒng)調(diào)用組成,用戶程序使用“系統(tǒng)調(diào)用”就可獲得操作系統(tǒng)的底層服務(wù),使用或訪問(wèn)系統(tǒng)的各種軟硬件資源從某種角度上看,進(jìn)行系統(tǒng)調(diào)用就象進(jìn)行一個(gè)特殊的過(guò)程調(diào)用。但是,系統(tǒng)調(diào)用的實(shí)現(xiàn)與一般的過(guò)程調(diào)用的實(shí)現(xiàn)相比,兩者間有很大的差異。系統(tǒng)調(diào)用可以進(jìn)入操作系統(tǒng)內(nèi)核,而過(guò)程調(diào)用則不能進(jìn)入操作系統(tǒng)的內(nèi)核。對(duì)于系統(tǒng)調(diào)用,控制是由原來(lái)的用戶態(tài)轉(zhuǎn)換為系統(tǒng)態(tài),這是借助于中斷和陷入機(jī)制來(lái)完成的,在該機(jī)制中包括中斷和陷入硬件機(jī)構(gòu)和中斷和陷入處理程序兩部分系統(tǒng)調(diào)用的格式隨計(jì)算機(jī)的不同而不同,但對(duì)任何不同的計(jì)算機(jī)都有以下共同的特點(diǎn):
(1)每個(gè)系統(tǒng)調(diào)用對(duì)應(yīng)一個(gè)功能號(hào),要調(diào)用操作系統(tǒng)的某一特定例程,必須在指令中給出對(duì)應(yīng)的功能號(hào)。
(2)按功能號(hào)實(shí)現(xiàn)調(diào)用的過(guò)程大體相同,即都是通過(guò)對(duì)功能號(hào)的解釋分別轉(zhuǎn)入對(duì)應(yīng)例行子程序。
對(duì)于程序接口,主要是提供給程序調(diào)用的。一般用戶不會(huì)接觸到。
第二篇:實(shí)時(shí)操作系統(tǒng)報(bào)告
實(shí)時(shí)操作系統(tǒng)課程實(shí)驗(yàn)報(bào)告
專業(yè):通信1001 學(xué)號(hào):3100601025 姓名:陳治州
完成時(shí)間:2013年6月11日
實(shí)驗(yàn) 簡(jiǎn)易電飯煲的模擬
一.實(shí)驗(yàn)?zāi)康模?/p>
掌握在基于嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II的應(yīng)用中,基于多任務(wù)的模式的編程方法。鍛煉綜合應(yīng)用多任務(wù)機(jī)制,任務(wù)間的通信機(jī)制,內(nèi)存管理等的能力。
二.實(shí)驗(yàn)要求:
1.按“S”開(kāi)機(jī),系統(tǒng)進(jìn)入待機(jī)狀態(tài),時(shí)間區(qū)域顯示當(dāng)前北京時(shí)間,默認(rèn)模式“煮飯”;2.按“C”選擇模式,即在“煮飯”、“煮粥”和“煮面”模式中循環(huán)選擇;
3.按“B”開(kāi)始執(zhí)行模式命令,“開(kāi)始”狀態(tài)選中,時(shí)間區(qū)域開(kāi)始倒計(jì)時(shí),倒計(jì)時(shí)完成后進(jìn)入“保溫”狀態(tài),同時(shí)該狀態(tài)顯示選中,時(shí)間區(qū)域顯示保溫時(shí)間;
4.按“Q”取消當(dāng)前工作狀態(tài),系統(tǒng)進(jìn)入待機(jī)狀態(tài),時(shí)間區(qū)域顯示北京時(shí)間,模式為當(dāng)前模式;
5.按“X”退出系統(tǒng),時(shí)間區(qū)域不顯示。
6.煮飯時(shí)長(zhǎng)為30,煮粥時(shí)長(zhǎng)為50,煮面時(shí)長(zhǎng)為40.三.實(shí)驗(yàn)設(shè)計(jì):
1.設(shè)計(jì)思路:
以老師所給的五個(gè)程序?yàn)榛A(chǔ),看懂每個(gè)實(shí)驗(yàn)之后,對(duì)borlandc的操作有了大概的認(rèn)識(shí),重點(diǎn)以第五個(gè)實(shí)驗(yàn)Task_EX為框架,利用其中界面顯示與按鍵掃描以及做出相應(yīng)的響應(yīng),對(duì)應(yīng)實(shí)現(xiàn)此次實(shí)驗(yàn)所需要的功能。
本次實(shí)驗(yàn)分為界面顯示、按鍵查詢與響應(yīng)、切換功能、時(shí)鐘顯示與倒計(jì)時(shí)模塊,綜合在一起實(shí)驗(yàn)所需功能。2.模塊劃分圖:(1)界面顯示:
Main()Taskstart()Taskstartdispinit()在TaskStartDispInit()函數(shù)中,使用PC_DispStr()函數(shù)畫(huà)出界面。(2)按鍵查詢與響應(yīng):
Main()Taskstart()在TaskStart()函數(shù)中,用if(PC_GetKey(&key)== TRUE)判斷是否有按鍵輸入。然后根據(jù)key的值,判斷輸入的按鍵是哪一個(gè);在響應(yīng)中用switch語(yǔ)句來(lái)執(zhí)行對(duì)應(yīng)按鍵的響應(yīng)。(3)切換功能:
l計(jì)數(shù)“C”按鍵的次數(shù)M=l%3Switch(m)M=0,1,2對(duì)應(yīng)于煮飯,煮粥,煮面,然后使用PC_DispStr()函數(shù)在選擇的選項(xiàng)前畫(huà)上“@”指示,同時(shí),在其余兩項(xiàng)錢畫(huà)上“ ”以“擦出”之前畫(huà)下的“@”,注意l自增。
四.主要代碼:
#include “stdio.h” #include “includes.h” #include “time.h” #include “dos.h” #include “sys/types.h” #include “stdlib.h” #define TASK_STK_SIZE
512
#define N_TASKS
OS_STK
TaskStk[N_TASKS][TASK_STK_SIZE];
OS_STK
TaskStartStk[TASK_STK_SIZE];
INT8U
TaskData[N_TASKS];
void Task0(void *pdata);
void TaskStart(void *pdata);
static void TaskStartDispInit(void);
void main(void){
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);
OSTaskCreate(TaskStart,(void *)0, &TaskStartStk[TASK_STK_SIZE-1], 4);
OSStart();
} void TaskStart(void *pdata){ #if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;#endif
INT8U l,m;
INT16S key;
l=0;
pdata = pdata;
TaskStartDispInit();
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
for(;;){
if(PC_GetKey(&key)== TRUE)
{
switch(key)
{
case 0x1B:
PC_DOSReturn();
break;
case 0x43:
{ m=(l%3);
switch(m)
{ case 0: {
PC_DispStr(26,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;
case 1: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(40,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;case 2: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);}
break;}
l++;} break;
} } OSCtxSwCtr = 0;
OSTimeDlyHMSM(0, 0, 1, 0);
} } static void TaskStartDispInit(void){ PC_DispStr(0, 0, “
uC/OS-II, The Real-Time Kernel
”, DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);PC_DispStr(0, 1, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 2, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 3, “
dianfanbao shiyan
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 4, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 5, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 6, “
kai shi.zhu fan.zhu zhou.zhu mian.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 7, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 8, “
bao wen.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 9, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 10, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 11, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 12, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 13, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 14, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 15, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 16, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 17, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 18, “
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 19, “ 'S':kai ji.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 20, “ 'C':mo shi qie huan.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 21, “ 'B':kai shi zhi xin.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 22, “ 'Q':qu xiao dang qian gong zuo zhuang tai.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 23, “ 'X':tui chu xi tong.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
PC_DispStr(0, 24, “
<-PRESS 'ESC' TO QUIT->
”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);}
五.運(yùn)行界面:
(1)主界面:
(2)顯示北京時(shí)間:
(3)模式切換:
(4)倒計(jì)時(shí):
(5)保溫執(zhí)行時(shí)間:
六.總結(jié):
本次實(shí)驗(yàn)主要以老師所給的實(shí)驗(yàn)事例為基礎(chǔ),并結(jié)合老師課堂講的內(nèi)容,理解編寫(xiě)程序。做實(shí)驗(yàn)本實(shí)驗(yàn)前,先執(zhí)行了一下事例程序,以此了解borlandc的一些基本操作;然后就是看懂每個(gè)實(shí)驗(yàn)的框架和主要部分;接著,將事例程序中的部分思想運(yùn)用到本次實(shí)驗(yàn)中,其中以顯示界面的思想運(yùn)用的最多;除此以外,在模式切換上花了最大的精力,最終的解決方法是以變量l作為一個(gè)計(jì)數(shù)值,并運(yùn)用switch語(yǔ)句在選擇的模式上畫(huà)上“@”,同時(shí)還得注意在未選擇的模式上畫(huà)上空格來(lái)“擦除”之前畫(huà)上的@;在查詢按鍵上,同樣運(yùn)用switch語(yǔ)句......這次實(shí)驗(yàn)收獲不少,不僅對(duì)之前學(xué)的C語(yǔ)言有了更進(jìn)一步的鞏固,而且還強(qiáng)化了ucos里面的多任務(wù)的一些認(rèn)識(shí);同時(shí),以前對(duì)DOS界面很陌生,但本次實(shí)驗(yàn)使用的正是DOS界面,通過(guò)幾天的經(jīng)歷,對(duì)DOS中的編譯、“help”等各個(gè)方面有了更深入的認(rèn)識(shí),不再害怕使用DOS了。
對(duì)本課程有很大的興趣,在以后的課余時(shí)間里我會(huì)不斷學(xué)習(xí)這些知識(shí)。
第三篇:操作系統(tǒng)課程設(shè)計(jì)報(bào)告
課程設(shè)計(jì)報(bào)告
題 目: 模擬請(qǐng)求頁(yè)式管理
課程名稱: 計(jì)算機(jī)操作系統(tǒng) 學(xué) 院: 信息工程學(xué)院
專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)
班 級(jí): 14計(jì)本(1)學(xué)生姓名: * * * 學(xué) 號(hào): 201403031** 指導(dǎo)教師: * * 成 績(jī):
開(kāi)課時(shí)間: 2016-2017 學(xué)年 一 學(xué)期
模擬請(qǐng)求頁(yè)式管理
第1章 需求分析
1.1設(shè)計(jì)要求
請(qǐng)求頁(yè)式管理是一種常用的虛擬存儲(chǔ)管理技術(shù)。本設(shè)計(jì)通過(guò)請(qǐng)求頁(yè)式存儲(chǔ)管理中頁(yè)面置換算法模擬設(shè)計(jì),了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握請(qǐng)求頁(yè)式管理的頁(yè)面置換算法。本實(shí)驗(yàn)要求用Vc++或其他高級(jí)語(yǔ)言編寫(xiě)和調(diào)試。
編寫(xiě)程序?qū)崿F(xiàn):
(1)先進(jìn)先出頁(yè)面置換算法(FIFO)(2)最近最久未使用頁(yè)面置換算法(LRU)最佳置換頁(yè)面置換算法(OPT)設(shè)計(jì)一個(gè)虛擬存儲(chǔ)區(qū)和內(nèi)存工作區(qū),編程序演示以上三種算法的具體實(shí)現(xiàn)過(guò)程,并計(jì)算訪問(wèn)命中率。
1.2解決方案
首先確定實(shí)現(xiàn)語(yǔ)言使用c#實(shí)現(xiàn)圖形化界面,后確定要實(shí)現(xiàn)哪些功能,比如算法選擇,頁(yè)面添加,模擬控制。然后確定輸出結(jié)構(gòu)以便于程序的測(cè)試和驗(yàn)證。將基本框架建立后再進(jìn)行編程。編程前進(jìn)行算法結(jié)構(gòu)分析最后編程實(shí)現(xiàn)。
1.3算法實(shí)現(xiàn)原理
1、先進(jìn)先出置換算法(FIFO):
發(fā)生缺頁(yè)中斷時(shí)按照頁(yè)面進(jìn)入內(nèi)存順序總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面。
2、最近最久未使用置換算法(LRU):
發(fā)生缺頁(yè)中斷時(shí)總是淘汰存在內(nèi)存中最長(zhǎng)時(shí)間未被使用的頁(yè)面。
3、最佳置換算法(OPT):
發(fā)生缺頁(yè)中斷時(shí)若一個(gè)或幾個(gè)頁(yè)面將來(lái)將不會(huì)被調(diào)用則按先進(jìn)先出原則淘汰頁(yè)面,若將來(lái)都有調(diào)用則比較調(diào)用時(shí)刻選擇最遠(yuǎn)時(shí)刻頁(yè)面淘汰。
4、缺頁(yè)率:缺頁(yè)次數(shù)占頁(yè)面調(diào)用次數(shù)的百分比。
第2章 概要設(shè)計(jì)
2.1數(shù)據(jù)設(shè)計(jì)
常變量:調(diào)用頁(yè)面最大數(shù)量(MaxN),內(nèi)存最大頁(yè)面數(shù)(MaxM)待調(diào)用頁(yè)面數(shù)組:page_dd[MaxN]存放等待調(diào)用的頁(yè)面號(hào)
頁(yè)面數(shù)組專用指針 page_p,用于指向page_dd數(shù)組中正需調(diào)入內(nèi)存的頁(yè)號(hào) 內(nèi)存塊數(shù)組:Memery[MaxM],存放內(nèi)存當(dāng)前存放的頁(yè)號(hào) 缺頁(yè)計(jì)數(shù)器:count,記錄缺頁(yè)次數(shù)
內(nèi)存塊狀態(tài)數(shù)組:M1[MaxN],M2[MaxN],M3[MaxN],記錄每次頁(yè)面調(diào)用結(jié)束后內(nèi)存各塊的狀態(tài)
缺頁(yè)記錄數(shù)組s[MaxN],用于記錄頁(yè)面調(diào)用時(shí)是否產(chǎn)生缺頁(yè)中斷,初始化為是
2.2函數(shù)設(shè)計(jì)
1、頁(yè)面添加函數(shù):void btnAdd_Click(object sender, EventArgs e)用于實(shí)現(xiàn)通過(guò)點(diǎn)擊按鈕實(shí)現(xiàn)數(shù)據(jù)輸入。
2、內(nèi)存初始化函數(shù):init(int[] a, int[] b,int []m1,int[]m2,int[]m3)參數(shù)有頁(yè)面數(shù)組、內(nèi)存數(shù)組、狀態(tài)數(shù)組,采用先進(jìn)先出算法對(duì)內(nèi)存先進(jìn)行裝滿 服務(wù)于先進(jìn)先出頁(yè)面置換函數(shù)和最佳置換函數(shù)。
3、輸出函數(shù):void display(int[]a,int[]m1,int[]m2,int[]m3,char[]c)用于輸出模擬結(jié)果,參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組,狀態(tài)數(shù)組,缺頁(yè)記錄數(shù)組。再模擬之后調(diào)用。
4、模擬控制函數(shù):void btnmo_Click(object sender, EventArgs e)用于實(shí)現(xiàn)通過(guò)單擊模擬按鈕,根據(jù)用戶所選算法進(jìn)行模擬并顯示結(jié)果。
5、先進(jìn)先出算法模擬函數(shù):
void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s)用于實(shí)現(xiàn)先進(jìn)先出算法模擬,參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組、內(nèi)存狀態(tài)記錄數(shù)組,缺頁(yè)記錄數(shù)組。在模擬函數(shù)中調(diào)用。
6、最近最久未使用算法模擬函數(shù):
void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于 3 實(shí)現(xiàn)最近最久未使用算法模擬,參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組,內(nèi)存狀態(tài)記錄數(shù)組,缺頁(yè)記錄數(shù)組。在模擬函數(shù)中被調(diào)用。
7、最近最久未使用函數(shù)輔助函數(shù):void LUR_I(int[] a,int e)用于對(duì)最近最久未使用算法中所用輔助數(shù)組(記錄頁(yè)面存在時(shí)長(zhǎng))進(jìn)行調(diào)整,參數(shù)有輔助數(shù)組及需調(diào)整的數(shù)據(jù)下標(biāo)。在最近最久未使用函數(shù)中調(diào)用。
8、最佳置換算法模擬函數(shù):
void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于模擬最佳置換算法。參數(shù)有頁(yè)面數(shù)組,內(nèi)存數(shù)組,內(nèi)存狀態(tài)記錄數(shù)組,缺頁(yè)記錄數(shù)組。在模擬函數(shù)中被調(diào)用。
9、最佳置換算法輔助函數(shù):void OPT_F(int[] a, int e)用于對(duì)最佳置換算法中的輔助數(shù)組進(jìn)行調(diào)整。參數(shù)有輔助數(shù)組,需調(diào)整數(shù)據(jù)下標(biāo)。在最佳置換算法中被調(diào)用。
10、重置函數(shù):void btncz_Click(object sender, EventArgs e)用于重新選擇算法進(jìn)行新的模擬。
2.3主要算法設(shè)計(jì)
1、初始化函數(shù)算法:
第一步:將第一個(gè)頁(yè)面調(diào)入內(nèi)存,調(diào)整最佳置換算法輔助數(shù)組,缺頁(yè)計(jì)數(shù)器加一,保存內(nèi)存數(shù)組狀態(tài)。
第二步:調(diào)用下一個(gè)頁(yè)面并判斷內(nèi)存中是否有本頁(yè)面有轉(zhuǎn)第三步,無(wú)轉(zhuǎn)第四步。第三步:更改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)值,記錄當(dāng)前內(nèi)存狀態(tài),調(diào)整最佳置換算法輔助數(shù)組,頁(yè)面指針指向下一頁(yè)。
第四步:將頁(yè)面調(diào)入內(nèi)存,調(diào)整最佳置換算法輔助函數(shù),缺頁(yè)計(jì)數(shù)器加一,保存內(nèi)存數(shù)組狀態(tài)。若內(nèi)存尚不滿轉(zhuǎn)第一步。具體見(jiàn)圖1初始化算法流程圖。
開(kāi)始頁(yè)面調(diào)入內(nèi)存缺頁(yè)計(jì)數(shù)器加一記錄內(nèi)存狀態(tài)調(diào)用下一頁(yè)否否內(nèi)存是否有該頁(yè)面是記錄內(nèi)存狀態(tài)修改缺頁(yè)數(shù)組內(nèi)存已滿是結(jié)束
圖1 初始化算法流程圖
2、先進(jìn)先出頁(yè)面置換算法:
第一步:檢查內(nèi)存中是否已有需調(diào)用頁(yè)面,有則轉(zhuǎn)第二步,無(wú)則轉(zhuǎn)第三步。第二步:記錄當(dāng)前內(nèi)存狀態(tài),修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)值。
第三步:內(nèi)存中無(wú)需要調(diào)用的頁(yè)面,進(jìn)行出隊(duì)操作,然后進(jìn)行入隊(duì)操作,記錄內(nèi)存塊狀態(tài),缺頁(yè)計(jì)數(shù)器加一。
第四步:若頁(yè)面數(shù)組未被調(diào)用結(jié)束轉(zhuǎn)第一步。具體見(jiàn)圖2先進(jìn)先出算法流程圖。
開(kāi)始頁(yè)面調(diào)入內(nèi)存該頁(yè)在內(nèi)存中是否已存在是否否先出隊(duì)操作后入隊(duì)操作記錄內(nèi)存狀態(tài)修改缺頁(yè)數(shù)組值記錄內(nèi)存狀態(tài)缺頁(yè)計(jì)數(shù)器加一頁(yè)面調(diào)用結(jié)束是結(jié)束
圖2 先進(jìn)先出算法流程圖
3、最近最久未使用置換算法:
第一步:將頁(yè)面調(diào)入內(nèi)存,記錄內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一,調(diào)整輔助數(shù)組,頁(yè)面指針加一。
第二步:檢查內(nèi)存中是否已有所需頁(yè)面,有轉(zhuǎn)第三步,無(wú)轉(zhuǎn)第一步。
第三步:修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)記錄,記錄內(nèi)存狀態(tài),調(diào)整輔助數(shù)組,頁(yè)面指針加一。第四步:內(nèi)存是否已滿,無(wú)則轉(zhuǎn)第一步,是則轉(zhuǎn)第五步。
第五步:檢查內(nèi)存中是否有所需頁(yè)面,有則記錄當(dāng)前內(nèi)存狀態(tài),修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)值。無(wú)則轉(zhuǎn)第六步。
第六步:檢查輔助數(shù)組找出最大值并記錄其下標(biāo),置換內(nèi)存中對(duì)應(yīng)下標(biāo)的數(shù)據(jù),調(diào)整輔助數(shù)組,缺頁(yè)計(jì)數(shù)器加一。
第七步:頁(yè)面是否調(diào)用結(jié)束未結(jié)束則轉(zhuǎn)第五步。具體見(jiàn)圖3最近最久未使用算法流程圖。
開(kāi)始調(diào)入頁(yè)面至內(nèi)存記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一否調(diào)整輔助數(shù)組調(diào)用下一頁(yè)內(nèi)存中是否已有該頁(yè)否內(nèi)存已滿是通過(guò)輔助數(shù)組確定淘汰頁(yè)面是修改缺頁(yè)數(shù)組記錄內(nèi)存狀態(tài)調(diào)整輔助數(shù)組否頁(yè)面置換記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一調(diào)用結(jié)束是結(jié)束
圖3 最近最久未使用算法
4、最佳置換算法:
第一步:檢查內(nèi)存中是否已有所需頁(yè)面,有則記錄內(nèi)存狀態(tài),修改缺頁(yè)數(shù)組對(duì)應(yīng)下標(biāo)數(shù)值。無(wú)則轉(zhuǎn)第二步。
第二步:判斷內(nèi)存中各頁(yè)面的未來(lái)調(diào)用情況,記錄是否還有調(diào)用,若有則記錄調(diào)用時(shí)刻。
第三步:分析調(diào)用情況,內(nèi)存中頁(yè)面都在將來(lái)不會(huì)被調(diào)用轉(zhuǎn)第四步,有一個(gè)被調(diào)用轉(zhuǎn)第五步,有兩個(gè)被調(diào)用轉(zhuǎn)第六步,全被調(diào)用轉(zhuǎn)第七步。
第四步:查找輔助數(shù)組找到內(nèi)存中存在時(shí)間最長(zhǎng)的頁(yè)面進(jìn)行置換,修改內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一,修改輔助數(shù)組。
第五步:查找到不會(huì)被調(diào)用的頁(yè)面,并根據(jù)輔助數(shù)組選擇最早進(jìn)入內(nèi)存的頁(yè)面將其置換。修改內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一,修改輔助數(shù)組。
第六步:查找輔助數(shù)組找到將來(lái)不需要在調(diào)用的頁(yè)面將其置換,修改輔助數(shù)組,記錄內(nèi)存狀態(tài),缺頁(yè)計(jì)數(shù)器加一。
第七步:查找輔助數(shù)組,找尋最晚被調(diào)用的頁(yè)面,將其置換。記錄內(nèi)存狀態(tài),修改輔助數(shù)組,缺頁(yè)計(jì)數(shù)器加一。
第八步:頁(yè)面是否調(diào)用完成,否則轉(zhuǎn)第一步。具體見(jiàn)圖4最佳置換算法流程圖
開(kāi)始調(diào)入頁(yè)面記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一更新輔助函數(shù)是頁(yè)面已存在否向后檢查內(nèi)存當(dāng)前頁(yè)面調(diào)用情況所有頁(yè)面都不會(huì)再度調(diào)用否是一個(gè)頁(yè)面會(huì)調(diào)用否否是兩個(gè)頁(yè)面會(huì)調(diào)用是否查找輔助數(shù)組得到最先進(jìn)入頁(yè)面通過(guò)輔助數(shù)組得到不會(huì)再調(diào)用的頁(yè)面通過(guò)輔助數(shù)組獲取最晚調(diào)用的頁(yè)面通過(guò)輔助數(shù)組得到另外兩個(gè)頁(yè)面中最先進(jìn)入的頁(yè)面置換頁(yè)面記錄內(nèi)存狀態(tài)計(jì)數(shù)器加一更新輔助函數(shù)頁(yè)面調(diào)用結(jié)束是結(jié)束
圖4 最佳置換算法流程圖 2.4界面設(shè)計(jì)
采用c# 設(shè)計(jì)windows窗體應(yīng)用程序,使用下拉列表框選擇算法,通過(guò)按鈕添加待調(diào)用的頁(yè)面。通過(guò)文本控件顯示模擬結(jié)果。顯示樣式:第一行:算法名稱;
第二行:調(diào)用頁(yè)面順序;
第三行至第五行顯示內(nèi)存在每調(diào)用一次頁(yè)面后的狀態(tài);
第六行:是否缺頁(yè);
最后一行顯示缺頁(yè)率;
第3章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)
3.1函數(shù)設(shè)計(jì)
1、添加按鈕功能實(shí)現(xiàn)代碼
主要功能:實(shí)現(xiàn)單擊一次添加一個(gè)調(diào)用頁(yè)面,并給出相應(yīng)的提示,如正在輸入的是第幾次調(diào)度頁(yè)面,在輸入為空時(shí)能夠彈出對(duì)話框提示用戶,在輸入完成時(shí)為避免數(shù)組越界應(yīng)在輸入完成時(shí)隱藏;輸入過(guò)程中始終保證時(shí)輸入焦點(diǎn)。private void btnAdd_Click(object sender, EventArgs e){ if(txtAdd.Text!= “")//輸入不為空才能繼續(xù)輸入 { page_dd[i_add] = Convert.ToInt32(txtAdd.Text);/*將輸入值賦值給頁(yè)面數(shù)組*/ txtShow.Text += txtAdd.Text + ” “;/*顯示供用戶查閱*/ i_add++;txtAdd.Clear();/*清空*/ if(i_add == MaxN)//輸入結(jié)束時(shí) { txtAdd.ReadOnly = true;//不允許繼續(xù)輸入 btnAdd.Hide();//按鈕隱藏 return;} txtAdd.Focus();//設(shè)置為輸入焦點(diǎn)
label2.Text = ”第“ +(i_add + 1)+ ”次調(diào)度頁(yè)面:“;/*提示用戶正在輸入的是第幾次調(diào)度頁(yè)面*/ } /*輸入為空則彈出對(duì)話框提示用戶輸入為空*/ else { MessageBox.Show(”請(qǐng)輸入調(diào)用頁(yè)面!“, ”輸入為空“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtAdd.Focus();} }
2、初始化函數(shù)
主要功能:將內(nèi)存一先進(jìn)先出方式填滿,并記錄每個(gè)頁(yè)面進(jìn)入時(shí)間,服務(wù)于先進(jìn)先出頁(yè)面置換算法和最佳置換算法。
void init(int[] a, int[] b,int []m1,int[]m2,int[]m3){ /*內(nèi)存未滿時(shí)循環(huán)*/ for(int i = 0;i < MaxM&&page_p //調(diào)整輔助數(shù)組將剛進(jìn)入內(nèi)存的頁(yè)面的對(duì)應(yīng)時(shí)間 OPT_F(O_Q ,i); count++;//缺頁(yè)計(jì)數(shù)器加一 m1[page_p] = b[0];//保存內(nèi)存狀態(tài) m2[page_p] = b[1];m3[page_p] = b[2];page_p++;//調(diào)用下一頁(yè)面 //檢查內(nèi)存中是否原先就有需要的頁(yè)面; for(int j = 0;j <= i&&page_p s[page_p] = 'F';//缺頁(yè)數(shù)組對(duì)應(yīng)數(shù)據(jù)更改 m1[page_p] = b[0];//記錄內(nèi)存狀態(tài) m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1);//調(diào)整最佳置換算法輔助函數(shù) page_p++;//調(diào)用下一頁(yè) j =-1;//重新開(kāi)始尋找 } } } } 3、先進(jìn)先出頁(yè)面置換函數(shù) 主要功能:根據(jù)先進(jìn)先出算法要求在產(chǎn)生缺頁(yè)中斷時(shí)采用先進(jìn)先出方式確定淘汰頁(yè)面,并在每次頁(yè)面調(diào)用時(shí)記錄下內(nèi)存狀態(tài),缺頁(yè)次數(shù);采用循環(huán)隊(duì)列使得每次出隊(duì)的一定是最先進(jìn)入內(nèi)存的。 private void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s){ int Fpage_p = page_p;int front, rear;//定義隊(duì)列對(duì)手和對(duì)尾指針并初始化 front = 0;rear = MaxM1;int sa;for(;Fpage_p < MaxN;Fpage_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//檢查內(nèi)存中是否已有要調(diào)用的頁(yè)面。 { if(b[i] == a[Fpage_p]){ m1[Fpage_p] = b[0];m2[Fpage_p] = b[1];m3[Fpage_p] = b[2];s[Fpage_p] = 'F';sa = 1;break;} } if(sa == 0){ front =(front + 1)% MaxM; rear =(rear + 1)% MaxM;b[rear] = a[Fpage_p];m1[Fpage_p] = b[0];m2[Fpage_p] = b[1];m3[Fpage_p] = b[2];count++;} else continue;} } /*最近最久未使用算法輔助數(shù)組調(diào)整函數(shù)*/ private void LUR_I(int[] a,int e){ int temp;temp = a[e];a[e] = 1;for(int i = 0;i < MaxM;i++){ if(a[i] < temp && i!=e)a[i]++;} } /*最佳置換算法輔助數(shù)組調(diào)整函數(shù)*/ private void OPT_F(int[] a, int e){ if(e!=-1){ a[e] = 0;for(int i = 0;i < MaxM;i++){ if(i!= e)a[i]++;} } else for(int i = 0;i < MaxM;i++){ a[i]++;} } /*最近最久未使用算法*/ private void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s){ int[] L_Q = new int[MaxM]{3,3,3};int sa;for(int i = 0;i < MaxM && page_p < MaxN;i++){ b[i] = a[page_p];//調(diào)入內(nèi)存 count++;m1[page_p] = b[0];//保存內(nèi)存狀態(tài) m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, i);page_p++;for(int j = 0;j <= i && page_p < MaxN;j++){ if(b[j] == a[page_p]){ s[page_p] = 'F';m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, j);page_p++;j =-1;} } } for(;page_p < MaxN;page_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//用的頁(yè)面。{ if(b[i] == a[page_p]){ m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];s[page_p] = 'F';LUR_I(L_Q, i);sa = 1;break;} } if(sa == 0){ 檢查內(nèi)存中是否已有要調(diào)40 for(int i = 0;i < MaxM;i++){ if(L_Q[i] == 3){ b[i] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];LUR_I(L_Q, i);break;} } count++;} else continue;} } /*最佳置換算法*/ private void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s){ int sa;int O_p;int Ocount;int[] OPT_I=new int [MaxM ]{-1 ,-1 ,-1 };int[] OPT_J=new int [MaxM]{MaxN ,MaxN ,MaxN };for(;page_p < MaxN;page_p++){ for(int i = 0;i < MaxM;i++){ OPT_I[i] =-1;//刷新?tīng)顟B(tài)數(shù)組 OPT_J[i] = MaxN;} sa = 0;for(int i = 0;i < MaxM;i++)//檢查內(nèi)存中是否已有要調(diào)用的頁(yè)面。 { if(b[i] == a[page_p]){ m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1); s[page_p] = 'F';sa = 1;break;} } if(sa == 0)//缺頁(yè) { Ocount = 0;for(int i = 0;i < MaxM;i++){ O_p = page_p + 1;for(;O_p < MaxN;O_p++){ if(b[i] == a[O_p]){ Ocount++;OPT_I[i] = 1;OPT_J[i] = O_p;break;} } } switch(Ocount){ case 0://全部頁(yè)面以后都不會(huì)再度調(diào)用 int temp = 0;for(int i = 0;i < MaxM;i++){ if(O_Q[i] > O_Q[temp])temp = i;} b[temp] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q ,temp);count++;break;case 1://有一個(gè)頁(yè)面將在以后調(diào)用 temp = 0;for(int i = 0;i < MaxM;i++){ if(OPT_I[i]!= 1 && O_Q[i] > O_Q[temp])temp = i; } b[temp] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q ,temp);count++;break;case 2: for(int i = 0;i < MaxM;i++){ if(OPT_I[i] ==-1){ b[i] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q, i);count++;} } break;case 3: int p = 0;for(int i = 0;i < MaxM;i++){ if(OPT_J[i] >OPT_J[p])p = i;} b[p] = a[page_p];m1[page_p] = b[0];m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q, p);count++;break;} } } } /*重置函數(shù)*/ private void btncz_Click(object sender, EventArgs e){ comboBox1.SelectedIndex = 0; txtAdd.Text = ”“;page_p = 0;i_add = 0;count = 0;//txtShow.Text = ”";for(int i = 0;i < MaxM;i++)Memery[i] =-1;for(int i = 0;i < MaxN;i++)s[i] = 'T';} } } 操 作 系 統(tǒng) 課 程 設(shè) 計(jì) 實(shí) 驗(yàn) 報(bào) 告 學(xué)院:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 班級(jí):計(jì)112 學(xué)號(hào):1113022032 姓名: 一、實(shí)驗(yàn)名稱: 用C++實(shí)現(xiàn)驅(qū)動(dòng)調(diào)度算法、頁(yè)面替換算法、銀行家算法、處理器調(diào)度算法 二、實(shí)驗(yàn)要求: 書(shū)寫(xiě)實(shí)驗(yàn)報(bào)告,包括的內(nèi)容有: (1)實(shí)驗(yàn)題目 (2)程序中使用的數(shù)據(jù)結(jié)構(gòu)及主要文字說(shuō)明 (3)帶有注釋的源程序 (4)執(zhí)行程序說(shuō)明,表明各進(jìn)程控制快的初始狀態(tài),以及各算法的運(yùn)行狀態(tài) (5)通過(guò)實(shí)驗(yàn)后的收獲與體會(huì)及對(duì)實(shí)驗(yàn)的改進(jìn)意見(jiàn)和見(jiàn)解 二、實(shí)驗(yàn)?zāi)康模?/p> 通過(guò)自己編程來(lái)實(shí)現(xiàn)各類操作系統(tǒng)算法,進(jìn)一步理解操作系統(tǒng)的概念及含義,提高對(duì)操作系統(tǒng)的認(rèn)識(shí),同時(shí)提高自己的動(dòng)手實(shí)踐能力。加強(qiáng)我們對(duì)各類算法的理解。 三、實(shí)驗(yàn)內(nèi)容: 1、實(shí)現(xiàn)頁(yè)面替換算法 (1)FIFO 先進(jìn)先出頁(yè)面替換算法 (2)LRU最近最少使用頁(yè)面替換算法 (3)LFU最少使用頻率頁(yè)面替換算法 2、銀行家算法 3、實(shí)現(xiàn)驅(qū)動(dòng)調(diào)度算法 (1)先來(lái)先服務(wù)算法 (2)電梯算法 (3)掃描算法 4、實(shí)現(xiàn)處理器調(diào)度 (1)先進(jìn)先出處理器調(diào)度 (2)時(shí)間片輪轉(zhuǎn)法 (3)優(yōu)先級(jí)調(diào)度 四、實(shí)驗(yàn)原理: 1、頁(yè)面替換算法 先進(jìn)先出頁(yè)面置換算法:該算法總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即選擇在內(nèi)存中駐留時(shí)間最久的頁(yè)面加以淘汰。將已調(diào)入內(nèi)存的頁(yè)面按先后次序鏈接成一個(gè)隊(duì)列,將最先調(diào)入的頁(yè)面與新頁(yè)面進(jìn)行置換 最近最久未使用置換算法:該算法是利用“最近的過(guò)去”作為“最近的將來(lái)”,將最近最久未使用的頁(yè)面加以淘汰。將已調(diào)入內(nèi)存的頁(yè)面按先后順序鏈接成一個(gè)隊(duì)列,為每一個(gè)頁(yè)面增加一個(gè)訪問(wèn)字段,用來(lái)記錄一個(gè)頁(yè)面自上次被訪問(wèn)以來(lái)所經(jīng)歷的是時(shí)間t,當(dāng)需淘汰一個(gè)頁(yè)面時(shí),選擇現(xiàn)有頁(yè)面中其t值最大,即最近最久未使用的頁(yè)面加以淘汰 2、銀行家算法 先對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,即檢查請(qǐng)求的是不大于需要的,是否不大于可利用的。若請(qǐng)求合法,則進(jìn)行試分配。最后對(duì)試分配后的狀態(tài)調(diào)用安全性檢查算法進(jìn)行安全性檢查。若安全,則分配,否則,不分配,恢復(fù)原來(lái)狀態(tài),拒絕申請(qǐng)。 3、驅(qū)動(dòng)調(diào)度算法 先進(jìn)先出算法(FIFO):總是嚴(yán)格按時(shí)間順序?qū)Υ疟P請(qǐng)求予以處理。算法實(shí)現(xiàn)簡(jiǎn)單、易于理解并且相對(duì)公平,不會(huì)發(fā)生進(jìn)程餓死現(xiàn)象。但該算法可能會(huì)移動(dòng)的柱面數(shù)較多并且會(huì) 經(jīng)常更換移動(dòng)方向,效率有待提高 電梯調(diào)度算法:總是將一個(gè)方向上的請(qǐng)求全部處理完后,才改變方向繼續(xù)處理其他請(qǐng)求。 掃描算法(scan algorithm):總是從最外向最內(nèi)(或最內(nèi)向最外)進(jìn)行掃描,然后在從最內(nèi)向最外(或最外向最內(nèi))掃描。該算法與電梯調(diào)度算法的區(qū)別是電梯調(diào)度在沒(méi)有最外或最內(nèi)的請(qǐng)求時(shí)不會(huì)移動(dòng)到最外或最內(nèi)柱面。 4、處理器調(diào)度算法 先進(jìn)先出處理器調(diào)度:按照作業(yè)進(jìn)入系統(tǒng)后備工作隊(duì)列的先后次序來(lái)挑選作業(yè),先進(jìn)入系統(tǒng)的作業(yè)將優(yōu)先被挑選進(jìn)入主存,創(chuàng)建用戶進(jìn)程,分配所需資源,然后移入就緒隊(duì)列。 時(shí)間片輪轉(zhuǎn)法調(diào)度算法:調(diào)度次序每次把CPU分配給就緒隊(duì)列進(jìn)程/線程使用規(guī) 定的時(shí)間間隔,就緒隊(duì)列中每個(gè)進(jìn)程/線程輪流的運(yùn)行一個(gè)時(shí)間片,當(dāng)時(shí)間片耗盡時(shí),就強(qiáng)迫當(dāng)前運(yùn)行進(jìn)程/線程讓出處理器,轉(zhuǎn)而排列到就緒隊(duì)列尾部,等候下一輪調(diào)度。 優(yōu)先級(jí)調(diào)度:根據(jù)確定的優(yōu)先級(jí)來(lái)選取進(jìn)程/線程,總是選擇就緒隊(duì)列中的優(yōu)先 級(jí)最高者投入運(yùn)行,即優(yōu)先級(jí)越高,先被調(diào)用。 五、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì) 對(duì)操作系統(tǒng)的各類算法設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)如下: 頁(yè)面替換算法:void FIFO();void LRU();void LFU(); 銀行家算法:void Init()初始化算法 void Bank()銀行家算法 bool Safe()安全性算法 驅(qū)動(dòng)調(diào)度算法: struct MagneticHead//磁頭構(gòu)成{ int site; int count; bool direct; }; struct Range//磁盤磁道范圍 { int mStart; int mEnd; }; struct RequestList//請(qǐng)求序列 { int site; bool state; }; struct Data//基本數(shù)據(jù)集合{ MagneticHead magneticHead; RequestList *requestList; int *executeList; Range range; int length; }; 處理器調(diào)度: typedef struct pcb//時(shí)間片輪轉(zhuǎn)法 { char pname[N]; int runtime; int arrivetime; char state; struct pcb*next; }PCB; typedef struct PCB1//先進(jìn)先出服務(wù) { char ID[3];//進(jìn)程號(hào) char name[10];//進(jìn)程名 char state;//運(yùn)行狀態(tài) floatarrivetime;//到達(dá)時(shí)間 floatstarttime;//進(jìn)程開(kāi)始時(shí)間 floatfinishtime;//進(jìn)程結(jié)束時(shí)間 floatservicetime;//服務(wù)時(shí)間 float turnaroundtime;//周轉(zhuǎn)時(shí)間 float weightedturnaroundtime;//帶權(quán)周轉(zhuǎn)時(shí)間 struct PCB1 *next;//指向下個(gè)進(jìn)程 }pcb1; struct pcb2 {優(yōu)先級(jí)調(diào)度 char name[10]; char state; int super; int ntime; int rtime; struct pcb2* link; }*ready=NULL,*d; typedef struct pcb2 PCB2; 六、課程設(shè)計(jì)總結(jié) 在本次課程設(shè)計(jì)中,就是講平時(shí)所做的實(shí)驗(yàn)結(jié)合起來(lái),實(shí)現(xiàn)操作系統(tǒng)的各類算法,了解操作系統(tǒng)的運(yùn)行原理以及其基本概念,更好的將操作系統(tǒng)的原理很好的展現(xiàn)出來(lái)。同時(shí),在本次實(shí)驗(yàn)中遇到了很多問(wèn)題,需要我們仔細(xì)的檢查和修改。其次,實(shí)驗(yàn)中為了能更好的體現(xiàn)各類算法的運(yùn)行情況,需要做一個(gè)清晰的界面,以能清楚地看出運(yùn)行結(jié)果。 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號(hào): 姓 名: 提交日期: 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 【設(shè)計(jì)目的】 (1)本實(shí)驗(yàn)的目的是通過(guò)一個(gè)簡(jiǎn)單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能和內(nèi)部實(shí)現(xiàn)。 (2)結(jié)合數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計(jì)、計(jì)算機(jī)原理等課程的知識(shí),設(shè)計(jì)一個(gè)二級(jí)文件系統(tǒng),進(jìn)一步理解操作系統(tǒng)。 (3)通過(guò)分對(duì)實(shí)際問(wèn)題的分析、設(shè)計(jì)、編程實(shí)現(xiàn),提高學(xué)生實(shí)際應(yīng)用、編程的能力 【設(shè)計(jì)內(nèi)容】 為L(zhǎng)inux系統(tǒng)設(shè)計(jì)一個(gè)簡(jiǎn)單的二級(jí)文件系統(tǒng)。要求做到以下幾點(diǎn): 1.可以實(shí)現(xiàn)下列幾條命令: login 用戶登錄 dir 列目錄 create 創(chuàng)建文件 delete 刪除文件 open 打開(kāi)文件 close 關(guān)閉文件 read 讀文件 write 寫(xiě)文件 cd 進(jìn)出目錄 2.列目錄時(shí)要列出文件名,物理地址,保護(hù)碼和文件長(zhǎng)度 3.源文件可以進(jìn)行讀寫(xiě)保護(hù) 【實(shí)驗(yàn)環(huán)境】 Windows xp/7 C++/VC++ 【相關(guān)知識(shí)綜述】 1、文件系統(tǒng) 文件系統(tǒng)是操作系統(tǒng)用于明確存儲(chǔ)設(shè)備(常見(jiàn)的是磁盤,也有基于NAND Flash的固態(tài)硬盤)或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu);即在存儲(chǔ)設(shè)備上組織文件的方法。操作系統(tǒng)中負(fù)責(zé)管理和存儲(chǔ)文件信息的軟件機(jī)構(gòu)稱為文件管理系統(tǒng),簡(jiǎn)稱文件系統(tǒng)。文件系統(tǒng)由三部分組成:文件系統(tǒng)的接口,對(duì)對(duì)象操縱和管理的軟件集合,對(duì)象及屬性。從系統(tǒng)角度來(lái)看,文件系統(tǒng)是對(duì)文件存儲(chǔ)設(shè)備的空間進(jìn)行組織和分配,負(fù)責(zé)文件存儲(chǔ)并對(duì)存入的文件進(jìn)行保護(hù)和檢索的系統(tǒng)。具體地說(shuō),它負(fù)責(zé)為用戶建立文件,存入、讀出、修改、轉(zhuǎn)儲(chǔ)文件,控制文件的存取,當(dāng)用戶不再使用時(shí)撤銷文件等。 2、位示圖 位示圖是利用二進(jìn)制的一位來(lái)表示磁盤中的一個(gè)盤塊的使用情況。當(dāng)其值為“0”時(shí),表示對(duì)應(yīng)的盤塊空閑;為“1”時(shí),表示已經(jīng)分配。有的系統(tǒng)把“0”作為盤塊已分配的標(biāo)記,把“1”作為空閑標(biāo)志。(它們的本質(zhì)上是相同的,都是用一位的兩種狀態(tài)標(biāo)志空閑和已分配兩種情況。)磁盤上的所有盤塊都有一個(gè)二進(jìn)制位與之對(duì)應(yīng),這樣,由所有盤塊所對(duì)應(yīng)的位構(gòu)成一個(gè)集合,稱為位示圖。 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 【設(shè)計(jì)思路】 本文件系統(tǒng)采用兩級(jí)目錄,其中第一級(jí)對(duì)應(yīng)于用戶賬號(hào),第二級(jí)對(duì)應(yīng)于用戶帳號(hào)下的文件。另外,為了簡(jiǎn)便文件系統(tǒng)未考慮文件共享,文件系統(tǒng)安全以及管道文件與設(shè)備文件等特殊內(nèi)容。 首先應(yīng)確定文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):主目錄、子目錄及活動(dòng)文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。 用戶創(chuàng)建的文件,可以編號(hào)存儲(chǔ)于磁盤上。如:file0,file1,file2?并以編號(hào)作為物理地址,在目錄中進(jìn)行登記。 【程序主要流程圖】 否 驗(yàn)證是否成 功? 是 目錄 右鍵進(jìn)行選擇 操作 新建目錄新建文件打開(kāi)文件 結(jié)束 開(kāi)始登錄刪除屬性 2 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 【源程序清單】 typedef struct //文件結(jié)構(gòu)體 /*the structure of OSFILE*/ { int fpaddr; /*file physical address*/ int flength; /*file length*/ int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write;3-Protect;*/ char fname[MAXNAME]; /*file name*/ } OSFILE; typedef struct //用戶文件目錄結(jié)構(gòu)體 user file directory /*the structure of OSUFD*/ { char ufdname[MAXNAME]; /*ufd name*/ OSFILE ufdfile[MAXCHILD]; /*ufd own file*/ }OSUFD; typedef struct //登陸 /*the structure of OSUFD'LOGIN*/ { char ufdname[MAXNAME]; /*ufd name*/ char ufdpword[8]; /*ufd password*/ } OSUFD_LOGIN; typedef struct //文件打開(kāi)模式 /*file open mode*/ { int ifopen; /*ifopen:0-close,1-open*/ int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE; void DeleteF()/*Delete File*/ { int i,j,k=0;char str[255],str1[255];char fname[MAXNAME];k=ExistD(dirname);//獲取用戶的序號(hào) printf(“Please input filename:”);gets(fname);//獲得需要打開(kāi)的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 } } void OpenF()/*Open File*/ { int i,k=0;char fname[MAXNAME];//printf(“nnC:%s>”,strupr(dirname));k=ExistD(dirname);printf(“Please input filename:”);gets(fname);//獲得需要打開(kāi)的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=1;//打開(kāi)文件 ifopen[k][i].openmode=ufd[k]->ufdfile[i].fmode;//將讀寫(xiě)屬性賦值 //test// printf(“i=%d,k=%dn”,i,k); ///test// printf(“openmode=%dn”,ifopen[k][i].openmode); printf(“Open file successfully!n”); break;//打開(kāi)文件則跳出循環(huán) itoa(ufd[k]->ufdfile[i].fpaddr,str,10);//itoa函數(shù),把數(shù)字轉(zhuǎn)換成字符串 strcpy(str1,“file”);strcat(str1,str);strcpy(str,“c:osfilefile”);strcat(str,str1);strcat(str,“.txt”);//str為文件的物理路徑 if(remove(str)==0) //調(diào)用remove函數(shù)刪除 第k個(gè)用戶的第i個(gè)文件ufd[k]->ufdfile[i] { fpaddrno[ufd[k]->ufdfile[i].fpaddr] = 0;//位示圖置為0,表示沒(méi)被占用 for(j = i;j<=fcount[k]-1;j++)//文件順序往前移一位 ufd[k]->ufdfile[j] = ufd[k]->ufdfile[j+1]; fcount[k] = fcount[k]-1;//文件數(shù)-1 printf(“Delete file successfully!n”); //除了刪除原文件,還要 刪除dir中的東西 } else printf(“Delete file fail!n”);break;} 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 } } } void CloseF()/*Close File*/ { int i,k=0;char fname[MAXNAME]; k=ExistD(dirname);printf(“Please input filename:”);gets(fname);//獲得需要關(guān)閉的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=0;//關(guān)閉文件 ifopen[k][i].openmode=4;//fmode改為初始值4 printf(“Close file successfully!n”); break; } } } void WriteF()/*Write File*/ { int i,k,n=0;char fname[MAXNAME];char str[255],str1[255];int flag=1; if(strcmp(strupr(ltrim(rtrim(dirname))),“")==0) { printf(”nError.Please convert to ufd dir before read.n“); wgetchar=1; return;} printf(”nCaution:Open file firstn“);printf(”O(jiān)pened File(s)List:n“);k=ExistD(dirname); 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 for(i=0;i //文件屬性為只寫(xiě)或者是讀寫(xiě)才能write { printf(”%15s“,ufd[k]->ufdfile[i].fname); n++;} if((n%4==0)&&(n!=0))printf(”n“); } printf(”n%d files openned.n“,n); if(n==0)wgetchar=1;if(n!=0){ printf(”nPlease input FileName:“);gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){ if(ifopen[k][i].ifopen==1) { if((ifopen[k][i].openmode==1)||(ifopen[k][i].openmode==2)) { itoa(ufd[k]->ufdfile[i].fpaddr,str,10); strcpy(str1,”file“); strcat(str1,str); strcpy(str,”c:osfilefile“); strcat(str,str1); strcat(str,”.txt“);//物理路徑 int length=0; char c; printf(”Please input text('#' stands for end):n“); fp_file=fopen(str,”ab+“);//在文件末尾加 add bit while((c=getchar())!='#')//以#為結(jié)尾 { fputc(c,fp_file); if(c!='n')length++; } //fprintf(fp_file,”n“); 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 fclose(fp_file); ufd[k]->ufdfile[fcount[i]-1].flength += length;//原長(zhǎng)度加輸入長(zhǎng)度 printf(”n'%s' has been written successfully!n“,fname); } else { printf(”nError.'%s' has been opened with WRITE ONLY mode.It isn't read.n“,fname); wgetchar=1; } } else { printf(”nError.'%s' is in closing status.Please open it before readn“,fname); wgetchar=1; } } else { printf(”nError.'%s' does not exist.n",fname); wgetchar=1; } } } 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 【測(cè)試結(jié)果】 1、創(chuàng)建用戶 2、創(chuàng)建文件,并且打開(kāi)讀取文件 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 3、寫(xiě)文件 4、刪除文件 操作系統(tǒng)課程設(shè)計(jì)報(bào)告 【設(shè)計(jì)總結(jié)】 這兩周的課程設(shè)計(jì)時(shí)間非常短,從中學(xué)到了很多知識(shí),也為我們的學(xué)習(xí)提供了良好的實(shí)踐平臺(tái)。首先,通過(guò)老師的細(xì)心指導(dǎo)和同學(xué)們的相互幫助,讓我對(duì)題目【二級(jí)文件系統(tǒng)】有了進(jìn)一步了解。接下來(lái),主要是研究老師所給的大部分代碼,參考他的基本思路,并且思考每一個(gè)結(jié)構(gòu)體在代碼中的具體作用。這期間和一些同學(xué)交流了各自的思路,在交流中,大家漸漸的明確了這個(gè)程序的思路、框架結(jié)構(gòu)等。我們所做的主要是補(bǔ)充了刪除文件,打開(kāi)文件,關(guān)閉文件,寫(xiě)文件這幾個(gè)部分。 代碼編寫(xiě)完了之后,實(shí)現(xiàn)了題目所要求的基本功能,但是在測(cè)試的過(guò)程中,還發(fā)現(xiàn)了這個(gè)程序存在各種各樣的bug。不斷的測(cè)試修改后,得到完善。 這次課設(shè)最大的收獲在于:學(xué)會(huì)交流以及相互幫助。在大家的交流溝通之中,我們解決了一個(gè)又一個(gè)難題。 在這次課設(shè)中,我還意識(shí)到,要把這門課真真正正地學(xué)好,不單單只是為了能夠應(yīng)付考試,平時(shí)還要多加學(xué)習(xí),多加努力才對(duì)。 【參考文獻(xiàn)】 【1】C語(yǔ)言程序設(shè)計(jì)(第三版)譚浩強(qiáng) 【2】計(jì)算機(jī)操作系統(tǒng)教程(第三版).張堯?qū)W 史美林 張高 【3】計(jì)算機(jī)操作系統(tǒng),西安電子科技大學(xué)出版社,方敏主編,2004.8第四篇:操作系統(tǒng)課程設(shè)計(jì)報(bào)告
第五篇:操作系統(tǒng)課程設(shè)計(jì)報(bào)告