博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主存与Cache的地址映射
阅读量:4141 次
发布时间:2019-05-25

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

主存与Cache的地址映射

       由于Cache比主存小的多,因此必须使用一种机制将主存地址定位到Cache中,即地址映射。这个映射过程全部由硬件实现,对程序员透明。

       1. 地址映射方法:

       采用查表法(用专用快速硬件实现表格)

       表中内容:映射的Cache地址、标记(命中判断)、有效位

       2. 的三种方式:        (1)全相联映射方式:

          灵活,但映射函数复杂,不易实现。
       (2)直接映射方式:  
          映照简单,不需计算,快速,但效率不高,易颠簸;。
       (3)组相联映射方式: 
          组内全相联映射,组间直接映射

       (1)        · 任一主存块能映射到Cache中任意行(主存块的容量等于Cache行的容量),见图1:

       · 映射过程:(见图2)

       ① 存入Cache:块表标记中存放主存的块号

 
       ② 检索:访问主存地址的块号与所有Cache行标记比较(图2阴影区)

       · 符合, 即数据在Cache中,形成访问Cache的地址(地址映射),访问Cache;

       · 不符合:访问主存,并将该块调入Cache。

       · 优点:灵活,不易产生冲突;

       缺点:比较电路难于实现,且效率低,速度慢。

      

      

       例:设访问存储器地址的块号序列为22、26、22、26、16、4、16、18,采用全相联映射方式时,Cache行分配情况(见图3)。

      

       全相联映射方式实例演示

       (2)

       直接映射方式实例演示        · 某一主存块只能能映射到Cache的特定行,见图4:

       i = j  mod m    其中: i:Cache的行号; 

       j:主存的块号; 
       m:Cache的总行数。

       · 映射过程:(见图5)

       ① 存入Cache:快表标记中存放主存地址的区号

       (将块地址分为二部分:· 块(行)地址 · 标记(区号))

       ② 检索: 根据访问主存地址的中间字段(行号),找到Cache快表中的这一行,读取该行中的标记字段与主存地址高位字段(区号)比较(图5阴影区)

       · 符合:即数据在Cache中,形成访问Cache的地址(地址映射),访问Cache; 

       · 不符合:访问主存,并将该块调入Cache。 
       · 优点:硬件简单,成本低;
       缺点:容易产生冲突,易"颠簸",不能有效利用Cache空间。

       颠簸:例:频繁访问主存地址块序列0、m、0、m,则Cache中  第0行信息只能频繁调进调出,即出现颠簸现象。

      

       例:访问存储器地址序列为22、26、22、26、16、4、16、18,采用直接映射方式时,Cache行分配情况(见图6)。

      

       (3) 

 
       组相联映射方式实例演示        组相联映射方式   是全相联映射方式和直接相联映射方式的结合,结合两者的优点

       · 方法:把Cache分为若干组,每组含有若干行。

       组间直接映射,组内全相联映射。 (图7)

       · 映射过程:(见图8)

       ① 存入Cache:快表标记中存放主存地址的区号及块号(将块地址分为三部分: · 块(行)地址· 组号· 标记(区号))

       ② 检索: 根据访问主存地址的第二字段(组号),找到Cache中的相应组,读取该组中的每一行标记字段与主存地址高位字段(区号)及块号比较(图8阴影区) 

       · 符合:即数据在Cache中,形成访问Cache的地址(地址映射),访问Cache; 
       · 不符合:访问主存,并将该块调入Cache。

       · 优点:结合上面两种的优点。

       ① 因为组内行数较少,比较器容易实现;

       ② 组内又有灵活性,冲突大大减少。

      

      

       例1:设Cache有8个行,分成2个组,设访问存储器地址的块号序列为22、26、22、26、16、4、16、18,采用组相联映射方式时,Cache行分配情况(见图9)。

      

http://hi.baidu.com/ghoul0813/item/08d1cf7390863d2a5d178941

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

你可能感兴趣的文章
tars源码漫谈第20篇------tc_mysql.h/tc_mysql.cpp(mysql API的封装)
查看>>
tars源码漫谈第21篇------tc_http.h/tc_http.cpp(http相关操作)
查看>>
tars源码漫谈第22篇------tc_buffer.h/tc_buffer.cpp(内存操作封装)
查看>>
tars源码漫谈第23篇------tc_buffer_pool.h/tc_buffer_pool.cpp(内存池操作)
查看>>
tars源码漫谈第24篇------tc_lock.h(基本锁)
查看>>
tars源码漫谈第25篇------tc_thread_rwlock.h/tc_thread_rwlock.cpp(读写锁)
查看>>
如何用matlab启动.exe文件?
查看>>
11 22 33 45 _?
查看>>
sql语句缺少倒引号导致的问题
查看>>
理解Go语言的nil
查看>>
go语言如何从终端逐行读取数据?------用bufio包
查看>>
go的值类型和引用类型------重要的概念
查看>>
深入剖析H.264的1/2像素(无代码,无真相,彻底弄清分数像素)
查看>>
判断两棵二叉树是否相等
查看>>
求二叉树中结点的最大值(所有结点的值都是正整数)
查看>>
用go的flag包来解析命令行参数
查看>>
来玩下go的http get
查看>>
感受一下go协程goroutine------协程在手,说go就go
查看>>
队列和栈的本质区别
查看>>
matlab中inline的用法
查看>>