第一篇:報告2 Linux操作系統
Linux操作系統
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。它支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。Linux 和 UNIX 的最大的區別是,前者是開發源代碼的自由軟件,而后者是對源代碼實行知 識產權保護的傳統商業軟件。
目前,中國Linux的發展呈現以下趨勢:
1、行業應用逐漸擴展,差異化解決方案需求增長
經過幾年的技術磨礪與市場培育,Linux行業應用市場逐步細化,在金融、電信、郵政、傳媒、煙草等行業的應用也不斷增多。成功應用案例的不斷增加,企業級用戶在Linux平臺上部署解決方案時,對系統穩定性、可靠性、高性能和安全性等問題也逐步打消疑慮,樹立了信心。因此,在商用市場中,市場需要成熟的基于Linux的、針對行業的應用解決方案,解決方案提供商在Linux應用開發過程中能夠從廠商獲得足夠的技術支持,并提供滿足用戶需求基礎之上的安全性、高效性、可移植性最好,以及成本最低的解決方案是趨勢所在。
2、單一產品價格競爭向整體解決方案TCO競爭過渡
Linux向市場之初,采取的是低價策略。但是,僅僅靠低價在競爭中不一定能獲取足夠的競爭優勢彌補產品研發等巨大成本;而且用戶的消費心理越來越理性,其選擇產品所關注的因素并不僅是單一產品的采購價格,用戶的需求已經從原來購買多家廠商的多種產品轉變為從單一提供商購買整體解決方案和一站式服務。針對用戶需求的轉變,Linux產品提供商也逐漸由單一產品價格競爭向整體解決方案TCO競爭過渡。這個過程中,Linux廠商需要與其它相關IT廠商如硬件、軟件廠商和ISV等建立很好的合作關系,提高產品互相兼容性、互操作性及結合度,最終提高用戶業務系統的效率,降低整個業務系統的TCO。
3、渠道體系趨向層次化、多樣化
當前,中國Linux廠商的渠道體系開始建立并逐步完善,但目前渠道銷售對Linux市場的貢獻還有待提高。未來Linux渠道發展趨勢將是構建多環節合作的層次化渠道體系,并使之擴展為更廣泛的合作伙伴體系。在產品研發上,加強與行
業獨立軟件開發商的合作,提供更具適用性、更豐富的行業解決方案;在產品銷售上,除了代理商、分銷商、經銷商之外,會有更多的具有成功的行業推廣經驗的增值解決方案提供商加入;在產品服務上,Linux廠商為渠道及系統集成商提供更多的培訓和技術支持,提高渠道及系統集成商的服務能力;在市場推廣上,Linux廠商與相關軟硬件廠商的合作關系進一步深入,面向共同的目標客戶群提高產品的兼容性或提供捆綁的產品包共同拓展市場;Linux培訓或教育合作伙伴的加入從更深的層次上培育市場,拓寬市場。總之,未來Linux渠道發展的趨勢是形成多種方式多種層次的合作伙伴,構建立體式渠道。
4、服務在Linux收入結構中的比重逐漸增大
隨著Linux應用的逐漸深入,Linux本土廠商和應用企業正逐步接受以服務來獲取收入的銷售方式,而國外廠商Novell和紅帽的進入,更將它們在國外采用的成熟的銷售方式帶入了中國,加速了中國客戶對這一銷售方式的認可。中國的Linux廠商也逐漸對以服務獲取收入的銷售方式達成了共識,并正在努力調整自己的銷售策略和開發策略,越來越多的收入來自Linux的技術服務,而不是Linux產品的銷售
而推廣Linux的重要意義在于:
1.Linux是我國在系統軟件產業發展方面取得重大突破的一次歷史機遇:我國軟件產業規模小,實力弱,尤其是在系統軟件這樣的關鍵產品上,我們至今還沒能開發出具有較強市場競爭能力的產品。這是我們不得不面對的客觀現實。沒有自主的操作系統,不僅信息產業發展受制于人,而且信息安全也難以保證。中國作為世界政治,經濟大國,不能沒有操作系統這樣的關鍵軟件產品。Linux是我們可能在系統軟件上取得重大突破的一個不容錯過的良機。
2.Linux已成主流平臺:Linux誕生于1991年,以其開放源碼技術先進等特性,得到了廣泛認可,并以每年30%的增長率(操作系統產品第一位)飛速發展,以24%市場份額在服務器市場成為第二大服務器操作系統平臺。Linux是支持平臺最多的操作系統,從PDA,信息家電、信息終端到桌面操作系統,PC服務器,小型機乃至大型主機,都可以運行Linux操作系統。而且穩定性和性能非常優秀。現在Linux已經成為強大的企業級操作系統,應用的深度和廣度也在飛速地發展,已在政府、教育、軍隊、金融、商業、ISP/ICP,電信等
領域都得到了廣泛發應用,成功案例非常之多。
Linux的發展的前景之廣闊已毋庸置疑,但Linux方面發技術人才匱乏,已成為其發展的瓶頸。因此,在教育領域學習和使用Linux具有現實性和長遠意義。當然Linux操作系統和Windows操作系統相比較有很多的特點。比如:1.可完全免費得到2.可以運行在386以上及各種RISC體系結構機器上3.Linux是UNIX的完整實現4.真正的多任務多用戶5.完全符合POSIX標準6.具有圖形用戶界面7.具有強大的網絡功能8.是完整的UNIX開發平臺
目前應用在手機上的操作系統主要有PalmOS、Symbian、Windows CE和Linux四種。與Windows操作系統、Linux操作系統有關系的只是系統的內核架構,表層的軟件平臺是獨立的。
隨著技術的進步,移動通信終端引入開源手機操作系統得以實現,由于Linux系統是免費開放的,所以其在通信終端的應用為用戶帶來了更便宜的價格和更豐富的功能擴展:Google開發的Android手機操作系統可謂是其中的代表。其Android系統的組成模塊,核心系統就是采用Linux內核。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中,比如手機、平板電腦、路由器、視頻游戲控制臺、臺式計算機、大型機和超級計算機。嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基于Linux內核,并且使用GNU 工程各種工具和數據庫的操作系統。
第二篇:實時操作系統報告
實時操作系統課程實驗報告
專業:通信1001 學號:3100601025 姓名:陳治州
完成時間:2013年6月11日
實驗 簡易電飯煲的模擬
一.實驗目的:
掌握在基于嵌入式實時操作系統μC/OS-II的應用中,基于多任務的模式的編程方法。鍛煉綜合應用多任務機制,任務間的通信機制,內存管理等的能力。
二.實驗要求:
1.按“S”開機,系統進入待機狀態,時間區域顯示當前北京時間,默認模式“煮飯”;2.按“C”選擇模式,即在“煮飯”、“煮粥”和“煮面”模式中循環選擇;
3.按“B”開始執行模式命令,“開始”狀態選中,時間區域開始倒計時,倒計時完成后進入“保溫”狀態,同時該狀態顯示選中,時間區域顯示保溫時間;
4.按“Q”取消當前工作狀態,系統進入待機狀態,時間區域顯示北京時間,模式為當前模式;
5.按“X”退出系統,時間區域不顯示。
6.煮飯時長為30,煮粥時長為50,煮面時長為40.三.實驗設計:
1.設計思路:
以老師所給的五個程序為基礎,看懂每個實驗之后,對borlandc的操作有了大概的認識,重點以第五個實驗Task_EX為框架,利用其中界面顯示與按鍵掃描以及做出相應的響應,對應實現此次實驗所需要的功能。
本次實驗分為界面顯示、按鍵查詢與響應、切換功能、時鐘顯示與倒計時模塊,綜合在一起實驗所需功能。2.模塊劃分圖:(1)界面顯示:
Main()Taskstart()Taskstartdispinit()在TaskStartDispInit()函數中,使用PC_DispStr()函數畫出界面。(2)按鍵查詢與響應:
Main()Taskstart()在TaskStart()函數中,用if(PC_GetKey(&key)== TRUE)判斷是否有按鍵輸入。然后根據key的值,判斷輸入的按鍵是哪一個;在響應中用switch語句來執行對應按鍵的響應。(3)切換功能:
l計數“C”按鍵的次數M=l%3Switch(m)M=0,1,2對應于煮飯,煮粥,煮面,然后使用PC_DispStr()函數在選擇的選項前畫上“@”指示,同時,在其余兩項錢畫上“ ”以“擦出”之前畫下的“@”,注意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);}
五.運行界面:
(1)主界面:
(2)顯示北京時間:
(3)模式切換:
(4)倒計時:
(5)保溫執行時間:
六.總結:
本次實驗主要以老師所給的實驗事例為基礎,并結合老師課堂講的內容,理解編寫程序。做實驗本實驗前,先執行了一下事例程序,以此了解borlandc的一些基本操作;然后就是看懂每個實驗的框架和主要部分;接著,將事例程序中的部分思想運用到本次實驗中,其中以顯示界面的思想運用的最多;除此以外,在模式切換上花了最大的精力,最終的解決方法是以變量l作為一個計數值,并運用switch語句在選擇的模式上畫上“@”,同時還得注意在未選擇的模式上畫上空格來“擦除”之前畫上的@;在查詢按鍵上,同樣運用switch語句......這次實驗收獲不少,不僅對之前學的C語言有了更進一步的鞏固,而且還強化了ucos里面的多任務的一些認識;同時,以前對DOS界面很陌生,但本次實驗使用的正是DOS界面,通過幾天的經歷,對DOS中的編譯、“help”等各個方面有了更深入的認識,不再害怕使用DOS了。
對本課程有很大的興趣,在以后的課余時間里我會不斷學習這些知識。
第三篇:操作系統課程設計報告
課程設計報告
題 目: 模擬請求頁式管理
課程名稱: 計算機操作系統 學 院: 信息工程學院
專 業: 計算機科學與技術
班 級: 14計本(1)學生姓名: * * * 學 號: 201403031** 指導教師: * * 成 績:
開課時間: 2016-2017 學年 一 學期
模擬請求頁式管理
第1章 需求分析
1.1設計要求
請求頁式管理是一種常用的虛擬存儲管理技術。本設計通過請求頁式存儲管理中頁面置換算法模擬設計,了解虛擬存儲技術的特點,掌握請求頁式管理的頁面置換算法。本實驗要求用Vc++或其他高級語言編寫和調試。
編寫程序實現:
(1)先進先出頁面置換算法(FIFO)(2)最近最久未使用頁面置換算法(LRU)最佳置換頁面置換算法(OPT)設計一個虛擬存儲區和內存工作區,編程序演示以上三種算法的具體實現過程,并計算訪問命中率。
1.2解決方案
首先確定實現語言使用c#實現圖形化界面,后確定要實現哪些功能,比如算法選擇,頁面添加,模擬控制。然后確定輸出結構以便于程序的測試和驗證。將基本框架建立后再進行編程。編程前進行算法結構分析最后編程實現。
1.3算法實現原理
1、先進先出置換算法(FIFO):
發生缺頁中斷時按照頁面進入內存順序總是淘汰最先進入內存的頁面。
2、最近最久未使用置換算法(LRU):
發生缺頁中斷時總是淘汰存在內存中最長時間未被使用的頁面。
3、最佳置換算法(OPT):
發生缺頁中斷時若一個或幾個頁面將來將不會被調用則按先進先出原則淘汰頁面,若將來都有調用則比較調用時刻選擇最遠時刻頁面淘汰。
4、缺頁率:缺頁次數占頁面調用次數的百分比。
第2章 概要設計
2.1數據設計
常變量:調用頁面最大數量(MaxN),內存最大頁面數(MaxM)待調用頁面數組:page_dd[MaxN]存放等待調用的頁面號
頁面數組專用指針 page_p,用于指向page_dd數組中正需調入內存的頁號 內存塊數組:Memery[MaxM],存放內存當前存放的頁號 缺頁計數器:count,記錄缺頁次數
內存塊狀態數組:M1[MaxN],M2[MaxN],M3[MaxN],記錄每次頁面調用結束后內存各塊的狀態
缺頁記錄數組s[MaxN],用于記錄頁面調用時是否產生缺頁中斷,初始化為是
2.2函數設計
1、頁面添加函數:void btnAdd_Click(object sender, EventArgs e)用于實現通過點擊按鈕實現數據輸入。
2、內存初始化函數:init(int[] a, int[] b,int []m1,int[]m2,int[]m3)參數有頁面數組、內存數組、狀態數組,采用先進先出算法對內存先進行裝滿 服務于先進先出頁面置換函數和最佳置換函數。
3、輸出函數:void display(int[]a,int[]m1,int[]m2,int[]m3,char[]c)用于輸出模擬結果,參數有頁面數組,內存數組,狀態數組,缺頁記錄數組。再模擬之后調用。
4、模擬控制函數:void btnmo_Click(object sender, EventArgs e)用于實現通過單擊模擬按鈕,根據用戶所選算法進行模擬并顯示結果。
5、先進先出算法模擬函數:
void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s)用于實現先進先出算法模擬,參數有頁面數組,內存數組、內存狀態記錄數組,缺頁記錄數組。在模擬函數中調用。
6、最近最久未使用算法模擬函數:
void LRU(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于 3 實現最近最久未使用算法模擬,參數有頁面數組,內存數組,內存狀態記錄數組,缺頁記錄數組。在模擬函數中被調用。
7、最近最久未使用函數輔助函數:void LUR_I(int[] a,int e)用于對最近最久未使用算法中所用輔助數組(記錄頁面存在時長)進行調整,參數有輔助數組及需調整的數據下標。在最近最久未使用函數中調用。
8、最佳置換算法模擬函數:
void OPT(int[] a, int[] b, int[] m1, int[] m2, int[] m3, char[] s)用于模擬最佳置換算法。參數有頁面數組,內存數組,內存狀態記錄數組,缺頁記錄數組。在模擬函數中被調用。
9、最佳置換算法輔助函數:void OPT_F(int[] a, int e)用于對最佳置換算法中的輔助數組進行調整。參數有輔助數組,需調整數據下標。在最佳置換算法中被調用。
10、重置函數:void btncz_Click(object sender, EventArgs e)用于重新選擇算法進行新的模擬。
2.3主要算法設計
1、初始化函數算法:
第一步:將第一個頁面調入內存,調整最佳置換算法輔助數組,缺頁計數器加一,保存內存數組狀態。
第二步:調用下一個頁面并判斷內存中是否有本頁面有轉第三步,無轉第四步。第三步:更改缺頁數組對應下標值,記錄當前內存狀態,調整最佳置換算法輔助數組,頁面指針指向下一頁。
第四步:將頁面調入內存,調整最佳置換算法輔助函數,缺頁計數器加一,保存內存數組狀態。若內存尚不滿轉第一步。具體見圖1初始化算法流程圖。
開始頁面調入內存缺頁計數器加一記錄內存狀態調用下一頁否否內存是否有該頁面是記錄內存狀態修改缺頁數組內存已滿是結束
圖1 初始化算法流程圖
2、先進先出頁面置換算法:
第一步:檢查內存中是否已有需調用頁面,有則轉第二步,無則轉第三步。第二步:記錄當前內存狀態,修改缺頁數組對應下標值。
第三步:內存中無需要調用的頁面,進行出隊操作,然后進行入隊操作,記錄內存塊狀態,缺頁計數器加一。
第四步:若頁面數組未被調用結束轉第一步。具體見圖2先進先出算法流程圖。
開始頁面調入內存該頁在內存中是否已存在是否否先出隊操作后入隊操作記錄內存狀態修改缺頁數組值記錄內存狀態缺頁計數器加一頁面調用結束是結束
圖2 先進先出算法流程圖
3、最近最久未使用置換算法:
第一步:將頁面調入內存,記錄內存狀態,缺頁計數器加一,調整輔助數組,頁面指針加一。
第二步:檢查內存中是否已有所需頁面,有轉第三步,無轉第一步。
第三步:修改缺頁數組對應下標記錄,記錄內存狀態,調整輔助數組,頁面指針加一。第四步:內存是否已滿,無則轉第一步,是則轉第五步。
第五步:檢查內存中是否有所需頁面,有則記錄當前內存狀態,修改缺頁數組對應下標值。無則轉第六步。
第六步:檢查輔助數組找出最大值并記錄其下標,置換內存中對應下標的數據,調整輔助數組,缺頁計數器加一。
第七步:頁面是否調用結束未結束則轉第五步。具體見圖3最近最久未使用算法流程圖。
開始調入頁面至內存記錄內存狀態計數器加一否調整輔助數組調用下一頁內存中是否已有該頁否內存已滿是通過輔助數組確定淘汰頁面是修改缺頁數組記錄內存狀態調整輔助數組否頁面置換記錄內存狀態計數器加一調用結束是結束
圖3 最近最久未使用算法
4、最佳置換算法:
第一步:檢查內存中是否已有所需頁面,有則記錄內存狀態,修改缺頁數組對應下標數值。無則轉第二步。
第二步:判斷內存中各頁面的未來調用情況,記錄是否還有調用,若有則記錄調用時刻。
第三步:分析調用情況,內存中頁面都在將來不會被調用轉第四步,有一個被調用轉第五步,有兩個被調用轉第六步,全被調用轉第七步。
第四步:查找輔助數組找到內存中存在時間最長的頁面進行置換,修改內存狀態,缺頁計數器加一,修改輔助數組。
第五步:查找到不會被調用的頁面,并根據輔助數組選擇最早進入內存的頁面將其置換。修改內存狀態,缺頁計數器加一,修改輔助數組。
第六步:查找輔助數組找到將來不需要在調用的頁面將其置換,修改輔助數組,記錄內存狀態,缺頁計數器加一。
第七步:查找輔助數組,找尋最晚被調用的頁面,將其置換。記錄內存狀態,修改輔助數組,缺頁計數器加一。
第八步:頁面是否調用完成,否則轉第一步。具體見圖4最佳置換算法流程圖
開始調入頁面記錄內存狀態計數器加一更新輔助函數是頁面已存在否向后檢查內存當前頁面調用情況所有頁面都不會再度調用否是一個頁面會調用否否是兩個頁面會調用是否查找輔助數組得到最先進入頁面通過輔助數組得到不會再調用的頁面通過輔助數組獲取最晚調用的頁面通過輔助數組得到另外兩個頁面中最先進入的頁面置換頁面記錄內存狀態計數器加一更新輔助函數頁面調用結束是結束
圖4 最佳置換算法流程圖 2.4界面設計
采用c# 設計windows窗體應用程序,使用下拉列表框選擇算法,通過按鈕添加待調用的頁面。通過文本控件顯示模擬結果。顯示樣式:第一行:算法名稱;
第二行:調用頁面順序;
第三行至第五行顯示內存在每調用一次頁面后的狀態;
第六行:是否缺頁;
最后一行顯示缺頁率;
第3章 詳細設計與實現
3.1函數設計
1、添加按鈕功能實現代碼
主要功能:實現單擊一次添加一個調用頁面,并給出相應的提示,如正在輸入的是第幾次調度頁面,在輸入為空時能夠彈出對話框提示用戶,在輸入完成時為避免數組越界應在輸入完成時隱藏;輸入過程中始終保證時輸入焦點。private void btnAdd_Click(object sender, EventArgs e){ if(txtAdd.Text!= “")//輸入不為空才能繼續輸入 { page_dd[i_add] = Convert.ToInt32(txtAdd.Text);/*將輸入值賦值給頁面數組*/ txtShow.Text += txtAdd.Text + ” “;/*顯示供用戶查閱*/ i_add++;txtAdd.Clear();/*清空*/ if(i_add == MaxN)//輸入結束時 { txtAdd.ReadOnly = true;//不允許繼續輸入 btnAdd.Hide();//按鈕隱藏 return;} txtAdd.Focus();//設置為輸入焦點
label2.Text = ”第“ +(i_add + 1)+ ”次調度頁面:“;/*提示用戶正在輸入的是第幾次調度頁面*/ } /*輸入為空則彈出對話框提示用戶輸入為空*/ else { MessageBox.Show(”請輸入調用頁面!“, ”輸入為空“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtAdd.Focus();} }
2、初始化函數
主要功能:將內存一先進先出方式填滿,并記錄每個頁面進入時間,服務于先進先出頁面置換算法和最佳置換算法。
void init(int[] a, int[] b,int []m1,int[]m2,int[]m3){ /*內存未滿時循環*/ for(int i = 0;i < MaxM&&page_p //調整輔助數組將剛進入內存的頁面的對應時間 OPT_F(O_Q ,i); count++;//缺頁計數器加一 m1[page_p] = b[0];//保存內存狀態 m2[page_p] = b[1];m3[page_p] = b[2];page_p++;//調用下一頁面 //檢查內存中是否原先就有需要的頁面; for(int j = 0;j <= i&&page_p s[page_p] = 'F';//缺頁數組對應數據更改 m1[page_p] = b[0];//記錄內存狀態 m2[page_p] = b[1];m3[page_p] = b[2];OPT_F(O_Q,-1);//調整最佳置換算法輔助函數 page_p++;//調用下一頁 j =-1;//重新開始尋找 } } } } 3、先進先出頁面置換函數 主要功能:根據先進先出算法要求在產生缺頁中斷時采用先進先出方式確定淘汰頁面,并在每次頁面調用時記錄下內存狀態,缺頁次數;采用循環隊列使得每次出隊的一定是最先進入內存的。 private void FIFO(int[] a, int[] b,int[]m1,int[]m2,int[]m3,char[] s){ int Fpage_p = page_p;int front, rear;//定義隊列對手和對尾指針并初始化 front = 0;rear = MaxM1;int sa;for(;Fpage_p < MaxN;Fpage_p++){ sa = 0;for(int i = 0;i < MaxM;i++)//檢查內存中是否已有要調用的頁面。 { 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;} } /*最近最久未使用算法輔助數組調整函數*/ 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]++;} } /*最佳置換算法輔助數組調整函數*/ 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];//調入內存 count++;m1[page_p] = b[0];//保存內存狀態 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++)//用的頁面。{ 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){ 檢查內存中是否已有要調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;//刷新狀態數組 OPT_J[i] = MaxN;} sa = 0;for(int i = 0;i < MaxM;i++)//檢查內存中是否已有要調用的頁面。 { 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)//缺頁 { 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://全部頁面以后都不會再度調用 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://有一個頁面將在以后調用 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;} } } } /*重置函數*/ 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';} } } 操 作 系 統 課 程 設 計 實 驗 報 告 學院:計算機科學與技術學院 班級:計112 學號:1113022032 姓名: 一、實驗名稱: 用C++實現驅動調度算法、頁面替換算法、銀行家算法、處理器調度算法 二、實驗要求: 書寫實驗報告,包括的內容有: (1)實驗題目 (2)程序中使用的數據結構及主要文字說明 (3)帶有注釋的源程序 (4)執行程序說明,表明各進程控制快的初始狀態,以及各算法的運行狀態 (5)通過實驗后的收獲與體會及對實驗的改進意見和見解 二、實驗目的: 通過自己編程來實現各類操作系統算法,進一步理解操作系統的概念及含義,提高對操作系統的認識,同時提高自己的動手實踐能力。加強我們對各類算法的理解。 三、實驗內容: 1、實現頁面替換算法 (1)FIFO 先進先出頁面替換算法 (2)LRU最近最少使用頁面替換算法 (3)LFU最少使用頻率頁面替換算法 2、銀行家算法 3、實現驅動調度算法 (1)先來先服務算法 (2)電梯算法 (3)掃描算法 4、實現處理器調度 (1)先進先出處理器調度 (2)時間片輪轉法 (3)優先級調度 四、實驗原理: 1、頁面替換算法 先進先出頁面置換算法:該算法總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面加以淘汰。將已調入內存的頁面按先后次序鏈接成一個隊列,將最先調入的頁面與新頁面進行置換 最近最久未使用置換算法:該算法是利用“最近的過去”作為“最近的將來”,將最近最久未使用的頁面加以淘汰。將已調入內存的頁面按先后順序鏈接成一個隊列,為每一個頁面增加一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的是時間t,當需淘汰一個頁面時,選擇現有頁面中其t值最大,即最近最久未使用的頁面加以淘汰 2、銀行家算法 先對用戶提出的請求進行合法性檢查,即檢查請求的是不大于需要的,是否不大于可利用的。若請求合法,則進行試分配。最后對試分配后的狀態調用安全性檢查算法進行安全性檢查。若安全,則分配,否則,不分配,恢復原來狀態,拒絕申請。 3、驅動調度算法 先進先出算法(FIFO):總是嚴格按時間順序對磁盤請求予以處理。算法實現簡單、易于理解并且相對公平,不會發生進程餓死現象。但該算法可能會移動的柱面數較多并且會 經常更換移動方向,效率有待提高 電梯調度算法:總是將一個方向上的請求全部處理完后,才改變方向繼續處理其他請求。 掃描算法(scan algorithm):總是從最外向最內(或最內向最外)進行掃描,然后在從最內向最外(或最外向最內)掃描。該算法與電梯調度算法的區別是電梯調度在沒有最外或最內的請求時不會移動到最外或最內柱面。 4、處理器調度算法 先進先出處理器調度:按照作業進入系統后備工作隊列的先后次序來挑選作業,先進入系統的作業將優先被挑選進入主存,創建用戶進程,分配所需資源,然后移入就緒隊列。 時間片輪轉法調度算法:調度次序每次把CPU分配給就緒隊列進程/線程使用規 定的時間間隔,就緒隊列中每個進程/線程輪流的運行一個時間片,當時間片耗盡時,就強迫當前運行進程/線程讓出處理器,轉而排列到就緒隊列尾部,等候下一輪調度。 優先級調度:根據確定的優先級來選取進程/線程,總是選擇就緒隊列中的優先 級最高者投入運行,即優先級越高,先被調用。 五、數據結構設計 對操作系統的各類算法設計數據結構如下: 頁面替換算法:void FIFO();void LRU();void LFU(); 銀行家算法:void Init()初始化算法 void Bank()銀行家算法 bool Safe()安全性算法 驅動調度算法: struct MagneticHead//磁頭構成{ int site; int count; bool direct; }; struct Range//磁盤磁道范圍 { int mStart; int mEnd; }; struct RequestList//請求序列 { int site; bool state; }; struct Data//基本數據集合{ MagneticHead magneticHead; RequestList *requestList; int *executeList; Range range; int length; }; 處理器調度: typedef struct pcb//時間片輪轉法 { char pname[N]; int runtime; int arrivetime; char state; struct pcb*next; }PCB; typedef struct PCB1//先進先出服務 { char ID[3];//進程號 char name[10];//進程名 char state;//運行狀態 floatarrivetime;//到達時間 floatstarttime;//進程開始時間 floatfinishtime;//進程結束時間 floatservicetime;//服務時間 float turnaroundtime;//周轉時間 float weightedturnaroundtime;//帶權周轉時間 struct PCB1 *next;//指向下個進程 }pcb1; struct pcb2 {優先級調度 char name[10]; char state; int super; int ntime; int rtime; struct pcb2* link; }*ready=NULL,*d; typedef struct pcb2 PCB2; 六、課程設計總結 在本次課程設計中,就是講平時所做的實驗結合起來,實現操作系統的各類算法,了解操作系統的運行原理以及其基本概念,更好的將操作系統的原理很好的展現出來。同時,在本次實驗中遇到了很多問題,需要我們仔細的檢查和修改。其次,實驗中為了能更好的體現各類算法的運行情況,需要做一個清晰的界面,以能清楚地看出運行結果。 操作系統課程設計報告 專 業:計算機科學與技術 學 號: 姓 名: 提交日期: 操作系統課程設計報告 【設計目的】 (1)本實驗的目的是通過一個簡單多用戶文件系統的設計,加深理解文件系統的內部功能和內部實現。 (2)結合數據結構、程序設計、計算機原理等課程的知識,設計一個二級文件系統,進一步理解操作系統。 (3)通過分對實際問題的分析、設計、編程實現,提高學生實際應用、編程的能力 【設計內容】 為Linux系統設計一個簡單的二級文件系統。要求做到以下幾點: 1.可以實現下列幾條命令: login 用戶登錄 dir 列目錄 create 創建文件 delete 刪除文件 open 打開文件 close 關閉文件 read 讀文件 write 寫文件 cd 進出目錄 2.列目錄時要列出文件名,物理地址,保護碼和文件長度 3.源文件可以進行讀寫保護 【實驗環境】 Windows xp/7 C++/VC++ 【相關知識綜述】 1、文件系統 文件系統是操作系統用于明確存儲設備(常見的是磁盤,也有基于NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。文件系統由三部分組成:文件系統的接口,對對象操縱和管理的軟件集合,對象及屬性。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲并對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,當用戶不再使用時撤銷文件等。 2、位示圖 位示圖是利用二進制的一位來表示磁盤中的一個盤塊的使用情況。當其值為“0”時,表示對應的盤塊空閑;為“1”時,表示已經分配。有的系統把“0”作為盤塊已分配的標記,把“1”作為空閑標志。(它們的本質上是相同的,都是用一位的兩種狀態標志空閑和已分配兩種情況。)磁盤上的所有盤塊都有一個二進制位與之對應,這樣,由所有盤塊所對應的位構成一個集合,稱為位示圖。 操作系統課程設計報告 【設計思路】 本文件系統采用兩級目錄,其中第一級對應于用戶賬號,第二級對應于用戶帳號下的文件。另外,為了簡便文件系統未考慮文件共享,文件系統安全以及管道文件與設備文件等特殊內容。 首先應確定文件系統的數據結構:主目錄、子目錄及活動文件等。主目錄和子目錄都以文件的形式存放于磁盤,這樣便于查找和修改。 用戶創建的文件,可以編號存儲于磁盤上。如:file0,file1,file2?并以編號作為物理地址,在目錄中進行登記。 【程序主要流程圖】 否 驗證是否成 功? 是 目錄 右鍵進行選擇 操作 新建目錄新建文件打開文件 結束 開始登錄刪除屬性 2 操作系統課程設計報告 【源程序清單】 typedef struct //文件結構體 /*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 //用戶文件目錄結構體 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 //文件打開模式 /*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);//獲取用戶的序號 printf(“Please input filename:”);gets(fname);//獲得需要打開的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { 操作系統課程設計報告 } } 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);//獲得需要打開的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=1;//打開文件 ifopen[k][i].openmode=ufd[k]->ufdfile[i].fmode;//將讀寫屬性賦值 //test// printf(“i=%d,k=%dn”,i,k); ///test// printf(“openmode=%dn”,ifopen[k][i].openmode); printf(“Open file successfully!n”); break;//打開文件則跳出循環 itoa(ufd[k]->ufdfile[i].fpaddr,str,10);//itoa函數,把數字轉換成字符串 strcpy(str1,“file”);strcat(str1,str);strcpy(str,“c:osfilefile”);strcat(str,str1);strcat(str,“.txt”);//str為文件的物理路徑 if(remove(str)==0) //調用remove函數刪除 第k個用戶的第i個文件ufd[k]->ufdfile[i] { fpaddrno[ufd[k]->ufdfile[i].fpaddr] = 0;//位示圖置為0,表示沒被占用 for(j = i;j<=fcount[k]-1;j++)//文件順序往前移一位 ufd[k]->ufdfile[j] = ufd[k]->ufdfile[j+1]; fcount[k] = fcount[k]-1;//文件數-1 printf(“Delete file successfully!n”); //除了刪除原文件,還要 刪除dir中的東西 } else printf(“Delete file fail!n”);break;} 操作系統課程設計報告 } } } void CloseF()/*Close File*/ { int i,k=0;char fname[MAXNAME]; k=ExistD(dirname);printf(“Please input filename:”);gets(fname);//獲得需要關閉的文件名fname for(i=0;i if(strcmp(strupr(ufd[k]->ufdfile[i].fname),strupr(fname))==0) { ifopen[k][i].ifopen=0;//關閉文件 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(”Opened File(s)List:n“);k=ExistD(dirname); 操作系統課程設計報告 for(i=0;i //文件屬性為只寫或者是讀寫才能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())!='#')//以#為結尾 { fputc(c,fp_file); if(c!='n')length++; } //fprintf(fp_file,”n“); 操作系統課程設計報告 fclose(fp_file); ufd[k]->ufdfile[fcount[i]-1].flength += length;//原長度加輸入長度 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; } } } 操作系統課程設計報告 【測試結果】 1、創建用戶 2、創建文件,并且打開讀取文件 操作系統課程設計報告 3、寫文件 4、刪除文件 操作系統課程設計報告 【設計總結】 這兩周的課程設計時間非常短,從中學到了很多知識,也為我們的學習提供了良好的實踐平臺。首先,通過老師的細心指導和同學們的相互幫助,讓我對題目【二級文件系統】有了進一步了解。接下來,主要是研究老師所給的大部分代碼,參考他的基本思路,并且思考每一個結構體在代碼中的具體作用。這期間和一些同學交流了各自的思路,在交流中,大家漸漸的明確了這個程序的思路、框架結構等。我們所做的主要是補充了刪除文件,打開文件,關閉文件,寫文件這幾個部分。 代碼編寫完了之后,實現了題目所要求的基本功能,但是在測試的過程中,還發現了這個程序存在各種各樣的bug。不斷的測試修改后,得到完善。 這次課設最大的收獲在于:學會交流以及相互幫助。在大家的交流溝通之中,我們解決了一個又一個難題。 在這次課設中,我還意識到,要把這門課真真正正地學好,不單單只是為了能夠應付考試,平時還要多加學習,多加努力才對。 【參考文獻】 【1】C語言程序設計(第三版)譚浩強 【2】計算機操作系統教程(第三版).張堯學 史美林 張高 【3】計算機操作系統,西安電子科技大學出版社,方敏主編,2004.8第四篇:操作系統課程設計報告
第五篇:操作系統課程設計報告