【计算机组成原理】8行Cache直接映射

        题目:“根据直接映射的cache工作原理,针对一个8行的cache工作过程进行仿真,每行(块)为一个字,1字4字节,需要读取的内存地址在trace (1).txt文件中列出。请编写程序,实现8行的cache工作过程进行仿真,可显示每个内存地址,及是否命中;命中率。(提交程序源码和命中率截图)”

第一部分:解决从txt文件按行提取文本

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    ifstream in("/Users/tietouguoerwademacbook/Desktop/trace (1).txt");//文本位置,注意空格
    string filename;
    string line;
    string Cache[8][4];    //定义一个二维字符串用于虚拟8个Cache里的4个字节
    int hit=0,miss=0;    //定义命中数和未命中数
    
    if (in) // 有该文件
    {
        while (getline(in, line)) // line中不包括每行的换行符
        {
            cout <<line<<endl;
            /* 下一部分代码插入后此处才可用 */
            /* 
            bool flag=TargetHit(Cache, line);
            if(flag){
                cout<<"Hit the Target!!"<<endl;
                hit++;
            }
            else{
                cout<<"Miss the Target!!"<<endl;
                miss++;
            }
            */
            /* 下一部分代码插入后此处才可用 */
        }
        cout<<"命中次数为:"<<hit<<endl;
        cout<<"未命中次数为:"<<miss<<endl;
        double aim=hit/(hit+miss);
        cout<<"命中率为:"<<aim<<endl;

    }
    else // 没有该文件
    {
        cout << "no such file" << endl;
    }
    return 0;
}

运行可以检验程序是否正常提取txt文件内容。

注意!该txt文档是用程序生成的,不能手动修改其内部数据,空格也不能加。

注意!!!!该txt文档在

第二部分:判断命中

        思路:将16进制按字节编制的地址变换为10进制地址,计算其所在的块号,所对应的Cache行号和Cache的行内字节号。

        计算公式:

                        块号=地址 / Cache一个块所含字节数

                        行号=块号 % Cache总行数

                        行内号=地址 % Cache一个块所含字节数

//根据10进制地址得到16进制地址
void convertintoH(string &Target,unsigned long int sum){
    int i=9,temp;
    while (i>=2) {
        temp=sum%16;
        if(temp>=10){
            Target[i]=temp-10+'A';
        }
        else Target[i]=temp+'0';
        sum/=16;
        i--;
    }
}

//判断命中
bool TargetHit(string Cache[8][4],string Target){
    unsigned long int sum=0;     //设置sum记录10进制数
    //转为16进制
    for (int i=2; i<Target.length()-1; i++) {
        sum*=16;        //嘎嘎牛牛牛
        int temp=(int)Target[i];
        if(temp>='0'&&temp<='9')  sum+=temp-'0';
        else sum+=temp-'A'+10;
    }
    
    //找到主存块号:
    long int kuainum=sum/4;
    //找到块内号
    int kuaineinum=sum%4;
    //找到Cache行号
    int linenumber=kuainum%8;
    
    //如果命中则返回真
    if(Cache[linenumber][kuaineinum]==Target) return true;
    
    //如果未命中,将该块挪进Cache
    //将该块内的其他一起挪进Cache
    else {
        string temp=Target;
        sum-=kuaineinum;    //从块内第一个地址开始
        for (int i=0; i<4; i++) {
            convertintoH(temp, sum+i);      //将其转换为16进制地址
            Cache[linenumber][i]=temp;      //存入该块内
           // cout<<i<<"个元素是"<<Cache[linenumber][i]<<endl; //用于检验该块内所有地址标志
        }
        return false;
    }
}

运行程序验证未命中替换是否准确:

 发现未命中和命中机制正确运行,所以程序可用!

最后Mac Xcode运行环境下结果如下,但是明显发现最后一行数据读取有问题,经查是Mac Os对txt文件编码有异。所以转Windows系统下运行

Windows环境下结果如下:

 正确!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值