********
更正错误map[128],map[255]都要多申请一位
********
上一篇文章简单讨论了第一题,接下来我们要进行第二问的处理。
首先搞明白输入page(虚拟地址的页表)和输出frame(物理地址的帧表),在第二问中,我们并不想要得到value,而是关注于输入和输出转化的过程。
首先,我们引入了缺页率,就是我们得到一个输入的page在页表中找不到的概率。(存疑)
还是按之前的流程,我们在一开始,内存条(物理地址)还没有分配满的时候,我们出现缺页,直接一个一个按顺序给就好了。
但是在第二问中,出现了问题,如果说我们的内存条满了,页表还是找不到,怎么办。
因为是256-128的情况,所以会出现这种问题,这个时候我们就要进行处理,把内存条拿出来一个,把新的放进去。
拿哪一个?这个时候就是大问题了,拿最长时间没用过的LRU,拿最先进来的FIFO,两种策略,两个文件。
我们先说FIFO的,那就是满了,我们就放第0个帧嘛,frame = 0 ; 然后我们再接着++嘛。
代码如下,
//搜查页表
if(frame == -1){
int q;
for(q = 0; q < 128;q++ ){
if(map[q] == page){
//找到拉
frame = q;
}
}
//进行页替换
if(frame == -1){
//没找到
//实现先进先出的页替换,这里用队列比较好。
printf("出现了一次缺页! ");
page_default++;
if(point == 128){
point = 1;
}
map[point] = page;
frame = point;
point++;
}
//更新TLB
注意,这里并不是FIFO,真正的FIFO,应该采用队列的数据结构来进行处理,如果大家想要高分的话,一定要注意,严格要求自己
其他的内容就和第一问差不多,而且我们不需要搞value了。
但是问题来了,老师还要我们搞TLB,这又是什么呢,我的理解是,他是相当于一个更高级的缓存,我们先去查询TLB,没有再去查询页表,在得到结果之后。在进行对TLB进行更新。
int page = 0;//页号
page = binary_to_int(binary,8,16);
int m = 0;
int frame = -1;
//实现map很麻烦,这里我们就反过来使用我们之前的map[]数组,key用来存放帧表,value放页表,搜查我们使用便利
//在实际中,应该是使用map,rb_tree来实现这一对应的功能,但是老师说语言不是问题,我觉得完成任务,这二者是没有差别的
//搜查TLB
int w;
for(w = 0; w < 16; w++){
if(TLB[w].value == page ){
TLBHitTimes++;
printf("出现一次tlb命中 ");
frame = TLB[w].key;
}
}
//搜查页表
if(frame == -1){
int q;
for(q = 0; q < 128;q++ ){
if(map[q] == page){
//找到拉
frame = q;
}
}
//进行页替换
if(frame == -1){
//没找到
//实现先进先出的页替换,这里用队列比较好。
printf("出现了一次缺页! ");
page_default++;
if(point == 128){
point = 1;
}
map[point] = page;
frame = point;
point++;
}
//更新TLB
if(point_TLB == 16){
point_TLB = 0;
}
TLB[point_TLB].value = page;
TLB[point_TLB].key = frame;
point_TLB++;
}
//现在我们得到了我们想要的数据,一个是偏移量,一个是对应的帧表数值,结果是要让我们返回二者和起来的数字。
那么老师要求的TLBhit和缺页率也就很好求了,我们在现有的代码上,如果TLB找到啦,就++,如果没找到,页表也没找到,就pageDefault+&#