太原理工大學操作系統(tǒng)實驗報告.doc
《太原理工大學操作系統(tǒng)實驗報告.doc》由會員分享,可在線閱讀,更多相關《太原理工大學操作系統(tǒng)實驗報告.doc(21頁珍藏版)》請在裝配圖網(wǎng)上搜索。
課程名稱: 操作系統(tǒng)B 實驗項目: 操作系統(tǒng)實驗 實驗地點: 實驗樓209 專業(yè)班級: 軟件 學生姓名: 學號: 指導教師: 方昀 2015 年 11 月 30目 錄實驗一 幾種操作系統(tǒng)的界面1一、目的和要求1二、內(nèi)容1實驗二 進程調(diào)度程序設計2一、目的和要求2二、示例2實驗三 存儲管理程序設計9一、目的和要求9二、提示9實驗一 幾種操作系統(tǒng)的界面一、目的和要求(一) 目的本實驗的目的是使學生熟悉12種操作系統(tǒng)的界面,在熟練使用機器的基礎上,能了解各種操作命令和系統(tǒng)調(diào)用在系統(tǒng)中的大致工作過程。也就是通過操作系統(tǒng)的外部特征,逐步深入到操作系統(tǒng)的內(nèi)部實質(zhì)內(nèi)容中去。(二) 要求1. 能熟練的在12種操作系統(tǒng)的環(huán)境下工作,學會使用各種命令,熟悉系統(tǒng)提供的各種功能,主動而有效地使用計算機。2. 熟悉系統(tǒng)實用程序的調(diào)用方法和各種系統(tǒng)調(diào)用模塊的功能和作用二、內(nèi)容在某種操作系統(tǒng)的環(huán)境下建立、修改、運行、打印源程序和結(jié)果,最后撤消一個完整的程序。提示:可按下述步驟進行1 編寫一個完整的源程序,通過編輯命令送入機器,建立源程序文件;2 編譯該源文件,建立相應的目標文件;3 編譯有錯時,再用編輯命令修改源文件,消除全部詞法和語法錯誤;4 連接目標文件,形成可執(zhí)行文件;5 執(zhí)行該文件,得到結(jié)果;6 打印輸出源程序和運行結(jié)果;7 撤消本次實驗中形成的所有文件。三、實驗步驟及程序流程圖1)Dos命令行。1. 按住Windows鍵+R輸入notepad回車調(diào)出記事本。2. 編輯一個java程序選擇另存為d:。3. 按住Windows鍵+R輸入cmd回車。4. 進入Dos界面鍵入d:。5. 輸入dir查看java文件,使用javac命令進行編輯四、程序清單(據(jù)情況而定)class demo public static void main(String args) System.out.print(這是一個java例子); 五、討論、心得本次實驗是在Windows10系統(tǒng)下進行的,通過對一個Java小程序的編譯連接熟悉對Win10的操作以及DOS命令的使用。試驗中使用到的DOS工具: 查看目錄:dir 編輯:javac 通過本次實驗,進一步熟悉了對操作系統(tǒng)尤其是DOS 命令的使用,初步了解了部分操作命令和系統(tǒng)調(diào)用在系統(tǒng)中的大致工作過程,通過實踐也加深了對老師課堂一些所講知識的理解。實驗二 進程調(diào)度程序設計一、目的和要求(一) 目的進程是操作系統(tǒng)最重要的概念之一,進程調(diào)度是操作系統(tǒng)的主要內(nèi)容,本實驗要求學生獨立地用高級語言編寫一個進程調(diào)度程序,調(diào)度算法可任意選擇或自行設計,本實驗可使學生加深對進程調(diào)度和各種調(diào)度算法的理解。(二) 要求1 設計一個有幾個進程并發(fā)執(zhí)行的進程調(diào)度程序,每個進程由一個進程控制塊(PCB)表示,進程控制塊通常應包括下述信息:進程名,進程優(yōu)先數(shù),進程需要運行的時間,占用CPU的時間以及進程的狀態(tài)等,且可按照調(diào)度算法的不同而增刪。2 調(diào)度程序應包含23種不同的調(diào)度算法,運行時可以任選一種,以利于各種方法的分析和比較。3 系統(tǒng)應能顯示或打印各進程狀態(tài)和參數(shù)的變化情況,便于觀察。二、示例1 題目 本程序可選用優(yōu)先數(shù)法或簡單輪轉(zhuǎn)法對五個進程進行調(diào)度。每個進程處于運行R(run)、就緒W(wait)和完成F(finish)三種狀態(tài)之一,并假定起始狀態(tài)都是就緒狀態(tài)W。為了便于處理,程序中進程的運行時間以時間片為單位計算。各進程的優(yōu)先數(shù)或輪轉(zhuǎn)時間片數(shù)、以及進程需要運行的時間片數(shù),均由偽隨機數(shù)發(fā)生器產(chǎn)生。進程控制塊結(jié)構(gòu)如表2-1所示: 表2-1 PCB 進程標識符 鏈指針 優(yōu)先數(shù)/輪轉(zhuǎn)時間片數(shù) 占用CPU時間片數(shù) 進程所需時間片數(shù) 進程狀態(tài)進程控制塊鏈結(jié)構(gòu)如圖2-1所示: RUN HEAD TAIL 圖2-1 進程控制塊鏈結(jié)構(gòu)其中:RUN當前運行進程指針;HEAD進程就緒鏈鏈首指針;TAIL進程就緒鏈鏈尾指針。2. 算法與框圖 程序框圖如圖2-2所示。圖2-2 進程調(diào)度框圖 (1)優(yōu)先數(shù)法。 進程就緒鏈按優(yōu)先數(shù)大小從大到小排列,鏈首進程首先投入運行。每過一個時間片,運行進程所需運行的時間片數(shù)減1,說明它已運行了一個時間片,優(yōu)先數(shù)也減3。理由是該進程如果在一個時間片中完成不了,優(yōu)先級應降低一級。接著比較現(xiàn)行進程和就緒鏈鏈首進程的優(yōu)先數(shù),如果仍是現(xiàn)行進程高或者相同,就讓現(xiàn)行進程繼續(xù)運行,否則,調(diào)度就緒鏈鏈首進程投入運行。原運行進程再按其優(yōu)先數(shù)大小插入就緒鏈,且改變它們對應的進程狀態(tài),直至所有進程都運行完各自的時間片數(shù)。(2)簡單輪轉(zhuǎn)法。 進程就緒鏈按各進程進入的先后次序排列,鏈首進程首先投入運行。進程每次占用處理機的輪轉(zhuǎn)時間按其重要程度登入進程控制塊中的輪轉(zhuǎn)時間片數(shù)記錄項(相應于優(yōu)先數(shù)法的優(yōu)先數(shù)記錄項位置)。每過一個時間片,運行進程占用處理機的時間片數(shù)加1,然后比較占用處理機的時間片數(shù)是否與該進程的輪轉(zhuǎn)時間片數(shù)相等,若相等說明已到達輪轉(zhuǎn)時間,應將現(xiàn)運行進程排到就緒鏈末尾,調(diào)度鏈首進程占用處理機,且改變它們的進程狀態(tài),直至所有進程完成各自的時間片。 三、代碼:#include #include #define furthest 5 struct process /*PCB STRUCTURE*/int id;int priority;int cputime;int alltime;char state;int next;prochainfurthest - 1;int procnum;int rand();int algo;int run, head, tail, j;void print();void insert(int q);void insert2();void timesch();void init();void prisch(); int main() /*MAIN PROGRAM*/agan: printf(type the algorithm is (1:RR,2:PRIO):);scanf(%d, &algo);if (algo = 2)printf(output of priority.n);init();prisch();elseif (algo = 1)printf(output of round robin.n);init();timesch();elseprintf(try again,pleasen);goto agan;for (j = 1; j = 40; j+)printf(=);printf(nn);for (j = 1; j = 40; j+)printf(=);printf(nn);printf(system finishedn);getchar();void print() /*PRINT THE RUNNING PROCESS,WAITING QUEUE AND PCB SEQUENCE LIST*/int k, p;for (k = 1; k = 40; k+)printf(=);printf(nrunning proc. );printf(waiting queue.);printf(n %d , prochainrun.id);p = head;while (p != 0)printf(%5d, p);p = prochainp.next;printf(n);for (k = 1; k = 40; k+)printf(=);printf(n);printf( id );for (k = 1; kfurthest + 1; k+)printf(%5d, prochaink.id);printf(n);printf(priority );for (k = 1; kfurthest + 1; k+)printf(%5d, prochaink.priority);printf(n);printf(cputime );for (k = 1; kfurthest + 1; k+)printf(%5d, prochaink.cputime);printf(n);printf(alltime );for (k = 1; kfurthest + 1; k+)printf(%5d, prochaink.alltime);printf(n);printf(state );for (k = 1; kfurthest + 1; k+)printf(%5c, prochaink.state);printf(n);printf(next );for (k = 1; kfurthest + 1; k+)printf(%5d, prochaink.next);printf(n);void insert(int q) /*INSERT A PROCESS*/int p, s;p = head;s = prochainhead.next;while (prochainq.priorityprochains.priority) & (s != 0)p = s;s = prochains.next;prochainp.next = q;prochainq.next = s;void insert2() /*PUT A PROCESS ONTO THE TAIL OF THE QUEUE*/prochaintail.next = run;tail = run;prochainrun.next = 0;void init() /*CREATE A WAITING QUEUE*/int i;head = 0;if (algo = 2)for (i = 1; ifurthest + 1; i+)prochaini.id = i;prochaini.priority = (rand() + 11) % 41;prochaini.cputime = 0;prochaini.alltime = (rand() + 1) % 7;prochaini.state = W;prochaini.next = 0;if (prochaini.priorityprochainhead.priority) & (head != 0)insert(prochaini.id);elseprochaini.next = head;head = prochaini.id;elsefor (i = 1; ifurthest + 1; i+)prochaini.id = i;prochaini.priority = (rand() + 1) % 3 + 1;prochaini.cputime = 0;prochaini.alltime = (rand() + 1) % 7;prochaini.state = W;prochaini.next = (i + 1) % (furthest + 1);head = 1;tail = furthest;prochainfurthest.next = 0;run = head;prochainrun.state = R;head = prochainhead.next;prochainrun.next = 0;print();void prisch() /*THE PROCESS WITH PRIO ALGORITHM*/while (run != 0)prochainrun.cputime += 1;prochainrun.priority -= 3;prochainrun.alltime -= 1;if (prochainrun.alltime = 0)prochainrun.state = F;prochainrun.next = 0;if (head != 0)run = head;prochainrun.state = R;head = prochainhead.next;elseprochain0.id = prochainrun.id;run = 0;elseif (prochainrun.priority prochainhead.priority) & (head != 0)prochainrun.state = W;insert(run);run = head;prochainrun.state = R;head = prochainhead.next;print();void timesch() /*THE PROCESS WITH RR ALRORITHM*/while (run != 0)prochainrun.alltime -= 1;prochainrun.cputime += 1;if (prochainrun.alltime = 0)prochainrun.state = F;prochainrun.next = 0;if (head != 0)run = head;prochainrun.state = R;head = prochainhead.next;elseprochain0.id = prochainrun.id;run = 0;elseif (prochainrun.cputime = prochainrun.priority) & (head != 0)prochainrun.state = W;prochainrun.cputime = 0;insert2();run = head;prochainrun.state = R;head = prochainhead.next;print();四、結(jié)果:五、感想: 本次試驗的目的在于加深對進程調(diào)度和各種調(diào)度算法的理解,故通過對優(yōu)先數(shù)法和簡單輪轉(zhuǎn)法編輯程序?qū)嶋H運行來加深對這兩種方法的理解。 對于簡單輪轉(zhuǎn)法,既將全部的進程按照進入的先后順序排成一個就緒隊列,設置每隔一段時間后將CPU分配給隊列中新的隊首進程,這樣就可以保證就緒隊列中的所有進程在確定的時間段內(nèi)都能獲得一個時間片的處理機時間。 而對于優(yōu)先數(shù)法,本次試驗中使用了動態(tài)優(yōu)先數(shù)對進程進行排序,即就緒隊列按優(yōu)先數(shù)從大到小進行排列,而各進程的優(yōu)先數(shù)隨著進程的推進而改變,以達到獲取更好的調(diào)度性能的目的。簡單輪轉(zhuǎn)法有效的保證了隊列中的所有進程都能分配到處理機,而優(yōu)先數(shù)法則可防止一個長作業(yè)長期的壟斷處理機。通過本次實驗對試驗中所涉及的兩種算法的理解進一步加深,有效復習了課堂上所講到的相關知識。實驗三 存儲管理程序設計一、目的和要求(一) 目的存儲管理的主要功能之一是合理地分配主存空間。請求頁式管理是一種常用的虛擬存儲管理技術。本實驗的目的是通過請求頁式存儲管理中頁面置換算法的模擬設計,來了解虛擬存儲技術的特點,掌握請求頁式存儲管理的頁面置換算法。(二) 要求模擬頁式虛擬存儲管理中硬件的地址轉(zhuǎn)換和缺頁中斷的處理過程,并用先進先出調(diào)度算法(FIFO)處理缺頁中斷。二、提示(1) 為了裝入一個頁面而必須調(diào)出一頁時,如果被選中調(diào)出的頁面在執(zhí)行中沒有修改過,則不必把該頁重新寫到磁盤上(因磁盤上已有副本)。因此,在頁表中可以增加是否修改過的標志,當執(zhí)行“存”指令、“寫”指令時把對應頁的修改標志置成“1”,表示該頁修改過,否則為“0”,表示該頁未修改過。頁表格式如表3-1所示。表3-1 頁表格式 頁 號 標 志 主存塊號 修改標志 磁盤上的位置(2) 設計一個地址轉(zhuǎn)換程序來模擬硬件的地址轉(zhuǎn)換和缺頁中斷處理過程。當訪問的頁在主存時則形成絕對地址,但不去模擬指令的執(zhí)行,可用輸出轉(zhuǎn)換后的絕對地址來表示一條指令已完成。當訪問的頁不在主存時則輸出“*該頁頁號”來表示硬件產(chǎn)生了一次缺頁中斷。模擬地址轉(zhuǎn)換的程序流程如圖3-1所示。(3) 編制一個FIFO頁面調(diào)度程序。FIFO頁面調(diào)度算法總是先調(diào)出作業(yè)中最先進入主存的那一頁,因此,可以用一個數(shù)組來構(gòu)成頁號隊列。數(shù)組中每個元素是該作業(yè)已在主存的頁面號,假定分配給作業(yè)的主存塊數(shù)為m,且該作業(yè)開始的m頁已裝入主存,則數(shù)組可由m個元素組成:P0,P1,Pm-1它們的初值為P0=0,P1=1,Pm-1= m-1用一指針k指示當要裝入新頁時應調(diào)出的頁在數(shù)組的位置,k的初值為“0”。圖3-1 地址轉(zhuǎn)換和FIFO頁面調(diào)度流程當產(chǎn)生缺頁中斷后,操作系統(tǒng)總是選擇Pk所指出的頁面調(diào)出,然后執(zhí)行Pk=要裝入的新頁頁號k=(k+1)mod m在實驗中不必實際地啟動磁盤執(zhí)行調(diào)出一頁和裝入一頁的工作,而用輸出“OUT調(diào)出的頁號”和“IN要裝入的新頁頁號”來模擬一次調(diào)出和裝入的過程。模擬程序的流程見圖3-1。(1) 假定主存的每塊長度為1024個字節(jié),現(xiàn)有一個共7頁的作業(yè),其副本已在磁盤上。系統(tǒng)為該作業(yè)分配了4塊主存塊,且該作業(yè)的第0頁至第3頁已經(jīng)裝入主存,其余3頁尚未裝入主存,該作業(yè)的頁表見表3-2所示。表3-2 作業(yè)的頁表 頁號 標志 主存塊號 修改標志 在磁盤上的位置 0 1 5 0 011 1 1 8 0 012 2 1 9 0 013 3 1 1 0 021 4 0 0 022 5 0 0 023 6 0 0 121如果該作業(yè)依次執(zhí)行的指令序列如表3-3所示。表3-3 作業(yè)依次執(zhí)行的指令序列 操作 頁號 頁內(nèi)地址 操作 頁號 頁內(nèi)地址 + 0 070 移位 4 053 + 1 050 + 5 023 2 015 存 1 037 存 3 021 取 2 078 取 0 056 + 4 001 - 6 040 存 6 084依次執(zhí)行上述的指令序列來調(diào)試你所設計的程序(僅模擬指令的執(zhí)行,不必考慮指令序列中具體操作的執(zhí)行)(2) 為了檢查程序的正確性,可自行確定若干組指令序列,運行設計的程序,核對執(zhí)行結(jié)果。三、代碼:#include #include #include using namespace std;struct pageTable/定義頁表int address;/地址int page;/頁號int block;/塊號struct pageTable *next;typedef struct pageTable PAGETABLE;PAGETABLE *pt;const int first_memory = 1000;/內(nèi)存首地址int work320;/作業(yè)int index, offset;/index是作業(yè)的頁號,offset為頁內(nèi)偏移地址PAGETABLE*oldPtr;/minPtr指向駐留時間最久的頁int count1;/記數(shù)器,用于記錄發(fā)生的缺頁數(shù)bool is_LRU = false;/是否是LRU算法void init();void insertPage();void pushback_Page(PAGETABLE *, PAGETABLE *);void print(PAGETABLE *);void run(int);void find_FIFO();void find_LRU();void main(void)int i = 0;while (1)cout nPlease select a number(1,2,0) endl;cout 1-先進先出算法(FIFO) endl;cout 2-最久未使用算法(LRU) endl;cout 0-程序結(jié)束 i;if (i = 1)cout nThis is a example for FIFO: endl;is_LRU = false;init();/構(gòu)造頁表和內(nèi)存else if (i = 2)cout nThis is a example for LRU: next = NULL;for (int i = 0; inext;/初始化最久的頁面cout 頁表初始狀態(tài)為: endl;print(pt);for (int k = 0; k320; k+)/初始化作業(yè)workk = k;for (int f = 0; f53; f+)/作業(yè)運行int m, m1, m2;m = rand() % 320;if (m = 319)m = 318;run(m);print(pt);run(m + 1);print(pt);if (m = 0)m1 = 0;elsem1 = rand() % m;run(m1);print(pt);run(m1 + 1);print(pt);m2 = rand() % (320 - m) + m - 1;if (m20)m2 = 318;if (m2 = 319)m2 = 318;run(m2);print(pt);run(m2 + 1);print(pt);rate = (double)count / 318 * 100;cout nn 缺頁率為: rate % address = id;newPage-page = -1;newPage-block = blockId;newPage-next = NULL;pushback_Page(pt, newPage);elsecout 沒有內(nèi)存足夠的空間為頁表分配! next;while (current != NULL)previous = current;current = current-next;previous-next = item;void print(PAGETABLE *ptr)PAGETABLE *temp;temp = ptr-next;cout 頁號 塊號 endl;while (temp != NULL)cout page block next;void run(int num)int universal;PAGETABLE *previous, *current;index = worknum / 10;/程序所在的頁號offset = worknum % 10;/頁內(nèi)的位移量previous = pt;current = previous-next;while (current != NULL & current-page != index)previous = current;current = current-next;if (current = NULL)cout n作業(yè) num 沒有在內(nèi)存,發(fā)生缺頁中斷 block) * 10 + offset;cout n作業(yè) num 所在內(nèi)存的物理地址為 universal next = NULL)universal = first_memory + (current-block) * 10 + offset;cout n作業(yè) num 所在內(nèi)存的物理地址為 universal next = current-next;ptr = pt-next;while (ptr-next != NULL)ptr = ptr-next;ptr-next = temp;temp-next = NULL;universal = first_memory + (temp-block) * 10 + offset;cout n作業(yè) num 所在內(nèi)存的物理地址為 universal next;if (oldPtr = NULL)oldPtr = pt-next;while (pos != NULL & pos-page != -1)pos = pos-next;if (pos = NULL)/出現(xiàn)缺頁中斷cout *頁面開始置換* page = index;universal = first_memory + (oldPtr-block) * 10 + offset;cout 置換后作業(yè)在內(nèi)存的物理地址為 universal next;else/頁面還未裝完pos-page = index;universal = first_memory + (pos-block) * 10 + offset;cout 作業(yè)在內(nèi)存的物理地址為 universal next;while (pos != NULL & pos-page != -1)pos = pos-next;if (pos = NULL)/出現(xiàn)缺頁中斷cout *頁面開始置換* next;temp-page = index;universal = first_memory + (temp-block) * 10 + offset;cout 置換后作業(yè)在內(nèi)存的物理地址為 universal page = index;universal = first_memory + (pos-block) * 10 + offset;cout 作業(yè)在內(nèi)存的物理地址為 universal endl;四、結(jié)果:五、心得本次試驗的目的是通過請求頁式存儲管理中頁面置換算法的模擬設計,來了解虛擬存儲技術的特點,掌握請求頁式存儲管理的頁面置換算法。試驗中主要使用了FIFO算法,即總是先淘汰最先進入內(nèi)存的頁面(駐留最久的頁面),實現(xiàn)時只需要把一個進程也調(diào)入內(nèi)存的頁面按先后次序鏈接成一個隊列,并設置一個指針,總是指向最老的頁面。FIFO的主要的缺點是沒有考慮到有的頁面會經(jīng)常被訪問,因此并沒有辦法保證這種頁面能夠保留在內(nèi)存中,可能使得利用率較低。通過本次試驗加深了對相應算法的理解,鞏固了相關的知識和使用的方法。- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關 鍵 詞:
- 太原理工 大學 操作系統(tǒng) 實驗 報告
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。
鏈接地址:http://www.szxfmmzy.com/p-6523448.html