1GB的内存,它是以字节编址的,假设内存地址为32位,128KB的高速缓存。现在有一个数据位于0x123456(字节编址),会映射到那些不同情形的内存单元上,还有TAG和总缓存大小。

1. 直接映射,每块16字节。

已知:

  • 块大小为 $16$ 字节,也就是 $128({2^7})Bit$ 。

首先要计算块行数(数量):

  • 块行数=$\frac{{128 \times 1024 \times 8B{\rm{it}}}}{{16 \times 8B{\rm{it}}}} = \frac{{{2^{20}}}}{{{2^7}}} = {2^{13}}$。

主存地址 = 区号 + 区内块号 + 块内偏移量:

  • 主存有 ${2^{32}}$ 块。
  • 区内块号就是cache行数。
  • 块内偏移量就是cache块大小=$4$(注意这里是字节编址)。

于是我们可以得到标记的位数:

  • $Tag=32-13-4=15$。

于是我们可以得到地址如下所示:

然后计算块地址:

  • $0{\rm{x}}123456 \div 0{\rm{x}}10 = 0{\rm{x}}12345$

接着计算Cache行号:

  • $0{\rm{x}}12345\bmod {2^{13}} = 0{\rm{x}}345$
  • 所以$TAG=0{\rm{x}}9$。

所以直接映射的Cache总位数为:

  • ${2^{13}} \times ({2^2} \times {2^5} + (32 - 13 - 2 - 2) + 1)=1179648Bit=147456Byte=144KB$

2. 直接映射,每块64字节。

已知:

  • 块大小为 $64$ 字节,也就是 $512({2^9})Bit$ 。

首先要计算块行数(数量):

  • 块行数=$\frac{{128 \times 1024 \times 8Bit}}{{{2^9}}} = {2^{11}}$。

主存地址 = 区号 + 区内块号 + 块内偏移量:

  • 主存有 ${2^{32}}$ 块。
  • 区内块号就是cache行数。
  • 块内偏移量就是cache块大小=$6$(注意这里是字节编址)。

于是我们可以得到标记的位数:

  • $Tag=32-11-6=15$。

然后计算块地址:

  • $0{\rm{x}}123456 \div 0{\rm{x}}40 = 0{\rm{x}}48D1$

接着计算Cache行号:

  • $0{\rm{x}}48D1\bmod {2^{11}} = 0{\rm{x}}D1$
  • 所以$TAG=0{\rm{x}}9$。

所以直接映射的Cache总位数为:

  • ${2^{11}} \times ({2^4} \times {2^5} + (32 - 11 - 4 - 2) + 1)=1081344Bit=1056Byte=132KB$

3.二路组相联,每块16字节

已知:

  • 块大小为 $16$ 字节,也就是 $128({2^7})Bit$ 。

首先要计算块组数(数量):

  • 块行数=$\frac{{128 \times 1024 \times 8B{\rm{it}}}}{{16 \times 8B{\rm{it}}}} = \frac{{{2^{20}}}}{{{2^7}}} = {2^{13}}$。
  • 块组数=$\frac{{{2^{13}}}}{2} = {2^{12}}$。

主存地址 = 组号 + 组内块号 + 块内偏移量:

  • 块内偏移量也就是cache块大小=$4$。
  • 组内块号就是cache组数

于是我们可以得到标记的位数:

  • $Tag=32-12-4=16$。

然后计算块地址:

  • $0{\rm{x}}123456 \div 0{\rm{x}}10 = 0{\rm{x}}12345$

接着计算Cache组号:

  • $0{\rm{x}}12345\bmod {2^{12}} = 0{\rm{x}}345$
  • 所以$TAG=0{\rm{x}}12$。

所以2路组相联的Cache总位数为:

  • ${2^{13}} \times ({2^2} \times {2^5} + (32 - 12 - 2 - 2) + 1)=1187840Bit=148480Byte=145KB$

4. 四路组相联,每块32字节

已知:

  • 块大小为 $32$ 字节,也就是 $256({2^8})Bit$ 。

首先要计算块组数(数量):

  • 块行数=$\frac{{128 \times 1024 \times 8B{\rm{it}}}}{{32 \times 8B{\rm{it}}}} = \frac{{{2^{20}}}}{{{2^8}}} = {2^{12}}$。
  • 块组数=$\frac{{{2^{12}}}}{{{2^2}}} = {2^{10}}$。

主存地址 = 组号 + 组内块号 + 块内偏移量:

  • 块内偏移量也就是cache块大小=$5$。
  • 组内块号就是cache组数

于是我们可以得到标记的位数:

  • $Tag=32-10-5=17$。

然后计算块地址:

  • $0{\rm{x}}123456 \div 0{\rm{x}}20 = 0{\rm{x}}91A2$

接着计算Cache组号:

  • $0{\rm{x}}91A2\bmod {2^{10}} = 0{\rm{x}}1A2$
  • 所以$TAG=0{\rm{x}}24$。

所以4路组相联的Cache总位数为:

  • ${2^{12}} \times ({2^3} \times {2^5} + (32 - 10 - 3 - 2) + 1)=1122304Bit=140288Byte=137KB$

