计算机组成原理---映射方式和常见的替换算法

1.主存和CPU的连接

下面的这个就是我们非常熟悉的这个译码器,诸如我们学习的这个2-4译码器,3-8线译码器之类的;

实际上片选的译码器,就是n个输入端,输出端的个数和输入端的个数是2的n次方的关系;

下面的这些符号里面的这个上面有横线的都是低电平有效,就是我们在逻辑运算里面学习的这个非运算,当我们的这个本身是0的时候,进行非运算的结果就是1,因此这样的情况我们称为低电平有效;

使能端存在的意义:假设我们的这个输入端口本来想要传输的这个数据是111,但是如果我们传输的这个数据没有稳定就被输出端读取了,这个时候就可能读取的事101,显然是有问题的,因此我们的这个使能端存在的意义就是保证我们的输入端的这个数据稳定之后在进行这个输出端的接受的过程,保证这个传递的数据的有效性,避免不稳定出现的问题;

低电平有效的好处:省电,因为低电平有效意味着我们的电位标记是0的时候才是有效的

image-20250618134235349

2.一道题目

下面的这个题目咋看上去非常的唬人,但是如果你知道这个MAR的位数取决于我们的主存地址空间的大小,这个题目就不会做错,因为我们的这个主存的地址空间的大小是64MB,这个MB表示的就是20次方,这个64表示的就是6次方,所以合起来就是26次方,因此这个对应的就是26位(即从26个0到26个1);

image-20250618151756532

3.局部性原理

下面的这个图片的左右两边都有一个简单的程序,但是区别就是一个是从i开始的,一个是从j开始的;

如果这个从1开始的话,相当于就是00,01,02的这个样子的,但是如果是像右边的这个样子从j开始的,这个时候对应的就是00,10,20,30的这个样子,通过观察我们的这个数据的编排的顺序,我们发现显然是左边的这个方式的效率更加高效,因为我们的数据的存放的方式就是00,01,02的这个样子的;

时间局部性:我们的系统认为现在访问的数据,未来可能还会被访问到;

空间局部性:最近用到的这个数据,和他相连的这个数据也是可能会被访问到的;

例如我们的这个数组,假设是一维的数组arr,里面有15个元素,如果我们访问的事第一个元素,我们的这个系统会根据这个空间局部性原理认为这个数组里面的其他的元素也是可能会被访问到的;

image-20250618152538483

4.如何正确的理解局部性原理

针对于这个组成原理里面的cache对应的局部性原理,我们可以使用下面的这个方式进行理解:

1)首先我们需要知道这个块号块内部地址的这个内容,就是我们的这个主存和我们的cache基本的编排方式都是一样的,前面的是我们的块号,后面的是我们的内部地址;

2)而且我们的这个主存和cache里面的这个块内部地址的这个大小是一样的;

3)假如我们的这个块的大小是64KB吧,这个时候块号就是使用的我们的主存大小除以我们的这个每一块的大小,就可以计算出来这个块的数量,然后使用块内部地址找到这个具体的内容;

4)还是使用上面的那个64B作为例子,假设是int类型的,换算之后就是16个int,因此假设是一个数组的话,就是a[0]到a[15],因此如果你访问这个a[0]不存在,这个时候a[1]到这个a[15]全不会掉入到我们的缓存里面去;

5)因为根据上面介绍的这个局部性原理,我们访问这个数组里面的第一个元素的时候,我们的这个系统就会认为这个数组里面的其他的元素是有可能会被访问到的,因此这个剩余的15个元素全部都会调入到这个cache里面去;

6)换言之,如果第一次访问的时候没有命中,那么剩下的几次一定会被命中的

image-20250618153130626

5.直接映射&组相连的理解

今天在学这个部分的时候,我才是真切的理解了这个里面的一点点思想吧,之前学了两三遍都是懵懵的,这次终于算是理解了一点点,因此当学到这个地方的时候我真正的明白:408里面的基础科目,一定要多学,每一次学习的时候都有不同的理解和体会,虽然这个知识是不变的;

我今天理解最深的就是这个主存的这个块号的划分为这个19bit作为标记位,剩下的三个就是我们的行号,这个里面实际上也是存在一定的逻辑的:

1)一定要知道我们的这个块号的计算的方法:主存的块号%块数;5

2)在下面的这个图示的例子里面,实际上就是映射到这个0-7这几个位置里面去,这叫做映射

3)因此,我们通过这个块号,就可以确定这个标记位里面的一部分内容了,我们去进行这个相关的比较的时候,是完全没有必要拿着我们的这个主存块号22位的标记位进行比较;

4)因为我们的这个映射到的这个块的位置就决定了我们的这个行号的具体的表示的内容,这个在我们映射成功的那一时刻一切都是确定了的,所以我们可以把这个行号的三位(为什么是2bit,因为我们的这个块号是0-7,也就是三个不同的情况,因此,这个2的3次方等于8,所以三位就可以表示这个所有的块号的情况);

5)因此我们进行这个主存块号和我们的这个cache的块号的比对的时候,完全不需要比较这22个bit位,而是比较出去这个行号的三位之外的19bit进行比较即可;

6)为什么在这个事情上面我写了很多的内容,因为我第一次明白这个里面的具体的逻辑,我记得我最开始学习这个内容的时候,那个老师上去直接把这个主存块号里面的这个位数给我们摆出来了,我完全不知道里面还有这个过程的,但是今天也是是“识得庐山真面目了”

image-20250618161451043

下面的这个是我们的组相连映射,有了上面的那个基础,这个理解起来就会非常的简单easy,这个时候的主存的块号还是22bit,但是这个时候如果我们使用的是2路组相连映射,这个时候我们的8个cache就会被划分为4组,因此这个使用2bit进行这个组数的表示即可,因为我们的00 01 10 11就可以表示我们的这个组号的所有的可能的情况的;

