题目:“根据直接映射的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环境下结果如下:
正确!