计组Review1的更多相关文章

  1. 计组CPU设计实验关键材料和关键设计

    我记得这是2016春季学期搞得,参考和学习了很多别人的东西,这里小小的总结一下,逻辑性还不是太强,还需要好好整理 首先是指令集 CPU架构 外部接线架构 指令格式 机器状态自动机 这部分忘了,汗 这部 ...

  2. 【计组】《计算机组成与体系结构性能设计》William Stallings 第2部分 计算机系统 第3章 计算机功能和互连的顶层视图

    关键词 address bus 地址总线 asynchronous timing 异步时序 bus 总线 bus arbitration 总线仲裁 bus width 总线宽度 centralized ...

  3. 【重学计算机】计组D3章:运算方法与运算器

    1. 定点数运算及溢出 定点数加减法:减法化加法,用补码直接相加,忽略进位 溢出:运算结果超出了某种数据类型的表示范围 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出 方法 ...

  4. 【重学计算机】计组D2章:数据表示

    1.基本概念 真值:+0101,-0100:机器数: [x]原=0101 2.几种机器数 原码:x = -0101,[x]原 = 1101 反码:x = -0101,[x]反 = 1010 补码:x ...

  5. 【重学计算机】计组D1章:计算机系统概论

    1.冯诺依曼计算机组成 主机(cpu+内存),外设(输入设备+输出设备+外存),总线(地址总线+数据总线+控制总线) 2.计算机层次结构 应用程序-高级语言-汇编语言-操作系统-指令集架构层-微代码层 ...

  6. 计组_IEEE754_练习题

    IEEE754   阶码:移码:尾数:原码 一个规格化的32位浮点数x的真值可表示为:          x=(-1)^s×(1. M) × 2^(E-127)       e=E-127 其中尾数域 ...

  7. [软工顶级理解组] Beta阶段项目展示

    目录 团队成员 软件介绍 项目简介 预期典型用户 功能描述 预期目标用户数 用户反馈 团队管理 分工协作 项目管理 取舍平衡 代码管理 程序测试 代码规范 文档撰写 继续开发指导性 用户沟通 需求分析 ...

  8. [软工顶级理解组] Alpha阶段项目展示

    目录 团队成员 软件介绍 项目简介 预期典型用户 功能描述 预期目标用户数 用户反馈 团队管理 分工协作 项目管理 取舍平衡 代码管理 程序测试 代码规范 文档撰写 继续开发指导性 用户沟通 需求分析 ...

  9. 计算机系统6-> 计组与体系结构3 | MIPS指令集(中)| MIPS汇编指令与机器表示

    上一篇计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统从顶层讲解了一个指令集 / 指令系统应当具备哪些特征和工作原理.这一篇就聚焦MIPS指令集(MIPS32),看看其汇 ...

  10. Codeforces Round #389 (Div. 2,) B C

    考完复变之后沉迷联盟不能自拔...明天就开始抢救计组 ... B 一个人装错了键帽 选择几个pair 把pair里面的键帽交换 并且每个键帽最多可以换一次 给出按键序列和输出序列 判断是否可以 如果可 ...

随机推荐

  1. 齐博x1如何开启自定义标签模板功能

    为安全起见,同时也为了避免用户随意添加风格导致默认模板不协调,系统默认关闭了类似V系列的自定义修改模板功能.如下图所示,默认是关闭的 你如果需要启用的话,把下面的代码,参考下图导进去后,就可以增加一个 ...

  2. SpringBoot 阶段测试 1

    SpringBoot 阶段测试 1 目录 SpringBoot 阶段测试 1 1.使用JDK8新语法完成下列集合练习: 1.1 List中有1,2,3,4,5,6,7,8,9几个元素要求; (1) 将 ...

  3. 计算机系统大作业:Hello的一生

    计算机系统大作业 题 目 程序人生-Hello's P2P 专 业 计算机科学与技术 学 号 班 级 学 生 江水为竭 指导教师 刘宏伟 计算机科学与技术学院 2022年5月 摘 要 HelloWor ...

  4. Go实现常用软件设计模式一:单例模式

    目录: 举个栗子 概念介绍 使用场景 1.举个栗子 类图 plantuml ``` @startuml'https://plantuml.com/class-diagramclass Elephant ...

  5. Redis 常见问题

    Redis 常见问题 落叶他乡树,寒灯独夜人. 一. 什么是Redis? Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库: Redis的数据都基于缓存的,所以很 ...

  6. vue 中使用 this 更新数据的一次大坑

    情景说明: 之前用 vue 做数据绑定更新时,发现一个莫名奇妙的问题. 我在 vue 实例中声明了一个数组属性如 books: [],在异步请求的回调函数中使用 this.books = res.da ...

  7. Mybatis-plus多数据源 + 数据库连接明文加密

    核心依赖 <!--mybatis-plus 核心组件--> <dependency> <groupId>com.baomidou</groupId> & ...

  8. Vue2组件间通讯

    Vue2组件通信的基础方式 自己的理解:组件化通信,无非就是数据你传我,我传你,两个组件的相互交流,方法很多,下方有图示(此篇建议小白阅读,大神的话也不会看,哈哈哈哈!仅供参考,有不同的意见可以一起交 ...

  9. Jmeter中用户定义的变量跟用户参数的区别

    用户定义的变量: 全局变量,可以跨线程组被调用,但是,在启动运行时,获取一次值,在运行过程中,不会再动态获取值.用户参数: 局部变量,只能在自己的线程组中被调用,不能直接跨线程组被调用:但是,它在启动 ...

  10. 【JVM故障问题排查心得】「内存诊断系列」JVM内存与Kubernetes中pod的内存、容器的内存不一致所引发的OOMKilled问题总结(上)

    背景介绍 在我们日常的工作当中,通常应用都会采用Kubernetes进行容器化部署,但是总是会出现一些问题,例如,JVM堆小于Docker容器中设置的内存大小和Kubernetes的内存大小,但是还是 ...