操作系統試驗答案教程文件_第1頁
操作系統試驗答案教程文件_第2頁
操作系統試驗答案教程文件_第3頁
操作系統試驗答案教程文件_第4頁
操作系統試驗答案教程文件_第5頁
已閱讀5頁,還剩53頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、操作系統實驗答案精品文檔部分實驗答案第三部分 操作系統實驗指導實驗 3 指導 實驗內容 1進程的創建 任務編寫一段程序,使用系統調用 fork( ) 創建兩個子進程。當此程序運行時,在系統中有 一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符;父進程顯示字符 “a”,子進程分別顯示字符 “b”和 “c” 。試觀察記錄屏幕上的顯示結果,并分析原因。 程序#includemain()int p1,p2;if(p1=fork() /* 子進程創建成功 */putchar(b);elseif(p2=fork() /* 子進程創建成功 */putchar(c);else putchar(a)

2、;/*父進程執行 */bca(有時會出現 abc 的任意的排列 ) 分析:從進程執行并發來看,輸出 abc 的排列都是有可能的。收集于網絡,如有侵權請聯系管理員刪除精品文檔原因: fork() 創建進程所需的時間雖然可能多于輸出一個字符的時間,但各個進程的時間片 的獲得卻不是一定是順序的,所以輸出 abc 的排列都是有可能的。2進程的控制任務修改已編寫好的程序,將每個程序的輸出由單個字符改為一句話,再觀察程序執行時屏幕 上出現的現象,并分析其原因。如果在程序中使用系統調用 lockf() 來給每個程序加鎖,可 以實現進程之間的互斥,觀察并分析出現的現象。程序 1#includemain()in

