計算機操作系統實驗報告.doc_第1頁
計算機操作系統實驗報告.doc_第2頁
計算機操作系統實驗報告.doc_第3頁
計算機操作系統實驗報告.doc_第4頁
計算機操作系統實驗報告.doc_第5頁
免費預覽已結束,剩余13頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

北方工業大學實 驗 報 告 書學 生 姓 名 學 號 班 級 2012 2013 學年 第 一 學期計算機操作系統實驗報告實驗名稱進程管理實驗序號1實驗日期實驗人一、實驗目的和要求1加深對進程概念的理解,明確進程和程序的區別2進一步認識并發執行的實質3分析進程爭用資源的現象,學習解決進程互斥的方法4了解Linux系統中進程通信的基本原理二、相關背景知識進程: 進程是操作系統結構的基礎;是一個正在執行的程序;計算機中正在運行的程序實例;可以分配給處理器并由處理器執行的一個實體;由單一順序的執行顯示,一個當前狀態和一組相關的系統資源所描述的活動單元。并發執行:在操作系統中,是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。Fork( ):一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。若成功調用一次fork()則返回兩個值,子進程返回0,父進程返回子進程ID;否則,出錯返回-1。子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間。進程互斥:兩個或兩個以上的進程,不能同時進入關于同一組共享變量的臨界區域,否則可能發生與時間有關的錯誤,這種現象被稱作進程互斥.進程通信:兩個并行進程可以通過互相發送消息進行合作,消息是通過消息緩沖而在進程之間相互傳遞的。管道:在Linux中,管道是一種使用非常頻繁的通信機制。從本質上說,管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題,具體表現為限制管道的大小和讀取進程也可能工作得比寫進程快。從管道讀數據是一次性操作,數據一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的數據。三、實驗內容1進程的創建編寫一段程序,使用系統調用fork()創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示字符“a”;子進程分別顯示字符“b”和字符“c”。試觀察記錄屏幕上的顯示結果,并分析原因。2進程的控制修改已有程序,將每個進程輸出一個字符改為每個進程輸出幾行字符,再觀察程序執行時屏幕上的現象,并分析原因。如果在程序中使用系統調用lockf()來給每一個進程加鎖,可以實現進程之間的互斥,觀察并分析出現的現象。3進程的軟中斷通信使用系統調用fork()創建兩個子進程,再用系統調用signal()讓父進程捕捉鍵盤上來的中斷信號(即按Del鍵);當捕捉到中斷信號后,父進程用系統調用kill()向兩個子進程發出信號,子進程捕捉到信號后分別輸出下列信息后終止:Child process 1 is killed by parent!Child process 2 is killed by parent!父進程等待兩個子進程終止后,輸出如下的信息后終止:Parent process is killed!4進程的管道通信編制一段程序,實現進程的管道通信。使用系統調用pipe()建立一條管道線;兩個子進程P1和P2分別向管道各寫一句話:Child 1 is sending a message!Child 2 is sending a message!而父進程則從管道中讀出來自于兩個子進程的信息,顯示在屏幕上。要求父進程先接收P1發來的消息,然后再接收P2發來的消息。四、關鍵數據結構與函數的說明第3題中的兩個函數stop( )和waiting( )的含義分別是:void waiting() while(wait_mark!=0); /當等待標記wait_mark不為零時,等待,直到wait_mark=0函數結束,執行后面的語句;void stop() wait_mark=0; /收到了停止信號,將wait_mark置為0;五、編譯與執行過程截圖1.編譯和運行結果(多次運行結果不同):2.無鎖時的編譯和運行結果:有鎖時的編譯和運行結果:3.編譯和運行結果如下:4.編譯和運行結果如下:六、實驗結果與分析1運行時有時會出現bca,有時bac,也有acb等情況,這是因為進程是并發執行的。Fork()創建進程所需要的時間要多于輸出一個字符的時間,因此在主進程創建進程2的同時,進程1就輸出了“b”,而進程2和主進程的輸出順序是隨機性的,所以會出現上述結果。2未加鎖時,輸出的順序是亂的,有時是son,有時是child,有時是daughter;而加了鎖后輸出是順序的但具體son、daughter、child誰在前誰在后則不一定(原因同第一題)。未加鎖時,由于函數printf()輸出的字符之間不會被中斷,因此字符串內部的字符順序輸出時不變。但由于進程并發執行時的調度順序和父子進程的搶占處理機問題,輸出字符串的順序和先后隨著執行的不同而發生變化。加鎖后,某個進程搶到處理機后一直使用至其結束再解鎖,讓給其他進程,顧能連續輸出。3當輸入中斷信號后,父進程調用kill()函數,向子進程發信號,子進程收到信號后,調用stop()函數,置等待信號wait_mark為0,繼續執行,不會被困在waiting()里,上鎖,輸出,解鎖,調用exit(),結束子進程,同時告訴父進程子進程已結束,繼續執行父進程。4父子進程通過管道進行通信。在子進程未結束前父進程一直等待,當某個子進程結束后,父進程從管道中讀取子進程寫入的字符串,并打印。子進程要做的工作是:先打印自己的名字,上鎖,寫管道,解鎖,結束并告訴父進程自己已結束。七、調試時遇到的問題及解決方法(提供BUG截屏)實驗中沒有遇到較大的問題,多是一些小的語法錯誤,改正后得到正確的結果。八、調試后的程序源代碼1.#includemain() int p1,p2; while(p1=fork()=-1); if(p1=0) putchar(b); else while(p2=fork()=-1); if(p2=0) putchar(c); else putchar(a); 2.無鎖:#includemain() int p1,p2,i; while(p1=fork()=-1); if(p1=0) for(i=0;i50;i+) printf(child %dn,i); else while(p2=fork()=-1); if(p2=0)for(i=0;i50;i+) printf(son %dn,i); elsefor(i=0;i50;i+) printf(daughter %dn,i); 有鎖:#include#includemain() int p1,p2,i; while(p1=fork()=-1); if(p1=0) lockf(1,1,0); for(i=0;i50;i+)printf(child %dn,i); lockf(1,0,0); else while(p2=fork()=-1); if(p2=0) lockf(1,1,0); for(i=0;i50;i+) printf(son %dn,i); lockf(1,0,0); else lockf(1,1,0); for(i=0;i50;i+) printf(daughter %dn,i); lockf(1,0,0); 3.#include#include#includevoid waiting();void stop(); int wait_mark=0;main() int p1,p2; while(p1=fork()=-1); if(p10) while(p2=fork()=-1); if(p20) printf(parentn); wait_mark=1; signal(SIGINT,stop); waiting(0); kill(p1,16); kill(p2,17); wait(0); wait(0); printf(parent process is killedn); exit(0); else printf(p2n); wait_mark=1; signal(17,stop); signal(SIGINT,stop); waiting(); lockf(1,1,0); printf(child process 2 is killed by parentn); lockf(1,0,0); exit(0); else printf(p1n); wait_mark=1; signal(16,stop); signal(SIGINT,stop); waiting(); lockf(1,1,0); printf(child process 1 is killed by parentn); lockf(1,0,0); exit(0); void waiting()while(wait_mark!=0);void stop()wait_mark=0;4.#include#include#includeint pid1,pid2;main() int fd3; char OutPipe100,InPipe100; pipe(fd); while(pid1=fork()=-1); if(pid1=0) printf(p1n); lockf(fd1,1,0); sprintf(OutPipe,Child 1 process is sending a message!); write(fd1,OutPipe,50); sleep(1); lockf(fd1,0,0); exit(0); else while(pid2=fork()=-1);if(pid2=0) printf(p2n); lockf(fd1,1,0); sprintf(OutPipe,Child 2 process is sending a message!); write(fd1,OutPipe,50); sleep(1); lockf(fd1,0,0); exit(0); else printf(parentn); wait(0); read(fd0,InPipe,50); printf(%sn,InPipe); wait(0); read(fd0,InPipe,50); printf(%sn,InPipe); exit(0); 九、實驗體會通過本次實驗,我加深對進程概念的理解,明確了進程和程序的區別,進一步認識到了并發執行的實質,分析進程爭用資源的現象,了解了fork()函數和lockf()函數的用法,學習了解決進程互斥的方法,了解Linux系統中進程通信的基本原理,讓我感覺受益匪淺。計算機操作系統實驗報告實驗名稱存儲管理實驗序號2實驗日期實驗人一、實驗目的和要求請求頁式存儲管理是一種常用的虛擬存儲管理技術。本實驗目的是通過請求頁式存儲管理中頁面置換算法的模擬設計,了解虛擬存儲技術的特點,掌握請求頁式存儲管理的頁面置換算法。二、相關背景知識頁式存儲管理:將各進程的虛擬空間劃分成若干個長度相等的頁(page),頁式管理把內存空間按頁的大小劃分成片或者頁面(page frame),然后把頁式虛擬地址與內存地址建立一一對應頁表,并用相應的硬件地址變換機構,來解決離散地址變換問題。頁式管理采用請求調頁或預調頁技術實現了內外存存儲器的統一管理。頁面置換算法:在地址映射過程中,若在頁面中發現所要訪問的頁面不再內存中,則產生缺頁中斷。當發生缺頁中斷時操作系統必須在內存選擇一個頁面將其移出內存,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換算法。常用的頁面置換算法有最佳置換算法(OPT)(理想置換算法),先進先出置換算法(FIFO),最近最久未使用(LRU)算法,Clock置換算法(LRU算法的近似實現),最少使用(LFU)置換算法,工作集算法,工作集時鐘算法,老化算法(非常類似LRU的有效算法),NRU(最近未使用)算法,第二次機會算法。三、實驗內容(1) 通過隨機數產生一個指令序列,共320條指令。指令的地址按下述原則生成:1. 50%的指令是順序執行的;2. 25%的指令是均勻分布在前地址部分;3. 25%的指令是均勻分布在后地址部分;具體的實施方法是:1. 在0,319的指令地址之間隨機選取一起點m;2. 順序執行一條指令,即執行地址為m+1的指令;3. 在前地址0,m+1中隨機選取一條指令并執行,該指令的地址為m;4. 順序執行一條指令,其地址為m+1;5. 在后地址m+2, 319中隨機選取一條指令并執行;6. 重復上述步驟15,直到執行320次指令。(2) 將指令序列變換成頁地址流,設1. 頁面大小為1K;2. 用戶內存容量為4頁到32頁;3. 用戶虛存容量為32K。在用戶虛存中,按每K存放10條指令排列虛存地址,即320條指令在虛存中存放的方式為:第0條至第9條指令為第0頁(對應虛存地址為0,9);第10條至第19條指令為第1頁(對應虛存地址為10,19);第310條至第319條指令為第31頁(對應虛存地址為310,319);按以上方式,用戶指令可以組成32頁。(3) 計算并輸出下述各種算法在不同內存容量下的命中率。1. 先進先出頁面淘汰算法(FIFO)2. 最近最久未使用頁面淘汰法(LRU)命中率=1 - 頁面失效次數/頁地址流長度在本實驗中,頁地址流長度為320,頁面失效次數為每次訪問相應指令時,該指令對應的頁不在內存的次數。四、關鍵數據結構與函數的說明頁面結構:typedef struct int pn,pfn,counter,time; pl_type; 頁面控制結構:struct pfc_structint pn,pfn; struct pfc_struct *next; ; 初始化函數:void initialize();先進先出置換算法(FIFO)函數:void FIFO( ); 最近最久未使用置換算法(LRU)函數:void LRU( ); 五、編譯與執行過程截圖使用gcc命令對源文件second.c進行編譯,并運行生成的second,編譯結果和執行結果截圖如下:六、實驗結果與分析當頁面數較小時,兩種算法的指令命中率均較低,當頁面數逐漸增大,命中率也會隨之增大。多次運行綜合來看,LRU的命中率要優于FIFO。七、調試時遇到的問題及解決方法(提供BUG截屏)Bug截屏:原因分析:初始化時,未置頁面控制結構中的頁號、頁面為空,未置頁面控制結構中的訪問次數為0、時間為-1。八、調試后的程序源代碼#include #include #include #define TRUE 1 #define FALSE 0 #define INVALID -1 /#define NULL 0 #define total_instruction 320 /*指令流長*/ #define total_vp 32 /*虛頁長*/ #define clear_period 50 /*清零周期*/ typedef struct /*頁面結構*/ int pn,pfn,counter,time; pl_type; pl_type pltotal_vp; /*頁面結構數組*/ struct pfc_struct /*頁面控制結構*/ int pn,pfn; struct pfc_struct *next; ; struct pfc_struct pfctotal_vp,*freepf_head, *busypf_head, *busypf_tail; int diseffect, atotal_instruction;int pagetotal_instruction, offsettotal_instruction; void initialize();void FIFO( ); void LRU( ); int main() int S,i;srand(10*getpid(); /*由于每次運行時進程號不同,故可用來作為初始化隨機數隊列的“種子”*/S=(int)(319.0*rand()/RAND_MAX)+1; for(i=0;itotal_instruction;i+=4) /*產生指令隊列*/ ai=S; /*任選一指令訪問點*/ ai+1=ai+1; /*順序執行下一條指令*/ai+2=(int)(1.0*ai*rand()/RAND_MAX); /*執行前地址指令m*/ ai+3=ai+2+1; /*執行后地址指令*/S=(int)(1.0*rand()*(318-ai+2)/RAND_MAX)+ai+2+2;for(i=0;itotal_instruction;i+) /*將指令序列變換成頁地址流*/pagei=ai/10;offseti=ai%10; for(i=4;i=32;i+) /*用戶內存工作區從個頁面到個頁面*/ printf(%2d page framest,i);FIFO(i);LRU(i); return 0;void initialize(int total_pf) /*初始化相關數據結構*/int i;diseffect=0;/for(i=0;itotal_vp;i+) pli.pn=i; pli.pfn=INVALID; /*置頁面控制結構中的頁號、頁面為空*/ pli.counter=0; pli.time=-1; /*置頁面控制結構中的訪問次數為0、時間為-1*/ for(i=1;itotal_pf;i+)pfci-1.next=&pfci; pfci-1.pfn=i-1; /*建立pfci-1和pfci之間的鏈接*/ pfctotal_pf-1.next=NULL;pfctotal_pf-1.pfn=total_pf-1;freepf_head=&pfc0; /*空頁面隊列的頭指針為pfc0*/void FIFO(int total_pf) int i; struct pfc_struct *p; initialize(total_pf); /*初始化相關頁面控制用數據結構*/ busypf_head=busypf_tail=NULL; /*忙頁面隊列,隊列尾鏈接*/ for(i=0;inext;plbusypf_head-pn.pfn=INVALID;freepf_head=busypf_head; /*釋放忙頁面隊列中的第一個頁面*/ freepf_head-next=NULL;busypf_head=p;p=freepf_head-next; /*按FIFO方式調新頁面入內存頁面*/ freepf_head-next=NULL;freepf_head-pn=page

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論