Please enable JavaScript.
Coggle requires JavaScript to display documents.
存储器 (:moneybag:Cache (:moneybag:映射 (:one:直接映射 (:dagger_knife:余数 (:warning…
存储器
:moneybag:Cache
:explode:介于主存和处理器之间的高速缓存区
:moneybag:映射
:zap:为了保证地址的一致性,从主存转到Cache的时候要建立和主存内部地址的映射关系.
:one:直接映射
:dagger_knife:余数
:warning:主存地址通常>Cache的块数=>Cache的每个块里面存"标记",来记录前面几位
:explode:一般对2的幂次方作余数<=>选择主存内部地址的低几位.
:star:解决了空间局部性,因为连续的内存空间会因为mod而分散到旁边的块
:explode:如果我要访问内存的xx地址,
先把xx地址除以块大小然后向下取整
,对结果我取中间几位当做是Cache的第几个块,然后后面的低位当做块内地址,而前面几位作为TAG标记来记录在里面=>确定好映射关系了~
:star:Cache的一个块内也划分,所以存在块内地址
:two:全相连
:dagger_knife:替换策略
#
:explode:直接映射,只用TAG来判断
:three:组相连
:zap:直接映射和全相连的折中方案
:explode:分成几个组,用内存的xx地址的低位来获得第几个组,最后这个组里面使用全相连的方式来映射的
:dagger_knife:替换策略
#
:snowflake:内存=教室的桌子 讲台上站人是那个位置的=Cache
:tornado:记录的信息
:explode:索引 | 有效位 | 标记 | 数据
:moneybag:Cache总位数计算公式
:explode:Cache总位数=块的数量*(块的大小+标记域大小+有效位)
:moneybag:标记域大小
:explode:内存中地址以几位存储-(块的数量是几位+块的大小的字节数是几位)
:tornado:32-(n+m+2)(有2的n次方个块,块的大小为m字,1个字为4BytesA)
:star:块本身有大小,里面的字节偏移量似乎也能当做一个默认的结果
:moneybag:有效位
:explode:Cache中的每一块在一开始是无效的,如果我们只有下表和标记两个的话,是不能确定里面的数据是有效的
:moneybag:局部性原理
:one:空间局部性
:explode:空间上存储一起的数据访问到的几率也高
:two:时间局部性
:explode:访问时间越近再次访问的几率也高
:zap:保存哪些数据比较有价值
:recycle:级别
:zap:提高性能
:explode:一级Cache,二级Cache,三级Cache
:one:一级Cache,在处理器内部,以核心频率工作
:two:二级Cache,以处理器一半频率工作,与CPU一起封装
:three:三级Cache,在主板上,以总线频率工作
:moneybag:块
:explode:一般为4字,按照硬件设计的
:moneybag:数据一致性
:explode:保持主存与Cache内的数据一致
:zap:修改时可能会导致存储器的数据和Cache内的不一致
:dagger_knife:方法
:one:write-through
:explode:写存储器数据时,连着Cache一起写
:frowning:写速度慢
:two:write-back
:explode:先只写在Cache里面,等到替换块的时候,再写回到存储器中
:frowning:控制复杂
:moneybag:替换策略
:tornado::one:LRU :two:FIFO :three:LFO :four:Random
:moneybag:失配
:recycle:分类
:one:强制失配
:explode:第一次启动时失配
:maple_leaf:增大块的大小(=>命中率也高)
:two:容量失配
:explode:由于Cache本身容量小于主存容量而导致的问题
:maple_leaf:分级Cache
:three:相连失配
:explode:由于映射导致的失配
:maple_leaf:加大组相联到全映射
:explode:miss.要找的数据不再Cache里面
:moneybag:hit.命中
:explode:要找的数据就在Cache里面
:moneybag:虚拟存储技术
:explode:一个程序要有一段存储空间,这段存储空间是线性的,我们把它按页拆分.构建一个页表,然后这个页表上记录每个页都在什么地方(内存/磁盘).
:moneybag:Page Fault
:explode:如果发现不再内存,则算作Page Fault
:moneybag:计算
:one:计算某个数据在哪里
:explode::one:根据线性地址计算第几个页 :two:查页表判断在内存/磁盘 :three:如果在内存,直接存取;如果不再内存,就先把主存的某一页换到磁盘上,再把要访问的那个页弄到内存上
:two:页表大小
:explode:页表大小=页数量*页的大小
:moneybag:页的大小
:explode:页的大小=
:moneybag:页数量
:explode:页数量=线性空间有多大/页的大小
:moneybag:TLB
:zap:页表太大了,所以我们也不是都能放在内存的.所以通过TLB来先记录一些.
:snowflake:先查小纸片,之后再查电话簿
:moneybag:替换策略
:dagger_knife:LRU
:moneybag:总线
:recycle:CPU内外部
:one:内部总线
:two:系统总线
:explode:CPU同其他部件的连线,如存储器等
:three:I/O总线
:explode:I/O设备之间连接的总线
:moneybag:总线仲裁部件
:zap:总线会被多个主设备使用,总线仲裁部件要想办法授权这个总线控制权给某个主设备
:question:根据什么原则授权
:one:集中仲裁方式
:one:链式查询方式
:explode:有人如果要申请总线的控制权的话,总线仲裁部件就会发出一个信号,这个信号按顺序访问每个接口,如果这个接口没有总线请求就下一个接口,如果这个接口有总线请求,那么控制权就给她
:snowflake:有人上课要发言,老师一次走过去问同学是不是你要发言
:star::one:离总线仲裁部件近的优先级高
:two:计数器定时查询
:explode:有人如果要申请总线的控制权的话,总线仲裁部件就会发出一个信号,这个信号从固定地址/上一个响应的设备/按顺序访问每个接口,如果这个接口没有总线请求就下一个接口,如果这个接口有总线请求,那么控制权就给她,并且记录这个设备的地址
:three:独立请求
:explode:有人如果要申请总线的控制权的话,直接通过专门的总线请求线向总线仲裁部件发出请求,然后总线总裁部件会通过专门的总线授权部件发出授权
:snowflake:有人上课要发言,偷偷打电话给老师,老师就知道了
:two:分布式仲裁方式
:question:什么时候会发生争取总线的控制权
:star:设备要获取的总线控制权的话,是要发出总线控制权请求给仲裁部件的
:moneybag:数据传送
:moneybag:DMA
:zap:在外设和存储器中传输数据时,CPU需要一点帮助
:explode:负责外设和存储器间数据传输的
:moneybag:工作方式
:explode:CPU需要在外设和存储器中传输数据时,就设置好DMA里的参数,然后DMA开始根据设置好的参数来完成数据传输
:moneybag:DMA工作期间,CPU在干什么
:zap:DMA要工作是需要总线和存储器的控制权的,所以需要暂停CPU的功能
:one:CPU停止
:two:CPU智能的在DMA等待外设的时候拿回控制权(周期
:three:周期性的,一会儿DMA,一会儿CPU
:star:DMA尽管需要总线和存储器的控制权,但等待外设的时间会比这个长
:moneybag:选择
:dagger_knife:一般方法
:explode:Decoder将地址转化为one-hot的格式,然后唯一确定一根线指向我们要访问的存储器地址
:moneybag:片选信号
:question:什么是片选
:explode:将不同存储单元放在一起,组成一片的存储片.片选信号就是定位这个存储片的
:question:谁是片选信号
:one:高位地址
:explode:将地址的高位作为选择哪个存储片的方法.比如我们共有4个存储片,那么地址的高2位可以用来确定,低位再继续确定存储片中的哪个存储单元
:two:地位地址
:star:如果要读取连续的空间的话,可以马上就取出
:warning:存储单元连在一起的话,反而不能同时访问
:moneybag:存储地址
:star:每个字节有一个地址
:warning:数据传输有多个方式,有:one:1字节 :two:2字节(半字) :three:4字节(字)
:moneybag:动态存储器
:star:断电=>数据丢失
:moneybag:刷新
:explode:因为xx原因就要刷新
:dagger_knife:若干方法
:one:集中刷新
:explode:固定时间对整个存储器进行刷新,这段时间内存储器不能工作,成为"死时间"
:two:分散刷新
:explode:分散进行
:star:读写速度会变慢
:three:异步刷新
:moneybag:刷新周期
:explode:两次刷新的间隔时间
:moneybag:刷新时间
:explode:进行一次刷新的话,这个刷新本身所花的时间
:moneybag:存储方式
:moneybag:大端 vs 小端
:explode::one:大端:高位存放在地址小的字节 :two:小端:高位存放在地址大的字节
:star:如果数据只有1字节,就没大端小端之分了
:tornado:如存储0x12345678,存放在地址10,11,12,13的话,分别是:大端:0x12,0x34,0x56,0x78; 小端:0x78,0x56,0x34,0x12
:recycle:对齐
:zap:存储器本身是按字节存储数据的,但是我们认为其自身也有字的概念(硬件的字),比如说地址0~3,4~7可以理解为存储器的一个字.但是我们存储字大小的数据时,不一定会这样做,比如说在2~5的位置存
:one:对齐
:explode:如果系统访问的字刚好也是硬件的字,就是对齐访问
:two:非对齐
:explode:系统访问的字不是硬件的字的话,就是非对齐访问
:star:需要若干次读写
:moneybag:磁盘:<3:
:recycle:
分类