3、t p1,p2,i;if(p1=fork() for(i=0;i500;i+) printf(parent%dn,i);wait(0); /* 保證在子進程終止前,父進程不會終止 */exit(0);elseif(p2=fork() for(i=0;i500;i+) printf(son %dn,i);wait(0); /* 保證在子進程終止前,父進程不會終止 */exit(0); /* 向父進程信號 0 且該進程推出 */else for(i=0;i500;i+) printf( gr“andchild %dn,i); exit(0);收集于網絡,如有侵權請聯系管理員刪除精品文檔運行結果pa

4、rent.songrandchildgrandchild或 grandchildsongrandchildsonparent分析:由于函數 printf() 輸出的字符串之間不會被中斷,因此 , 每個字符串內部的字 符順序輸出時不變。但是 , 由于進程并發執行時的調度順序和父子進程的搶占處理機問 題,輸出字符串的順序和先后隨著執行的不同而發生變化。這與打印單字符的結果相同。程序 2#includemain()int p1,p2,i;if(p1=fork()lockf(1,1,0);for(i=0;i500;i+)printf(parent %dn,i);lockf(1,0,0);wait(0)

5、; /* 保證在子進程終止前,父進程不會終止 */exit(0);elseif(p2=fork()lockf(1,1,0);for(i=0;i500;i+)printf(son %dn,i);收集于網絡,如有侵權請聯系管理員刪除精品文檔lockf(1,0,0);wait(0); /* 保證在子進程終止前,父進程不會終止 */ exit(0);elselockf(1,1,0);for(i=0;i500;i+)printf(daughter %dn,i);lockf(1,0,0);exit(0);運行結果輸出 parent 塊 ,son 塊,grandchild 塊的順序可能不同,但是每個塊的輸出

6、過程不會被 打斷。分析:因為上述程序執行時, lockf(1,1,0)鎖定標準輸出設備, lockf(1,0,0) 解鎖標準輸出 設備,在 lockf(1,1,0) 與 lockf(1,0,0) 中間的 for 循環輸出不會被中斷,加鎖與不加鎖效果不相 同。3軟中斷通信任務 1編制一段程序,使用系統調用 fork() 創建兩個子進程,再用系統調用 signal() 讓父進 程捕捉鍵盤上來的中斷信號(即按 ctrl+c 鍵),當捕捉到中斷信號后,父進程用系統調用 kill() 向兩個子進程發出信號,子進程捕捉到信號后,分別輸出下列信息后終止: child process1 is killed b

7、y parent!child process2 is killed by parent! 父進程等待兩個子進程終止后,輸出以下信息后終止: parent process is killed!收集于網絡,如有侵權請聯系管理員刪除精品文檔程序#include#include#include收集于網絡,如有侵權請聯系管理員刪除精品文檔void waiting(),stop(),alarming();int wait_mark;main()int p1,p2;if(p1=fork() /* 創建子進程 p1*/if(p2=fork()/* 創建子進程 p2*/wait_mark=1;signal(SI

8、GINT,stop); /* 接收到 c 信號,轉 stop*/ signal(SIGALRM,alarming);/* 接受 SIGALRM waiting();kill(p1,16); /* 向 p1 發軟中斷信號 16*/kill(p2,17); /* 向 p2 發軟中斷信號 17*/wait(0);/*同步 */wait(0); printf(parent process is killed!n); exit(0);else wait_mark=1; signal(17,stop);signal(SIGINT,SIG_IGN); /* 忽略 c 信號 */ while (wait_ma

9、rk!=0);lockf(1,1,0); printf(child process2 is killed by parent!n); lockf(1,0,0);exit(0);else收集于網絡,如有侵權請聯系管理員刪除精品文檔wait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN); /* 忽略c 信號*/while (wait_mark!=0) lockf(1,1,0);printf(child process1 is killed by parent!n);lockf(1,0,0);exit(0);void waiting()sleep(5);

10、if (wait_mark!=0)kill(getpid(),SIGALRM);void alarming() wait_mark=0;void stop() wait_mark=0;不做任何操作等待五秒鐘父進程回在子進程縣推出后退出,并打印退出的順序;或者點擊 ctrl+C 后程序退出并打印退出的順序。任務 2在上面的任務 1 中,增加語句 signal(SIGINT,SIG_IGN) 和語句signal(SIGQUIT,SIG_IGN) ,觀察執行結果,并分析原因。這里, signal(SIGINT,SIG_IGN)和 signal(SIGQUIT,SIG_IGN) 分別為忽略鍵信號以及忽

11、略中斷信號。收集于網絡,如有侵權請聯系管理員刪除精品文檔程序 #include#include#includeint pid1,pid2;int EndFlag=0;int pf1=0;int pf2=0;void IntDelete()kill(pid1,16);kill(pid2,17);void Int1()printf(child process 1 is killed !by parentn); exit(0);void Int2()printf(child process 2 is killed !by parentn); exit(0);main()int exitpid;if(

12、pid1=fork()if(pid2=fork()signal(SIGINT,IntDelete);waitpid(-1,&exitpid,0);waitpid(-1,&exitpid,0);printf(parent process is killedn); exit(0);elsesignal(SIGINT,SIG_IGN);signal(17,Int2);收集于網絡,如有侵權請聯系管理員刪除精品文檔pause();else signal(SIGINT,SIG_IGN); signal(16,Int1); pause();運行結果請讀者將上述程序輸入計算機后,執行并觀察。3進程的管道通信任

13、務編制一段程序,實現進程的管道通信。使用系統調用 pipe() 建立一條管道線。兩個子進程 p1和 p2分別向通道個寫一句話:child1 process is sending message!child2 process is sending message!而父進程則從管道中讀出來自兩個進程的信息,顯示在屏幕上。程序#include #include #include int pid1,pid2;main( )int fd2;char outpipe100,inpipe100;pipe(fd);/*創建一個管道 */while (pid1=fork( )=-1);if(pid1=0) lo

14、ckf(fd1,1,0);sprintf(outpipe,child 1 process is sending message!);收集于網絡,如有侵權請聯系管理員刪除精品文檔/* 把串放入數組 outpipe 中*/write(fd1,outpipe,50); /* 向管道寫長為 50字節的串 */sleep(5);/*自我阻塞 5 秒 */lockf(fd1,0,0);exit(0);elsewhile(pid2=fork( )=-1);if(pid2=0)lockf(fd1,1,0); /* 互斥 */sprintf(outpipe,child 2 process is sending

15、message!); write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);/*同步 */read(fd0,inpipe,50); /*從管道中讀長為 50字節的串 */ printf(%sn,inpipe);wait(0);read(fd0,inpipe,50);printf(%sn,inpipe);exit(0);運行結果延遲 5秒后顯示 :child1 process is sending message!再延遲 5 秒:child2 process is sending message!分析收集于網絡,如有侵

16、權請聯系管理員刪除精品文檔請讀者自行完成1、程序中的 sleep(5)起什么作用?2、子進程 1 和 2 為什么也能對管道進行操作?實驗 4 指導 實驗內容 1 消息的創建,發送和接收任務使用系統調用 msgget( ), megsnd( ), msgrev( )及 msgctl() 編制一長度為 1K 的消息發送和接收的程序 。程序設計(1) 為了便于操作和觀察結果,用一個 程序為“引子”,先后 fork( ) 兩個子進程, SERVER和 CLIENT,進行通信。(2) SERVER端建立一個 Key為 75 的消息隊列,等待其他進程發來的消息。當遇到類型為1 的消息,則作為結束信號,取消

17、該隊列,并退出 SERVER。 SERVER每接收到一個消 息后顯示一句“(server)received ” 。(3) CLIENT端使用 Key為 75的消息隊列,先后發送類型從 10到 1的消息,然后退出。 最后的一個消息,既是 SERVER端需要的結束信號。 CLIENT每發送一條消息后顯示一 句“(client)sent ” 。(4) 父進程在 SERVER和 CLIENT 均退出后結束。程序#include #include #include #include 收集于網絡,如有侵權請聯系管理員刪除精品文檔#define MSGKEY 75/* 定義關鍵詞 MEGKEY*/struc

18、t msgform/*消息結構 */long mtype;char mtexe100;/*文本長度 */msg;int msgqid,i;void CLIENT( )int i; msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i=1;i-)msg.mtype=i; printf(client)sentn);msgsnd(msgqid,&msg,1030,0);/*發送消息 msg入 msgid消息隊列 */exit(0);void SERVER( )msgqid=msgget(MSGKEY,0777|IPC_CREAT); /* 由關鍵字獲得消息隊

19、列 */ domsgrcv(msgqid,&msg,1030,0,0); /*從隊列 msgid 接受消息 msg*/ printf(server)receiven);while(msg.mtype!=1); /* 消息類型為 1 時,釋放隊列 */ msgctl(msgqid, IPC_RMID,0);main()if(fork()SERVER();wait(0);收集于網絡,如有侵權請聯系管理員刪除精品文檔else CLIENT( );結果從理想的結果來說,應當是每當 Client 發送一個消息后, server 接收該消息, Client 再發送下一條。也就是說 “(Client)sen

20、t ” 和“(server)received ” 的字樣應該在屏幕上交 替出現。實際的結果大多是,先由 Client 發送兩條消息,然后 Server 接收一條消息。此 后 ClientServer 交替發送和接收消息 . 最后一次接收兩條消息 . Client 和 Server 分別發送和接 收了 10條消息, 與預期設想一致 分析 message的傳送和控制并不保證完全同步 , 當一個程序不再激活狀態的時候 , 它完全可能 繼續睡眠 , 造成上面現象 , 在多次 send message 后才 receive message. 這一點有助于理解 消息轉送的實現機理 .2. 共享存儲區的創建

21、 , 附接和斷接任務使用系統調用 shmget(),sgmat(),smgdt(),shmctl() 編制一個與上述功能相同的程序 . 程序設計 (1) 為了便于操作 和觀察結果,用一個 程序為“引子”,先后 fork( ) 兩個子進程, SERVER和 CLIENT,進行通信。(2) SERVER端建立一個 KEY為75的共享區,并將第一個字節置為 -1.作為數據空的標志 .等 待其他進程發來的消息 .當該字節的值發生變化時 , 表示收到了該消息 ,進行處理 . 然后再次把收集于網絡,如有侵權請聯系管理員刪除精品文檔它 的值設為 -1. 如果遇到的值為 0, 則視為結束信號 , 取消該隊列

22、, 并退出 SERVER.SERVER 每接 收到一次數據后顯示 ”(server)received ”.(3) CLIENT 端建立一個為 75的共享區,當共享取得第一個字節為 -1 時, Server 端空閑,可 發送 請求. CLIENT 隨即填入 9到0.期間等待 Server 端再次空閑 .進行完這些操作后 , CLIENT 退出. CLIENT 每發送一次數據后顯示 ”(client)sent ”.(4) 父進程在 SERVER和 CLIENT均退出后結束 .#include#include#include#define SHMKEY 75 /* 定義共享區關鍵詞 */int sh

23、mid,i;int *addr;CLIENT()int i;shmid=shmget(SHMKEY,1024, 0777|IPC_CREAT); /* 獲取共享區,長度 1024,關鍵/*共享區起始地址為 addr*/* 打印( client)sent*/* 把 i 賦給 addr*/詞 SHMKEY*/addr=shmat(shmid,0,0);for(i=9;i=0;i-)while(*addr!= -1);printf(client)sentn);*addr=i; exit(0);SERVER()do收集于網絡,如有侵權請聯系管理員刪除精品文檔while(*addr = =-1);pri

