博客
关于我
计算机系统原理——cachelab 实验1(第一周)
阅读量:327 次
发布时间:2019-03-04

本文共 2639 字,大约阅读时间需要 8 分钟。

cachelab工程以及valgrind下载:
pan.baidu.com/s/1XWH5Uq1jgtxdWoOx8vffkQ 码:7e8q

计算机系统原理——cachelab 实验日志1

一、实验准备

1、安装64位Linux系统
2、准备实验文件
1)下载cachelab-handout.tar与valgrind-3.12.0.tar.bz2文件并将其复制到Ubuntu中
2)在命令行界面用tar xvf 指令解压文件
3、阅读相关资料cachelab-ppt.pptx以及cachelab.pdf文件了解相关内容实验内容

二、搭建环境与分析脚本

1、valgrind安装

handout 文件夹中的 traces 子文件夹中包含了一些 参考追迹文件 ,用于评估你在 Part A 中写的缓存模拟器是否正确。追迹文件由一个叫做 valgrind 的 Linux 程序生成。
1)sudo apt install valgrind
在这里插入图片描述
2)valgrind --version
在这里插入图片描述
valgrind-3.11.0版本安装成功
注:使用课程网站提供的valgrind-3.12.0版本安装时出现错误(在./configure与make指令之后的 make install指令执行出错),因此选择apt-get install valgrind二进制包安装;

2、学会PartA部分参考引用csim-ref模拟器使用命令行参数及使用方法

Usage:  ./csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile>-h:可选参数,打印使用说明		•  -v:可选参数,展示追踪信息• -s <s>:缓存集下标的位数(S=2S) •  -b <b>:块的位数(B=2b,块大小)•  -E <E>:结合性(缓存集缓存行数)   • -t <tracefile>:用于追迹的 valgrind trace 文件。使用方法如追踪yi.trace文件

在这里插入图片描述

3、认识yi.trace中各项操作含义,并运行在缓存模型上,逐条分析trace文件操作且对比LRU替换策略,分析hit、miss、eviction结果产生过程

1) yi.trace文件:
在这里插入图片描述
2) 使用csim-ref指令运行并-v展开追踪信息得到(上右图)
3) 每一行记录了一次或两次内存访问,每行的格式为:
[空格] 操作 地址,大小
“I”:表示指令加载,“L”:表示数据加载,“S”:数据存储;
“M”:数据修改(即在一次数据加载之后紧跟着一个数据存储)
“I”之前没有空格,而“M”,“L”,“S”前面要有空格。

4) 分析(加粗表示组索引s)
①L 10,数据加载:x10=0000…0001 0000,块偏移值为最低四位,故组索引s=1;
一开始的时候cache是空的,因此第一次访问的时候为miss;
②M 20,数据修改(加载与存储)0x20=000…0010 0000,组索引s=2;
所以第一次访问的时候没有内容,访问结果为miss,然后cache从低一级存储器读取内容,存储的时候结果为hit;
③L 22,数据加载:0x22=000…0010 0100,s=2;
由于操作②将该块存入高速缓存且标记位相等,故结果为hit;
④S 18,数据存储:0x18=000…0001 0100,组索引s=1;
由于之前的操作,该块已存入高速缓存且标记位都为1,故访问结果为hit
⑤L 110,数据加载:0x110=000…0001 0001 0000 故组索引s=1
操作④将该块存入高速缓存了但标记位不相等,故访问结果为miss,将块17装入17%4=1处,发生一次eviction;
⑥L 210,数据加载:0x210=000…0010 0001 0000,故组索引s=1;
这里标记位为2与标记位1不匹配,故访问结果为miss, cache读取新的行,发生一次eviction。
⑦M 12,数据修改:0x12=000…0001 0010,组索引s=1;
第一次访问结果为miss,因为在操作⑥的时候发生了一次行替换把该块驱逐了,即标记位不相等,cache重新读取该块,发生一次eviction,数据存储为hit。

三、创建与释放缓存

1、get_Opt函数体

getopt()函数,如果函数声明丢失,则在Unix命令行上自动解析元素,通常在循环中调用以检索参数,它的返回值存储在局部变量中,当getopt()返回-1时,没有更多的选项。
getopt函数解析命令行参数,argc、argv是调用main函数时传入的参数。传入的’-'开始的字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv中的全部option解析出来
在这里插入图片描述
在这里插入图片描述
解析输入参数,检查输入参数的合法性,用count数组计数器来保证四个s、E、b、t参数是必有的且仅有一个,用checkOptarg函数来检查输入的格式的正确性;

2、printHelpMenu函数体

在这里插入图片描述
模仿csim-ref的格式和内容;

3、checkOptarg函数体

csim 接受的参数中,-h, -v 是可选的,而其余参数都是缺一不可的,此外全部是非法参数;当缺少任意一个必要参数时或输入非法参数时,应当给出错误提示并打印使用帮助。但函数原型只有optarg,因此checkOptarg函数应是在get_Opt函数中使用且需要和get_Opt函数组合来检查输入的正确性;
optstring(getopt第三个参数)指定选项合法的选项,一个字符代表一个选项,在字符后面加一个’:'表示该选项带一个参数,若有参数,optarg指向该该参数;
在这里插入图片描述
因此optarg中是随在-s等后的数字,需要检查它是否缺失;若缺失则curOptarg不会是0-9;

4、initCache()函数体

初始化cache模拟缓存体;
在这里插入图片描述

5、freeCache()函数体

释放initCache函数体生成的内存
在这里插入图片描述

四、检验主函数编写与结果分析

到目前来说完成了模拟缓存的初始化、释放以及输入命令行参数的检查,接下来检验他们的正确性;

1、putSets()——输出初始化后的组的信息

在这里插入图片描述

2、main()

在这里插入图片描述
make clean -> make后检测./csim
-s没有s符号时会出现提示
在这里插入图片描述
在这里插入图片描述
输入正确时显示目前初始化的组的情况,初始化正确;

转载地址:http://nefe.baihongyu.com/

你可能感兴趣的文章
今天你吃汤圆了吗?
查看>>
CI/CD and beyond with GitHub Actions
查看>>
回顾 | 如何快速开发一款扩展
查看>>
《进击吧!Blazor!》第一章 4.数据交互
查看>>
分享一个500异常
查看>>
怎么玩LOG4J
查看>>
Oracle创建用户,分配表空间
查看>>
自定义标签(JSP2.0)简单标签
查看>>
MyBatis自定义类型转换器
查看>>
SpringBoot缓存入门篇
查看>>
机器学习(湖北师范大学教程)-极大似然估计算法
查看>>
2019年下半年总结
查看>>
读《红楼梦》有感
查看>>
【数据库视频之数据库视图】
查看>>
【数据库视频之操作查询(一)】
查看>>
【C# 重构】—参数化查询, 需要参数,但未提供该参数
查看>>
决策树(二)—— ID3和C4.5
查看>>
leetcode做题记录0059
查看>>
leetcode做题记录0062
查看>>
Leetcode每日随机2021/4/26
查看>>