1 #include <stdio.h>
2 #include <stdlib.h>
3
4 /*全局变量*/
5 int mSIZE;
/*物理块数*/
6 int pSIZE;
/*页面号引用串个数*/
7 static int memery[
10]={
0};
/*物理块中的页号*/
8 static int page[
100]={
0};
/*页面号引用串*/
9 static int temp[
100][
10]={
0};
/*辅助数组*/
10
11 /*置换算法函数*/
12 void FIFO();
13 void LRU();
14 void OPT();
15
16 /*辅助函数*/
17 void print(unsigned
int t);
18 void designBy();
19 void download();
20 void mDelay(unsigned
int Delay);
21
22 /*主函数*/
23 int main()
24 {
25 int i,k,code;
26 // system("color 0E");
27 designBy();
28 printf(
"按任意键开启功能");
29 // printf(" >>>");
30 getchar();
31 system(
"cls");
32 // system("color 0E");
33
34
35 printf(
"请输入引用串的个数(M<=10):");
36 scanf(
"%d",&
pSIZE);
37 printf(
"请输入物理块的个数(M<=10):");
38 scanf(
"%d",&
mSIZE);
39 puts(
"请依次输入页面号引用串(连续输入,无需隔开):");
40 for(i=
0;i<pSIZE;i++
)
41 scanf(
"",&
page[i]);
42 download();
43 system(
"cls");
44 // system("color 0E");
45 do{
46 puts(
"输入的页面号引用串为:");
47 for(k=
0;k<=(pSIZE-
1)/
20;k++
)
48 {
49 for(i=
20*k;(i<pSIZE)&&(i<
20*(k+
1));i++
)
50 {
51 if(((i+
1)%
20==
0)||(((i+
1)%
20)&&(i==pSIZE-
1)))
52 printf(
"%d\n",page[i]);
53 else
54 printf(
"%d ",page[i]);
55 }
56 }
57 printf(
"* * * * * * * * * * * * * * * * * * * * * * *\n");
58 printf(
"* 请选择页面置换算法:\t\t\t *\n");
59 printf(
"* ----------------------------------------- *\n");
60 printf(
"* 1.先进先出(FIFO) 2.最近最久未使用(LRU) *\n");
61 printf(
"* 3.最佳(OPT) 4.退出 *\n");
62 printf(
"* * * * * * * * * * * * * * * * * * * * * * *\n");
63 printf(
"请选择操作:[ ]\b\b");
64 scanf(
"%d",&
code);
65 switch(code)
66 {
67 case 1:
68 FIFO();
69 break;
70 case 2:
71 LRU();
72 break;
73 case 3:
74 OPT();
75 break;
76 case 4:
77 system(
"cls");
78 // system("color 0C");
79 designBy();
/*显示设计者信息后退出*/
80 printf(
"谢谢使用页面置换算法演示器! \n");
81 exit(
0);
82 default:
83 printf(
"输入错误,请重新输入:");
84 }
85 printf(
"按任意键重新选择置换算法:>>>");
86 getchar();
87 system(
"cls");
88 }
while (code!=
4);
89 getchar();
90 }
91
92 /*载入数据*/
93 void download()
94 {
95 int i;
96 system(
"color 0B");
97 printf(
"正在载入数据,请稍候 !!!\n");
98 printf(
"Loading...\n");
99 printf(
" O");
100 for(i=
0;i<
51;i++
)
101 printf(
"\b");
102 for(i=
0;i<
50;i++
)
103 {
104 mDelay((pSIZE+mSIZE)/
2);
105 printf(
">");
106 }
107 printf(
"\nFinish.\n载入成功,按任意键进入置换算法选择界面:>>>");
108 getchar();
109 }
110
111 /*设置延迟*/
112 void mDelay(unsigned
int Delay)
113 {
114 unsigned
int i;
115 for(;Delay>
0;Delay--
)
116 {
117 for(i=
0;i<
124;i++
)
118 {
119 printf(
" \b");
120 }
121 }
122 }
123
124 /*显示设计者信息*/
125 void designBy()
126 {
127
128 printf(
" 课题:页面置换算法的模拟实现 \n");
129 printf(
" 学号:1610704202 \n");
130 printf(
" 姓名:xxx \n");
131 }
132
133
134 void print(unsigned
int t)
135 {
136 int i,j,k,l;
137 int flag;
138 for(k=
0;k<=(pSIZE-
1)/
20;k++
)
139 {
140 for(i=
20*k;(i<pSIZE)&&(i<
20*(k+
1));i++
)
141 {
142 if(((i+
1)%
20==
0)||(((i+
1)%
20)&&(i==pSIZE-
1)))
143 printf(
"%d\n",page[i]);
144 else
145 printf(
"%d ",page[i]);
146 }
147 for(j=
0;j<mSIZE;j++
)
148 {
149 for(i=
20*k;(i<mSIZE+
20*k)&&(i<pSIZE);i++
)
150 {
151 if(i>=
j)
152 printf(
" |%d|",temp[i][j]);
153 else
154 printf(
" | |");
155 }
156 for(i=mSIZE+
20*k;(i<pSIZE)&&(i<
20*(k+
1));i++
)
157 {
158 for(flag=
0,l=
0;l<mSIZE;l++
)
159 if(temp[i][l]==temp[i-
1][l])
160 flag++
;
161 if(flag==mSIZE)
/*页面在物理块中*/
162 printf(
" ");
163 else
164 printf(
" |%d|",temp[i][j]);
165 }
/*每行显示20个*/
166 if(i%
20==
0)
167 continue;
168 printf(
"\n");
169 }
170 }
171
172 printf(
"----------------------------------------\n");
173 printf(
"缺页次数:%d\t\t",t+
mSIZE);
174 printf(
"缺页率:%d/%d\n",t+
mSIZE,pSIZE);
175 printf(
"置换次数:%d\t\t",t);
176 printf(
"访问命中率:%d%%\n",(pSIZE-(t+mSIZE))*
100/
pSIZE);
177 printf(
"----------------------------------------\n");
178 }
179
180 /*计算过程延迟*/
181 void compute()
182 {
183 int i;
184 printf(
"正在进行相关计算,请稍候");
185 for(i=
1;i<
20;i++
)
186 {
187 mDelay(
15);
188 if(i%
4==
0)
189 printf(
"\b\b\b\b\b\b \b\b\b\b\b\b");
190 else
191 printf(
"Θ");
192 }
193 for(i=
0;i++<
30;printf(
"\b"));
194 for(i=
0;i++<
30;printf(
" "));
195 for(i=
0;i++<
30;printf(
"\b"));
196 }
197 /*先进先出页面置换算法*/
198 void FIFO()
199 {
200 int memery[
10]={
0};
201 int time[
10]={
0};
/*记录进入物理块的时间*/
202 int i,j,k,m;
203 int max=
0;
/*记录换出页*/
204 int count=
0;
/*记录置换次数*/
205 /*前mSIZE个数直接放入*/
206 for(i=
0;i<mSIZE;i++
)
207 {
208 memery[i]=
page[i];
209 time[i]=
i;
210 for(j=
0;j<mSIZE;j++
)
211 temp[i][j]=
memery[j];
212 }
213 for(i=mSIZE;i<pSIZE;i++
)
214 {
215 /*判断新页面号是否在物理块中*/
216 for(j=
0,k=
0;j<mSIZE;j++
)
217 {
218 if(memery[j]!=
page[i])
219 k++
;
220 }
221 if(k==mSIZE)
/*如果不在物理块中*/
222 {
223 count++;
/*计算换出页*/
224 max=time[
0]<time[
1]?
0:
1;
225 for(m=
2;m<mSIZE;m++
)
226 if(time[m]<
time[max])
227 max=
m;
228 memery[max]=
page[i];
229 time[max]=i;
/*记录该页进入物理块的时间*/
230 for(j=
0;j<mSIZE;j++
)
231 temp[i][j]=
memery[j];
232 }
233 else
234 {
235 for(j=
0;j<mSIZE;j++
)
236 temp[i][j]=
memery[j];
237 }
238 }
239 compute();
240 print(count);
241 getchar();
242 }
243 /*最近最久未使用置换算法*/
244 void LRU()
245 {
246 int memery[
10]={
0};
247 int flag[
10]={
0};
/*记录页面的访问时间*/
248 int i,j,k,m;
249 int max=
0;
/*记录换出页*/
250 int count=
0;
/*记录置换次数*/
251 /*前mSIZE个数直接放入*/
252 for(i=
0;i<mSIZE;i++
)
253 {
254 memery[i]=
page[i];
255 flag[i]=
i;
256 for(j=
0;j<mSIZE;j++
)
257 temp[i][j]=
memery[j];
258 }
259 for(i=mSIZE;i<pSIZE;i++
)
260 {
261 /*判断新页面号是否在物理块中*/
262 for(j=
0,k=
0;j<mSIZE;j++
)
263 {
264 if(memery[j]!=
page[i])
265 k++
;
266 else
267 flag[j]=i;
/*刷新该页的访问时间*/
268 }
269 if(k==mSIZE)
/*如果不在物理块中*/
270 {
271 count++
;
272 /*计算换出页*/
273 max=flag[
0]<flag[
1]?
0:
1;
274 for(m=
2;m<mSIZE;m++
)
275 if(flag[m]<
flag[max])
276 max=
m;
277 memery[max]=
page[i];
278 flag[max]=i;
/*记录该页的访问时间*/
279 for(j=
0;j<mSIZE;j++
)
280 temp[i][j]=
memery[j];
281 }
282 else
283 {
284 for(j=
0;j<mSIZE;j++
)
285 temp[i][j]=
memery[j];
286 }
287 }
288 compute();
289 print(count);
290 getchar();
291 }
292 /*最佳置换算法*/
293 void OPT()
294 {
295 int memery[
10]={
0};
296 int next[
10]={
0};
/*记录下一次访问时间*/
297 int i,j,k,l,m;
298 int max;
/*记录换出页*/
299 int count=
0;
/*记录置换次数*/
300 /*前mSIZE个数直接放入*/
301 for(i=
0;i<mSIZE;i++
)
302 {
303 memery[i]=
page[i];
304 for(j=
0;j<mSIZE;j++
)
305 temp[i][j]=
memery[j];
306 }
307 for(i=mSIZE;i<pSIZE;i++
)
308 {
309 /*判断新页面号是否在物理块中*/
310 for(j=
0,k=
0;j<mSIZE;j++
)
311 {
312 if(memery[j]!=
page[i])
313 k++
;
314 }
315 if(k==mSIZE)
/*如果不在物理块中*/
316 {
317 count++
;
318 /*得到物理快中各页下一次访问时间*/
319 for(m=
0;m<mSIZE;m++
)
320 {
321 for(l=i+
1;l<pSIZE;l++
)
322 if(memery[m]==
page[l])
323 break;
324 next[m]=
l;
325 }
326 /*计算换出页*/
327 max=next[
0]>=next[
1]?
0:
1;
328 for(m=
2;m<mSIZE;m++
)
329 if(next[m]>
next[max])
330 max=
m;
331 /*下一次访问时间都为pSIZE,则置换物理块中第一个*/
332 memery[max]=
page[i];
333 for(j=
0;j<mSIZE;j++
)
334 temp[i][j]=
memery[j];
335 }
336 else {
337 for(j=
0;j<mSIZE;j++
)
338 temp[i][j]=
memery[j];
339 }
340 }
341 compute();
342 print(count);
343 getchar();
344 }
页面置换算法的模拟实现
转载于:https://www.cnblogs.com/Catherinezhilin/p/11473834.html
相关资源:操作系统存储管理页面置换算法(OPT FIFO LRU LFU)完整代码