24、ntf(server)receivedn%d,*addr); /* 服務進程使用共享區 */ if(*addr!=0)*addr=-1; while(*addr);wait(0);shmctl(shmid,IPC_RMID,0);main() shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*創建共享區 */ addr=shmat(shmid,0,0);/*共享區起始地址為 addr*/*addr=-1;if(fork()SERVER();elseCLIENT();結果運行的結果和預想的完全一樣。但在運行的過程中,發現每當 client 發送一次數據 后,

25、 server 要等大約 0.1 秒才有響應。同樣,之后 client 又需要等待大約 0.1 秒才發送下 一個數據。分析出現上述的應答延遲的現象是程序設計的問題。當 client 端發送了數據后,并沒有任 何措施通知 server 端數據已經發出,需要由 client 的查詢才能感知。此時, client 端并 沒有放棄系統的控制權,仍然占用 CPU的時間片。只有當系統進行調度時,切換到了收集于網絡,如有侵權請聯系管理員刪除精品文檔server 進程,再進行應答。這個問題,也同樣存在于 server 端到 client 的應答過程之 中。3 比較兩種消息通信機制中的數據傳輸的時間 由于兩種機

26、制實現的機理和用處都不一樣,難以直接進行時間上的比較。如果比較 其性能,應更加全面的分析。(1) 消息隊列的建立比共享區的設立消耗的資源少 . 前者只是一個軟件上設定的問題 , 后者 需要對硬件操作 ,實現內存的映像 , 當然控制起來比前者復雜 . 如果每次都重新進行隊 列或共享的建立 , 共享區的設立沒有什么優勢。(2) 當消息隊列和共享區建立好后 , 共享區的數據傳輸 ,受到了系統硬件的支持 , 不耗費多 余的資源;而消息傳遞 ,由軟件進行控制和實現 ,需要消耗一定的 CPU資源.從這個意義 上講, 共享區更適合頻繁和大量的數據傳輸 .(3) 消息的傳遞 , 自身就帶有同步的控制 .當等到

27、消息的時候 ,進程進入睡眠狀態 , 不再消耗 CPU資源. 而共享隊列如果不借助其他機制進行同步 ,接受數據的一方必須進行不斷的 查詢, 白白浪費了大量的 CPU資源.可見消息方式的使用更加靈活 .實驗 5 指導 實驗內容 任務設計一個虛擬存儲區和內存工作區 , 并使用下列算法計算訪問命中率(1) 進先出的算法( FIFO)(2) 最近最少使用的算法( LRU)3) 最佳淘汰算法 (OPT)收集于網絡,如有侵權請聯系管理員刪除精品文檔4) 最少訪問頁面算法 (LFU)(5) 最近最不經常使用算法 (NUR)命中率 =(1- 頁面失效次數 )/ 頁地址流長度程序設計本實驗的程序設計基本上按照實驗

