要求
- 作业共有320条指令,假设每个页面存放10条指令,它的地址空间为32页,初始状态所有页都未调入内存。
- 分配给作业的内存块数为4。
- 如果访问的指令在内存,则显示其物理地址,转入下一条指令,否则发生缺页,此时记录缺页次数,将相应页调入内存;
- 如果4个内存块均已占用,需进行页面置换,最后显示其物理地址,并转入下一条指令。
- 在所有320条指令执行完毕后,计算并显示作业运行过程中发生的缺页率。
- 作业中指令的访问次序按下述原则生成:
1、在[0,319]之间随机选取一条起始指令,序号为m ;
2、顺序执行下一条指令,即序号为m+1的指令;
3、通过随机数,跳转到前地址部分[0,m-1]中的某条指令处,其序号为m1;
4、顺序执行下一条指令,即序号为m1+1的指令;
5、通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;
6、顺序执行下一条指令,即序号为m2+1的指令;
重复跳转到前地址部分、顺序执行、跳转到后地址部分、顺序执行的过程,直至执行320条指令。
流程图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6aa6a750aa495d903948857fa4ff707b.png)
源代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define totalCmdNum 320
#define BlockNum 4
typedef struct {
int id;
int page;
int keepTime;
} Block;
int cmdNum = 0;
int curCmd;
int isExecute[totalCmdNum];
double lostPage = 0;
Block *blocks[BlockNum];
void init() {
for (int i = 0; i < totalCmdNum; i++) {
isExecute[i] = 0;
}
srand(time(NULL));