cache与MMU与总线仲裁
为了以合理的价格,设计容量和速度满足计算机系统的需求,计算机体系结构设计者设计出了存储器的层次结构。
“Cache-主存”和“主存—辅存”是最常见的两种层次结构。
常见的集中cache hierarchy的size与access time:
计算机运行的任何时刻都存在多个进程,每个进程都有自己的地址空间。如果为每个进程分配全部的地址空间,那系统的开销太大,而且很多进程也只是使用该地址空间内的一小部分。
虚拟存储器一种存储器共享技术,把物理内存的一部分拿出来让很多进程共享。且有一套保护机制,保证一个进程只能访问自己的内存块。虚拟存储技术也可以减少程序启动时间,
因为程序启动前没必要将所有代码和数据都加载入内存。
虚拟存储器的特点:
1) 多个进程共享主存空间,主存空间以页/段为单位,分配给个进程。
2) 自动的对存储系统进行管理,减轻了程序员负担。(不用担心空间越界的问题)。
3) 动态加载,程序可以在需要的时候方便的载入主存的任何一个位置。
分段,以程序的逻辑意义进行划分,分为代码段,数据段,堆栈段等。
分页,以虚拟存储器的空间来进行划分,4k~64k
MMU完成虚拟内存地址到物理地址的转换,虚拟存储器的必要部件。
在多处理器,为了支持多用户多任务的操作系统,必须支持虚拟存储器。
MMU的地址映射是分级操作的,每一级的表项都指向下一级页表的地址,最后一级上的每一行叫做地址变换条目,来完成映射。
每一行的地址变换条目中都包含一些控制位和访问权限等信息(如是否cache等信息),但是每次从几级页表中读取地址变换条目会有点慢,
所以存在一种快速变换列表(TLB),每次的地址映射先从TLB中查找变换条目,cache miss也会产生加载动作。
只有在访问存储器时,才会有地址映射的变换。在普通的CPU读写操作中,一般都是在cache中完成的。
MMU一般放在CPU和Cache旁边的,只在读写cache miss的情况下,才会启用MMU
Cache是按块进行管理的,Cache和主存被分割成大小相同的块,信息以块为单位调入Cache,CPU访问内存分为两部分,块地址和块内地址。
由于主存的容量远大于Cache的大小,所以说数据从主存到Cache存在一个映射问题。
1) 全相联映射(full associative),主存中的任何一块都可以放在Cache的任何一个位置。主存映射灵活但是CPU的检索会比较慢。
2) 直接映像(direct mapped),主存中的一个块只能放在Cache中的唯一的位置。主存的第i块,Cache的第j块,则j=I mod(M),M为Cache块数
3) 组相连映像(set associative),主存中的每一块都可以被放置到Cache中的唯一的一个组的任何位置。直接映像和全相连映像的折中。
Cache中有一个目录表,该表中包含的项数与Cache中的相同,每一项对应Cache中的一个块,记录了该主存块的高位部分(tag)。每一组中,主存块可以由其tag唯一的来确定。
Cache的更新情况:
1) Read cache miss时,需要从主存中奖数据读出。
2) CPU需要将数据写入Cache。其中的写策略有:write-through,不仅将数据写入Cache,同时写入主存中。
Write-back,只将数据写入Cache,在发生Cache替换的时候,才写入主存。
在读写都miss的情况下,还有read alloacted和write allocated策略。
Cache替换方法:
1) 随机法,不考虑程序局部性,效率较低。
2) 先进先出法,有点容易实现,但是反应不了程序局部性。
3) 最近最少使用方法(LRU),实现较困难,但是可以反映程序局部性。
在集中式的共享存储器体系结构中,每个处理器都有自己的高速缓存,所以cache中的数据,存在一致性问题。具体可以分为两个方面:
1) 高速缓存一致性(coherence),定义了读操作可以返回怎样的值。
2) 存储器一致性(consistency),定义了写入的数据,何时进行读操作。
解决cache一致性问题的方案:
基于总线监听(Bus Snooping)的MESI方案,对cache的访问以cache line为单位,一个cache line通常为32/64字节,MESI给每个cache line定义一个一致性状态:原理简单,易于实现,软件透明
[M]:Modified状态,表示该cache line中数据经过修改,是系统中唯一正确的数据,其他处理器cache全部失效,读操作直接由本处理器cache提供数据,
(同一数据在各个Cache中,只可能有一个Cache中的状态是[M])
[E]: Exclusive状态,该cache line是系统中唯一与主存一致的数据,其他处理器cache全部失效,对数据的读操作,可以由主存/cache提供,写操作,状态从[E]改为[M]。
[S]:Shared状态,该处理器的cache与其他处理器的cache处于共享状态,可以直接cache read,但是写操作,应该是write-through,状态改为[E]。
[I]:处于该状态的Cache行无效,对处于[I]状态的数据进行读操作,会发生cache miss。
MESI状态除了受本地处理器存储操作的影响外,共享总线上的其他处理器的读写操作也会改变共享数据的性质,改变本地Cache的MESI状态。
本地处理器的读写操作对MESI状态的影响:
读命中时,Cache line的状态只能是[M],[E],[S]的,直接由cache提供数据。
读不命中时,数据不在cache或者cache line状态是[I],总之是要访问存储器,首先,查询Cache 目录表,某个Cache中处于[M]状态,则更新主存,再从主存中读取数据,
更新状态为[S],如果本身cache line状态是[I],更新状态为[S]。
写命中,处于[M],[E],[I]的Cache line,直接更新本地Cache,处于[S]状态的Cache line,修改主存,更新Cache line状态为[E]
写不命中,更新主存,Cache line各行不变。
其他处理器对MESI状态的影响:
当在其他Cache中发现,处于[M]状态的Cache line时,表示主存中的数据已经”失效”,监听模块将暂时占用总线将[M]中的Cache数据写入主存中,
此次的总线使用权不经过总线仲裁,回写完毕后,直接将总线使用权交给主模块。同时将监听模块的Cache line的专题改为[S]
如果监听命中了处于[E],[S]的Cache line,直接将更新该处理器的Cache line,并将状态改为[S]
如果主模块出现了写存储器操作,则监听模块将所有监听命中的Cache line改为[I]状态。
监听Cache协议存在一定的局限性,它只适用于由总线互联的多处理器系统,受总线带宽和Cache本身工作效率的影响,这种系统所接的处理器数目不能太多,一般在10个左右。
在互联网络型多处理器系统中,Cache一致性不是向所有的Cache广播,而是通过查找目录表,可以知道某共享数据块副本所在的所有的Cache,
直接向这些cache发出一致性命令,克服了对处理器数目过低的限制。
Tang实现方法:允许未经修改的数据存在多个Cache中,但是经过修改的数据块只能存在一个Cache中。Cache内的每一个Line都带有一个修改位。
各个Cache的全部修改位,集中记录在主存的一个集中式目录表中。
写命中时,如果该Cache line的修改位已经有效,则直接写入。否则修改集中目录表中记录,并作废其他Cache中的副本。
写不命中时,首先搜索集中式目录表,若另一Cache中有修改过的Cache line,直接写入主存,再从主存中,write allocate。
若另一Cache中没有修改过的Cache line,副本全部作废后,由write through和write back来确定接下来是先写入Cache还是直接写入主存。
由cache coherence带来的主存的读写,与write through/write back这样策略独立。
两种解决cache coherence的方案:
1)处理器写数据项之前,保证该处理器的独占访问;
2)写入数据时,更新该数据的所有副本。
总线监听法和目录法都可以实现这两种策略。(这两种方法的本质区别不是很明白)
MMU与Cache和CPU之间的位置关系。
如果MMU在Cache和CPU之间,那每次的Cache操作都必须先经过虚实地址的转变;降低了cache的效率,Cache中存放物理tag
如果MMU在Cache和BUS之间,Cache中存放虚拟tag,在miss的情况下,需要到MMU进行addr transfer。
http://www.cnblogs.com/-9-8/p/5921052.html
由于virtual address与physical address不是一个对应的关系,所以:
在Cache中同时存放物理tag和虚拟tag,MMU放在旁路,Cache可以正常的读操作,写操作,以及总线的snooping操作,只有在
读写失效的情况下,启用MMU单元。这样解决了虚拟存储器和bus snnoping的问题。称为双TAG的数据CACHE
cache与MMU与总线仲裁的更多相关文章
- [国嵌笔记][036][关闭MMU和CACHE]
关闭MMU和CACHE 1.Cache是一种容量小,但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝.按功能分为ICache(指令Cache)和DCache(数据Cache) 2.虚拟地址 ...
- u-boot分析(五)----I/D cache失效|关闭MMU和cache|关闭看门狗
u-boot分析(五) 上篇博文我们按照210的启动流程,对u-boot启动中的设置异常向量表,设置SVC模式进行了分析,今天我们继续按照u-boot的启动流程对以下内容进行分析. 今天我们会用到的文 ...
- MMU内存管理单元
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及 ...
- [转帖]MMU内存管理单元
MMU内存管理单元 https://www.cnblogs.com/alantu2018/p/9002309.html 之前对这一块一直不理解 最近学习了点 CPU time slice 以及 con ...
- 第七章 内存管理单元MMU介绍
7.1 内存管理单元MMU介绍 7.1.1 S3C2410/S3C2440 MMU特性 负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查 特性: 与ARM V4兼容的映射长度.域.访问权 ...
- MMU讲解
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制 ...
- s3c2440之cache
cache高速缓冲存储器注意与块设备页高速缓存进行区别,一个是硬件的实现一个是软件的实现,块设备页高速缓存. s3c2440/s3c2410里面主要有一个arm920t的核,但同时包含几个协处理器,协 ...
- Cache基础知识OR1200在ICache一个简短的引论
以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 12.1 Cache基本知识 12.1.1 Cache的作用 处理器的设计者通常会声称其设计的处理器一秒钟能做多少次乘 ...
- 转 s3c2440硬件学习----内存管理单元MMU
本篇基本是韦东山书上的 一.内存管理单元MMU介绍 内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查.MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访 ...
随机推荐
- Shader实例:边缘发光和描边
效果图: 1.边缘发光 思路:用视方向和法线方向点乘,模型越边缘的地方,它的法线和视方向越接近90度.点乘越接近0 那么用 1-减去上面点乘的结果,来作为颜色分量,来反映边缘颜色强弱. Shader ...
- c#使用多线程的几种方式示例详解
本文转载自:http://www.jb51.net/article/46234.htm 本文章主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧 (1)不需要传递参数 ...
- table常用功能总结
1,设置表格边框为单线框 table, th, td { border: 1px solid blue; }加上:table { border-collapse:collapse; } 由于 tabl ...
- [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系
学习了一下ios,把一个基本的概念搞清楚了,在android或者wp中,大家基本都是习惯与一个画面场景代表一个类,新建场景的时候自动新建了类,但在ios中使用了storyboard之后发现,在stor ...
- word页码上加横线&&word删除单页页眉
word(2010)页码上加横线 插入——>页脚(选择年刊型)——>如图 然后拖住“竖条条”将页码拖到正中间——>点中页脚右击——>选中“表格属性”——>“边框和底纹”— ...
- Oracel EBS - Search Report by Response & Group
- 从零开始编写自己的C#框架(3)——开发规范(转)
由于是业余时间编写,而且为了保证质量,对写出来的东西也会反复斟酌,所以每周只能更新两章左右,请大家谅解,也请大家耐心等待,谢谢大家的支持. 初学者应该怎样学习本系列内容呢?根据我自己的学习经验,一般直 ...
- Mysql5.6主从热备配置
数据库是应用系统的核心,为了保证数据库的安全采用主从热备是很常见的方法,也就是主数据库DDL.DML都将被同步到从数据库. 一. 实验环境 操作系统:windowsserver 2008 R ...
- grpc例子
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...
- 关于BeanUiles.copyPropertis()的用法
最近的项目遇到BeanUiles.copyPropertis(),大大的简化了代码量.用hibernate从数据库中映射的实体类,与pojo对象进行转换,传统做法 Object obj = baseD ...