28、內容進行。即首先用 srand() 和 rand() 函數定義和 產生指令序列,然后將指令序列變換成相應的頁地址流,并針對不同的算法計算出相應的命 中率。相關定義如下:1 數據結構(1) 頁面類型typedef structint pn,pfn,counter,time;pl-type;其中 pn 為頁號,pfn 為面號, counter 為一個周期內訪問該頁面的次數 , time 為訪問時間 .(2) 頁面控制結構pfc-structint pn,pfn;struct pfc_struct *next;typedef struct pfc_struct pfc_type;pfc_type p

29、fc_structtotal_vp,*freepf_head,*busypf_head;pfc_type *busypf_tail;其中 pfctotal_vp 定義用戶進程虛頁控制結構 ,*freepf_head 為空頁面頭的指針 ,*busypf_head 為忙頁面頭的指針 ,*busypf_tail 為忙頁面尾的指針 .2函數定義(1)Void initialize( ):初始化函數 , 給每個相關的頁面賦值 .(2)Void FIFO( ): 計算使用 FIFO 算法時的命中率 .收集于網絡,如有侵權請聯系管理員刪除精品文檔(3)Void LRU( ):計算使用 LRU算法時的命中率

30、.(4)Void OPT( ):計算使用 OPT算法時的命中率 .(5)Void LFU( ):計算使用 LFU算法時的命中率 .(6) Void NUR( ): 計算使用 NUR算法時的命中率 .3. 變量定義(1)int atotal_instruction:指令流數據組 .(2)int pagetotal_instruction:每條指令所屬的頁號 .(3) int offsettotal_instruction:每頁裝入 10 條指令后取模運算頁號偏移值(4)int total_pf:用戶進程的內存頁面數 .(5)int disaffect:頁面失效次數 .4. 程序參考源碼及結果程序