因此我们的这个主存的块号和我们的这个cache的标志位进行比较的时候,也是不需要全部比较的,直接比较剩下的20位即可(一样的道理,我们的这个主存映射成功的那一时刻,这个组号就确定了,因此相当于这个22bit里面的2位就是确定的,我们就没有必要去进行比较了)

image-20250618161718426

总结:这个直接映射和组相连映射的这个逻辑原理非常的相似,对于这个标志位的处理也是如出一辙,我今天终于是深刻的体会到了,为什么会出现这样的这个情况,究其本质原因,其实就是因为在我们的这个映射的过程里面,映射成功的那一个,有些这个信息就确定了,诸如我们的直接映射里面的行号,和我们的这个组相连映射里面的组号,因此我们需要刨除对应的bit位,和剩余的位数进行比较即可,仅此而已;

6.缓存cache替换算法

下面展示的就是我们的三个不同的映射的方式:

直接映射全相连映射组相连映射,其中我们这个章节所谈及的这个替换算法,是针对于这个直接映射和组相连而言的,我们的全相连不存在这个替换的情况,因为全相连映射就是鸠占鹊巢,如果你存在了,我就把你踢出去,我进去,就是这么粗暴,所以我们下面的这个算法也是针对于这个直接映射组相连映射而言的;

image-20250618162000205

6.1随机替换算法

就是没有章法,随便替换,非常low

6.2先进先出算法

谁先进来,我们在替换的时候,就把这个东西替换出去,但是这个也存在问题,就是我们先进来的这个可能后面会被频繁的使用到,因此这个也不科学;

抖动现象:内存块被频繁的换入换出,最开始进来的也有可能是我们最经常使用的;

6.3最久最近未使用

这个使用的是count计数器的方式,命中的时候,所有的这个计数器全部都是清零的,其他的计数器是+1;

简单地说,就是命中的清零,数据越小越不容易被踢出去,没有命中的但是本身就存在数据的就会++,数据越大,证明你这个没被使用的次数越多,很有可能会被淘汰掉;

一旦被命中,之前的所有的数据全部清零(命中的),其他的数据都是加1的操作;

但是实际山我们没必要整得这么复杂,我们直接在写的过程中往前比对一下就知道谁是最近最久没有被使用的了,我们直接进行替换即可,没有必要使用这个count进行计数;

6.4最不经常使用

这个实际上也是使用的计数器的原理,就是我们的这个块,每一次进行访问到,这个count就会自增一次,因此这个实际上和我们的6.3里面的这个逻辑恰好是一样的,我们的这个数据越大,表示访问的次数越多,就不可能会被淘汰掉;

但是这个也有不合理的地方,举一个生活化的例子:

你和你的女神从晚上的6点到8点打了2个小时的wechat视频电话,然后这个时候你开始打游戏;

[!check] 你和女神的故事案例
从晚上8点开始,你开始打游戏,但是这个时候我们的这个wechat里面的这个缓存的count非常的大,因为前面的两个小时我们的wechat相关的信息全部都在被频繁的时候,所以这个count就会非常的大;

但是你的游戏刚开局,所以当这个cache不够使用的时候,我们的这个被替换出来的就是刚刚打开的游戏的内容,因为我们的视频电话的这个count非常的大,所以不会被淘汰掉,但是实际上我们是想让这个系统把wechat的内容淘汰掉的,但是在这个6.4算法的原理下面,这个wechat不可能不会换出,换出的永远是我们的游戏的内容,因此这个造成的结果就是我们的这个游戏非常的卡顿

7.经典题目

下面的这个就是我们的组相连映射的组号的计算的方法:

首先对于这个129进行二进制的表示:10000001,这个32字节意味着我们的每一块的块内部地址是5个bit位就可以完全表示了,因为2的5次方等于我们的32嘛,这个很容易理解;

16个块,二路组相连,实际上就是8组,这个组号我们使用3位进行表示即可;

因此针对于这个129的二进制表示的这个8位,低五位就是我们的块内部地址,这个高三位就是我们的组号,因此这个10000001里面的高三位就是100,对应的就是第四组,即组号是4;

image-20250618164346281

我是阑梦清川,希望得到您的关注

<section class="mp_profile_iframe_wrp" nodeleaf=""><mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe mp_common_widget js_wx_tap_highlight" data-pluginname="mpprofile" data-nickname="跟学长学数模" data-alias="vx17813100105" data-from="0" data-headimg="http://mmbiz.qpic.cn/sz_mmbiz_png/7ibTuicIwZU7icUWibpvKcMgKeibKk3tkyLjco05PWQa1HqLCicGRtpEBib4BTGagjYJWZJ2uYEFafXjVNsIfHZqayibyg/300?wx_fmt=png&amp;wxfrom=19" data-signature="嗨,很高兴认识你,也很开心和你分享我的学习心得和体会。" data-id="MzkwOTY0MjA4Ng==" data-is_biz_ban="0" data-service_type="1" data-verify_status="1" data-origin_num="99" data-isban="0" data-biz_account_status="0" data-index="0"></mp-common-profile></section>

文章推荐
05年,20岁,还是没能脱下孔乙己的长衫👈️
当实验报告变成 “形式主义之下的AI大赛”:大学生的时间,不该浪费在实验报告上面👈️
普通工厂模式是青铜,抽象工厂模式是王者?这场设计模式 battle 太精彩👈️
纵使AI使用千万种修辞手法,也写不出人类独有的精神密码–2025新高考一卷语文作文测评👈️
cursor还能绘制文章的架构图,太酷了👈️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值