#include#include #include 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 < 运行可以检验程序是否正常提取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='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< 运行程序验证未命中替换是否准确:
发现未命中和命中机制正确运行,所以程序可用!
最后Mac Xcode运行环境下结果如下,但是明显发现最后一行数据读取有问题,经查是Mac Os对txt文件编码有异。所以转Windows系统下运行
Windows环境下结果如下:
正确!