31、#define TRUE 1#define FALSE 0#define INVALID -1#define NULL 0#define total_instruction 320 /* 指令流長 */#define total_vp 32 /*虛頁長 */#define clear_period 50 /*清 0 周期 */typedef structint pn; /int pfn; /int counter; /* 頁面結構 */頁號 logic number頁面框架號 physical frame number計數器收集于網絡,如有侵權請聯系管理員刪除精品文檔int time; /時間

32、pl_type;pl_type pltotal_vp; /*頁面線性結構 - 指令序列需要使用地址*/typedef struct pfc_struct/*int pn;int pfn;struct pfc_struct *next;pfc_type;頁面控制結構,調度算法的控制結構 */pfc_type pfctotal_vp, *freepf_head, *busypf_head, *busypf_tail;int diseffect, atotal_instruction; /* a為指令序列 */int pagetotal_instruction, offsettotal_instru

33、ction;/*地址信息 */int initialize(int);int FIFO(int);int LRU(int);int LFU(int);int NUR(int); /not use recentlyint OPT(int);int main( )int s,i,j;srand(10*getpid(); /*來作為初始化隨機數隊列的“種子”*/由于每次運行時進程號不同,故可用s=(float)319*rand( )/32767/32767/2+1; /*正態分布 */for(i=0;itotal_instruction;i+=4) /*產生指令隊列 */收集于網絡,如有侵權請聯系管

34、理員刪除精品文檔if(s319)printf(When i=%d,Error,s=%dn,i,s); exit(0);ai=s; /*ai+1=ai+1; /*ai+2=(float)ai*rand( )/32767/32767/2; /*ai+3=ai+2+1;/*任選一指令訪問點 m*/ 順序執行一條指令 */ 執行前地址指令 m*/ 順序執行一條指令 */s=(float)(318-ai+2)*rand( )/32767/32767/2+ai+2+2; if(ai+2318)|(s319)printf(a%d+2,a number which is :%d and s=%dn,i,ai+

35、2,s);for (i=0;itotal_instruction;i+) /*pagei=ai/10; offseti=ai%10;將指令序列變換成頁地址流 */for(i=4;i=32;i+) /* 用戶內存工作區從 4 個頁面到 32 個頁面 */ printf(-%2d page frames-n,i);FIFO(i);LRU(i);LFU(i);NUR(i);OPT(i);return 0;/* 初始化相關數據結構 total_pf 表示內存的塊數 */int initialize(int total_pf) 收集于網絡,如有侵權請聯系管理員刪除精品文檔空頁面隊列的頭指針為 pfc0*

36、/先進先出算法 total_pf: 用戶進程的內存頁面數/* 中間變量 */初始化相關頁面控制用數據結構 */忙頁面隊列頭,隊列尾鏈接 */*頁面失效 */* 失效次數 */int i;diseffect=0; for(i=0;itotal_vp;i+)pli.pfn=INVALID; /*pli.counter=0; /*pli.time=-1; /*for(i=0;itotal_pf-1;i+)pfci.next=&pfci+1; pfci.pfn=i;pfctotal_pf-1.next=NULL; pfctotal_pf-1.pfn=total_pf-1;freepf_head=&pf

37、c0; /* return 0;int FIFO(int total_pf) /*/int i,j;pfc_type *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;freepf_head-pn=pagei;plp

38、agei.pfn=freepf_head-pfn;freepf_head-next=NULL; /* 使 busy 的尾為 null*/ if(busypf_tail=NULL)busypf_tail=busypf_head=freepf_head;elsebusypf_tail-next=freepf_head;busypf_tail=freepf_head;freepf_head=p;printf(FIFO:%6.4fn,1-(float)diseffect/320);return 0;int LRU (int total_pf)/*最近最久未使用算法 least recently use

39、d*/int min,minj,i,j,present_time; /*minj initialize(total_pf);present_time=0; for(i=0;itotal_instruction;i+)if(plpagei.pfn=INVALID)diseffect+;if(freepf_head=NULL)為最小值下標 */* 頁面失效 */* 無空閑頁面 */收集于網絡,如有侵權請聯系管理員刪除精品文檔min=32767;/* 設置最大值 */for(j=0;jplj.time&plj.pfn!=INVALID) min=plj.time; minj=j;freepf_hea

40、d=&pfcplminj.pfn; /plminj.pfn=INVALID; plminj.time=0; freepf_head-next=NULL;plpagei.pfn=freepf_head-pfn; /plpagei.time=present_time;freepf_head=freepf_head-next; /elseplpagei.time=present_time; /騰出一個單元有空閑頁面 , 改為有效減少一個 free 頁面命中則增加該單元的訪問present_time+;printf(LRU:%6.4fn,1-(float)diseffect/320);return 0

41、;int NUR(int total_pf ) /*最近未使用算法 Not Used recentlycount 表示 */int i,j,dp,cont_flag,old_dp; pfc_type *t; initialize(total_pf);dp=0;收集于網絡,如有侵權請聯系管理員刪除精品文檔for(i=0;itotal_instruction;i+)頁面失效 */if (plpagei.pfn=INVALID)/*diseffect+;if(freepf_head=NULL)/*cont_flag=TRUE;old_dp=dp;while(cont_flag)無空閑頁面 */if(

42、pldp.counter=0&pldp.pfn!=INVALID)cont_flag=FALSE;elsedp+;if(dp=total_vp)dp=0;if(dp=old_dp) for(j=0;jnext=NULL;plpagei.pfn=freepf_head-pfn;freepf_head-pn=pagei;freepf_head=freepf_head-next; elseplpagei.counter=1; if(i%clear_period=0)for(j=0;jtotal_vp;j+) plj.counter=0; printf(NUR:%6.4fn,1-(float)dise

43、ffect/320);收集于網絡,如有侵權請聯系管理員刪除精品文檔return 0; int OPT(int total_pf) /* 最佳置換算法 */int i,j, max,maxpage,d,disttotal_vp;pfc_type *t;initialize(total_pf);for(i=0;itotal_instruction;i+)if(plpagei.pfn=INVALID) /* 頁面失效 */diseffect+;if(freepf_head=NULL) /* 無空閑頁面 */for(j=0;jtotal_vp;j+)if(plj.pfn!=INVALID)distj=

44、32767;elsedistj=0;for(j=0;jtotal_vp;j+)if(plj.pfn!=INVALID)&(distj=32767)distj=j;max=0;for(j=0;jtotal_vp;j+)if(maxnext=NULL;plmaxpage.pfn=INVALID;plpagei.pfn=freepf_head-pfn; freepf_head=freepf_head-next;收集于網絡,如有侵權請聯系管理員刪除精品文檔 printf(OPT:%6.4fn,1-(float)diseffect/320); return 0;/* 該算法時根據已知的預測未知的, le

45、ast frequency Used 是最不經常使用置換法 */ int LFU(int total_pf)int i,j,min,minpage;pfc_type *t;initialize(total_pf); for(i=0;itotal_instruction;i+) if(plpagei.pfn=INVALID)/*頁面失效 */diseffect+;if(freepf_head=NULL)/*無空閑頁面 */min=32767;/* 獲取 counter的使用用頻率最小的內存 */for(j=0;jplj.counter&plj.pfn!=INVALID) min=plj.coun

46、ter; minpage=j; freepf_head=&pfcplminpage.pfn; plminpage.pfn=INVALID; plminpage.counter=0;freepf_head-next=NULL;plpagei.pfn=freepf_head-pfn; / 有空閑頁面 , 改為有效 plpagei.counter+;freepf_head=freepf_head-next; / 減少一個 free 頁面else plpagei.counter; plpagei.counter=plpagei.counter+1;收集于網絡,如有侵權請聯系管理員刪除精品文檔 prin

47、tf(LFU:%6.4fn,1-(float)diseffect/320);return 0;結果一:4 page framesFIFO:0.2562LRU:0.2531OPT:0.3031LFU:0.2812NUR:0.28125 page framesFIFO:0.2969LRU:0.2906OPT:0.3500LFU:0.3219NUR:0.30946 page framesFIFO:0.3375LRU:0.3281OPT:0.3844LFU:0.3375NUR:0.33447 page framesFIFO:0.3563LRU:0.3563OPT:0.4031LFU:0.3563NUR

48、:0.35008 page framesFIFO:0.3937LRU:0.3750OPT:0.4531LFU:0.3937NUR:0.37199 page framesFIFO:0.4219LRU:0.4094OPT:0.4844LFU:0.4156NUR:0.406210 page framesFIFO:0.4375LRU:0.4313OPT:0.5062LFU:0.4313NUR:0.425011 page framesFIFO:0.4813LRU:0.4625OPT:0.5531LFU:0.4500NUR:0.465612 page framesFIFO:0.5406LRU:0.4875

49、OPT:0.5687LFU:0.4938NUR:0.487513 page framesFIFO:0.5500LRU:0.5188OPT:0.5969LFU:0.5062NUR:0.543714 page framesFIFO:0.5594LRU:0.5531OPT:0.6344LFU:0.5281NUR:0.546915 page framesFIFO:0.5687LRU:0.5844OPT:0.6687LFU:0.5469NUR:0.581316 page framesFIFO:0.5781LRU:0.5938OPT:0.6813LFU:0.5719NUR:0.596917 page framesFIFO:0.5906LRU:0.6156OPT:0.6969LFU:0.6156NUR:0.615618 page framesFIFO:0.6156LRU:0.6312O

溫馨提示

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

評論

0/150

提交評論