生活随笔
收集整理的這篇文章主要介紹了
操作系统课程设计(页面置换算法 C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
操作系統綜合實踐報告
課程號:220011050
設計題目:頁面置換算法
姓 名 劉衍鳴
學 院 信息與電氣工程學院
專 業 計算機科學與技術
年 級 2019級專升本
學 號 20192203172
成績評定:
2019 年 12 月 25 日
一、 課程設計選題
1.選題內容
編程序實現先進先出算法(FIFO)、最近最久未使用算法(LRU)、最佳置換算法(OPT)的具體實現過程,并計算訪問命中率。
2.選題要求
①計主界面以靈活選擇某算法,且以上算法都要實現。
②用隨機數方法產生頁面走向。
③假定初始時頁面都不在內存。
二、 課程設計需求分析
在進程運行過程中,若其所要訪問的頁面不在內存,而需把它們調入內存,但內存已無空閑空間時,為了保證該進程能正常運行,系統必須從內存中調出一頁程序或數據送到磁盤的對換區中。但應將哪個頁面調出,須根據一定的算法來確定。通常,把選擇換出頁面的算法稱為頁面置換算法(Page-Replacement Algorithms)。 置換算法的好壞將直接影響到系統的性能。
三、 概要設計
在程序中定義兩個數組分別存放內存塊的內容和頁面引用序列,讓頁面引用序列進入內存塊,如果內存塊已滿進行頁面置換,實現先進先出算法時,定義一個時間數組,讓先進內存塊對應的數組值最大的用于置換;實現最近最久未使用算法時,定義一個使用數組,讓最近未被使用的內存塊對應數組最大值用于置換;實現最佳置換算法時,分別將內存塊內容與剩余頁面內容序列相同時的最大值的塊用于頁面置換。
四、 模塊的基本算法
CreatePage():初始化頁面序列,在頁面序列數組Page[PNum]中隨機生成PNum個數。
FIFO():先進先出頁面置換算法。
LRU():最近最久未使用算法。
OPT():最佳置換算法。
五、 系統實現
流程圖
2.代碼
#include <stdio.h>
#include <stdlib.h>
#define PNum 12
#define BNum 3
int Page
[PNum
]={0};
typedef struct{int block
;int time
;
}BLock
;
typedef struct LNode
{BLock B
[3];
}Mem
;
Mem M
;
void CreatePage(){printf("頁面走向:\n");for(int i
=0;i
<PNum
;i
++){Page
[i
]=rand()%9+1;printf("%d ",Page
[i
]);} printf("\n");
}
int max(int a
,int b
,int c
){int x
,z
;if(a
>=b
)x
=a
;else x
=b
;if(x
>=c
)z
=x
;elsez
=c
;return z
;
}
void InitM(){for(int q
=0;q
<PNum
;q
++){M
.B
[q
].block
=0;}for(int q
=0;q
<PNum
;q
++){M
.B
[q
].time
=0;}
}
void FIFO(){ printf("具體實現過程:\n");InitM();int i
=0,j
=0;int a
=-1,b
=-1;int Max
=-1;int MaxT
=0;int count
=0;for(i
=0;i
<PNum
;i
++){for(j
=0;j
<BNum
;j
++)if(M
.B
[j
].block
==0){a
=j
; break; }for(j
=0;j
<BNum
;j
++){if(M
.B
[j
].block
==Page
[i
])b
=j
; }for(j
=0;j
<BNum
;j
++){if(M
.B
[j
].time
>MaxT
){MaxT
=M
.B
[j
].time
;Max
=j
; } }if(b
==-1){ if(a
!=-1){ M
.B
[a
].block
=Page
[i
];M
.B
[a
].time
=0;for(j
=0;j
<=a
;j
++)M
.B
[j
].time
++ ; a
=-1; }else{ M
.B
[Max
].block
=Page
[i
];M
.B
[Max
].time
=0;for(j
=0;j
<BNum
;j
++)M
.B
[j
].time
++;Max
=-1;MaxT
=0;count
++; } }else{ M
.B
[b
].block
=Page
[i
];for(j
=0;j
<BNum
;j
++){M
.B
[j
].time
++;}b
=-1; }for(j
=0;j
<BNum
;j
++){printf("%d ",M
.B
[j
].block
);}printf("\n"); }float rate
;float n
=PNum
-count
;rate
=(n
/PNum
)*100;printf("命中率為%.2lf%%\n",rate
);
}
void LRU(){ printf("具體實現過程:\n");InitM();int i
=0,j
=0;int a
=-1,b
=-1;int Max
=-1;int MaxU
=0;int count
=0;for(i
=0;i
<PNum
;i
++){for(j
=0;j
<BNum
;j
++)if(M
.B
[j
].block
==0){a
=j
; break; }for(j
=0;j
<BNum
;j
++){if(M
.B
[j
].block
==Page
[i
])b
=j
; }for(j
=0;j
<BNum
;j
++){if(M
.B
[j
].time
>MaxU
){MaxU
=M
.B
[j
].time
;Max
=j
; } }if(b
==-1){ if(a
!=-1){ M
.B
[a
].block
=Page
[i
];M
.B
[a
].time
=0;for(j
=0;j
<=a
;j
++)M
.B
[j
].time
++;a
=-1;}else{M
.B
[Max
].block
=Page
[i
];M
.B
[Max
].time
=0;for(j
=0;j
<BNum
;j
++)M
.B
[j
].time
++;Max
=-1;MaxU
=0;count
++; }}else{M
.B
[b
].block
=Page
[i
];M
.B
[b
].time
=0; if(a
!=-1){M
.B
[a
].time
=0; }for(j
=0;j
<BNum
;j
++){M
.B
[j
].time
++;}Max
=-1;MaxU
=0;b
=-1;} for(j
=0;j
<BNum
;j
++){printf("%d ",M
.B
[j
].block
);}printf("\n"); }float rate
;float n
=PNum
-count
;rate
=(n
/PNum
)*100;printf("命中率為%.2lf%%\n",rate
);
}
void OPT(){ printf("具體實現過程:\n");for(int q
=0;q
<PNum
;q
++){M
.B
[q
].block
=0;} int i
=0,j
=0;int a
=-1,b
=-1;int Max
=-1;int count
=0;for(i
=0;i
<PNum
;i
++){for(j
=0;j
<BNum
;j
++)if(M
.B
[j
].block
==0){a
=j
; break; }for(j
=0;j
<BNum
;j
++){if(M
.B
[j
].block
==Page
[i
])b
=j
; }if(b
==-1){if(a
!=-1){ M
.B
[a
].block
=Page
[i
];a
=-1;}else{ int c
,d
,e
; int x
,y
,m
;for(c
=i
+1;c
<=PNum
-1;c
++){if(Page
[c
]==M
.B
[0].block
){x
=c
;break;}else{x
=PNum
;} }for(d
=i
+1;d
<=PNum
-1;d
++){if(Page
[d
]==M
.B
[1].block
){y
=d
;break;}else{y
=PNum
;}}for(e
=i
+1;e
<=PNum
-1;e
++){if(Page
[e
]==M
.B
[2].block
){m
=e
;break;}else{m
=PNum
;}}int z
=max(x
,y
,m
);if(z
==x
)Max
=0;if(z
==y
)Max
=1;if(z
==m
)Max
=2;M
.B
[Max
].block
=Page
[i
];Max
=-1; b
=-1; count
++; } } else{M
.B
[b
].block
=Page
[i
];}for(j
=0;j
<BNum
;j
++){printf("%d ",M
.B
[j
].block
);}printf("\n");}float rate
;float n
=PNum
-count
;rate
=(n
/PNum
)*100;printf("命中率為%.2lf%%\n",rate
);
}
void Printf(){printf("***********頁面置換算法******************\n");printf("***** 1-先進先出頁面置換算法*************\n");printf("***** 2-最近最久未使用頁面置換算法*******\n");printf("***** 3-最佳置換算法*********************\n");printf("***** 0-退出*****************************\n");printf("*****************************************\n");
}
int main(){int n
;while(1){Printf();printf("請選擇您要進行的操作:\n");scanf("%d",&n
);CreatePage();switch(n
){case 1:FIFO();break;case 2:LRU();break;case 3:OPT();break;case 0:exit(0);break; }}return 0;
}
六、 系統測試
七、 總結
本次我的操作系統課程設計設計歷時將近3天才得以完成,期間對作品進行了構想、思考、制作、完善,經歷了這次實訓讓對知識點進行了系統化的學習,也讓自己認識到了自己的不足。本次實訓后,也讓我深深地明白程序從系統設計的具體步驟,和一個系統應該具有哪些要素。相信在下一次的設計中我可以做的更好。
八、 參考文獻
[1]湯小丹、梁紅兵、哲鳳屏、湯子瀛.計算機操作系統.西安電子科技大學出版社,2019.4
總結
以上是生活随笔為你收集整理的操作系统课程设计(页面置换算法 C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。