操作系统概念第九版中文版pdf_《操作系统概念》第九版 第九章课后习题 编程项目 2 简答...

本文探讨了操作系统中页式虚拟内存的管理,特别是当内存条满时的替换策略,包括FIFO和LRU。解释了TLB(Translation Lookaside Buffer)的作用,并提供了相关代码实现,同时提出了关于虚拟内存与物理内存对应关系的思考问题。
摘要由CSDN通过智能技术生成

b7dd280a39a9af64ae1fc4b7107a1298.png

********

更正错误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+&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值