操作系统作业04

分页地址变换

需求分析

某系统程序空间与物理空间都是2GB,页面大小为4KB。已知某进程的页表如下,请编写程序模拟分页系统的地址变换过程。要求分为公式法和硬拼法两种方式计算并对比。

Pno     Fno
0       32102
1       443217
2       6723
3       8985
4       11238
5       29065
6       234205
7       45812
8       240561
9       300451

程序设计思路、

下面的图说明了上面页表的作用(表左边用户程序对应了逻辑地址,右边内存对应着物理地址):

这里写图片描述
来自网络
其中2GB的程序以及4KB的页面可以知道,该程序需要512K个页号来储存,但是题目中只给出了1~10的页号,所以本程序只针对1~10的页号进行转换。

程序关键代码及解释

  1. 公式法求物理地址关键代码
//公式法
int fromualWay(int Pagecount){
        //PageSize=4096;
        //Pagecount为传入逻辑页号      

        int Pb = Pagecount/pageSize;    //计算页号
        int W = Pagecount%pageSize;    //计算块内偏移量

        int address;                    //储存物理地址

        address = p[Pb]*pageSize + W;

        return address;               //返回物理地址
}
  1. 硬拼法求物理地址关键代码
void SpiltWay(char *str){
        //str为逻辑地址转换为二进制的字符串

        char pt[20];               //储存32到12位的2进制代码
        int i;
        int value;
        for(i=0;i<=19;++i){        //初始化页号
                pt[i] = str[i];
        }               

        value = BinaryToDecimal(pt,20);//将页号对应的十进制赋值给value
        value = p[value];             //value取得页号对应的块号

        DecimalToBinary(value, str,20);//将str前20位的值替换为value

}

3.辅助操作函数

//二进制转十进制
int BinaryToDecimal(char* str,int bitCount)
{
    int n=0;
    int i=0;
    int x=bitCount;
    while(bitCount-i!=0)
    {
            if(str[x-1]=='1')
                        n += 1 *pow((double)2,(double)i);
        i++;
        x--;
    }
    return n;
}
//十进制转二进制
void DecimalToBinary(int x,char *str,int bit)
{
    int i,k;
    //char *str=new char[bitCount];
    for(i=0;i<bit;i++)
    {
        str[i]='0';
    }
    //str[BitCount] = '\0';

    k=i-1;
    while(1)
    {
            if( x%2 == 1)
                        str[k] = '1';
        //str[k]=(char)(x%2+48);
        k--;
        if(x/2==0)
        {
            break;
        }
        x=x/2;

    }

}
void SubStr(char *Str2, char *Str1,int begin, int end){
        int i;
        for(i = begin;i<=end;i++){
                Str2[i] = Str1[i];
        }


}

4 程序源码及运行结果

#include<stdio.h>
#include<math.h>
#include<string.h>

#define BitCount 32
#define pageSize 4096
#define MaxSize 40960//页号的最大值

int p[10] = {32102,443217,6732,8985,11238,29065,234205,45812,240561,300451};
//初始化页表

//公式法
int fromualWay(int Pagecount){

        int Pb = Pagecount/pageSize;    //计算页号
        int W = Pagecount%pageSize;    //计算块内偏移量

        int address;                    //储存物理地址

        address = p[Pb]*pageSize + W;

        return address;
}

int BinaryToDecimal(char* str,int bitCount)
{
    int n=0;
    int i=0;
    int x=bitCount;
    while(bitCount-i!=0)
    {
            if(str[x-1]=='1')
                        n += 1 *pow((double)2,(double)i);
        i++;
        x--;
    }
    return n;
}

void DecimalToBinary(int x,char *str,int bit)
{
    int i,k;
    //char *str=new char[bitCount];
    for(i=0;i<bit;i++)
    {
        str[i]='0';
    }
    //str[BitCount] = '\0';

    k=i-1;
    while(1)
    {
            if( x%2 == 1)
                        str[k] = '1';
        //str[k]=(char)(x%2+48);
        k--;
        if(x/2==0)
        {
            break;
        }
        x=x/2;

    }

}

void SpiltWay(char *str){
    //str为逻辑地址转换为二进制的字符串

    char pt[20];               //储存32到12位的2进制代码
    int i;
    int value;
    for(i=0;i<=19;++i){        //初始化页号
            pt[i] = str[i];
    }               

    value = BinaryToDecimal(pt,20);//将页号对应的十进制赋值给value
    value = p[value];             //value取得页号对应的块号

    DecimalToBinary(value, str,20);//将str前20位的值替换为value

}

void SubStr(char *Str2, char *Str1,int begin, int end){
        int i;
        for(i = begin;i<=end;i++){
                Str2[i] = Str1[i];
        }


}
int main(){

        int PageCount;
        int address;
        int i;
        char str1[32];

        printf("请输入合法指令码:");
        scanf("%d",&PageCount);
        address = fromualWay(PageCount);

        DecimalToBinary(PageCount,str1,32);

        SpiltWay(str1);
        i = BinaryToDecimal(str1,BitCount);
        printf("公式法得物理地址为:%d\n",address);
        printf("硬拼法得物理地址为:%d\n",i);
        for(i=0;i<sizeof(str1);++i){
                printf("%c",str1[i]);
        }
}

运行结果

这里写图片描述
这里写图片描述

小结

本次作业,起初不太了解题意,又回去翻书,并没有翻倒自己想要的,真的是上课10分钟,下课一小时。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值