从内存中访问数据的过程
2015-03-03 21:05
323 查看
本文假定你有一定的计算机组成原理和操作系统方面的知识,这里说的尽量简洁清晰一些,然后要再结合一个例子来具体走一下。
首先要明确,想要从内存中取数据要分两步:1.获得数据在内存的物理地址 2.从内存中取数据 可能乍一看觉得有点像废话,但是这两步必须很清楚,而且这两步涉及的过程差别很大,下面具体说一下。
如何获得数据的内存实地址? 这里我们首先就要把虚拟地址(逻辑地址)进行转化,我以请求分页管理为例,一般说来这里也分为两步:(1) 先查找TLB(快表:为硬件结构,保存有部分内存中页表的内容,目的是提高效率)我们先把给出虚拟地址写成二进制的形式,由页面大小得到页内偏移位数,剩下的是虚拟页号,在这里虚拟页号进一步分为TLB标记和TLB组索引。
由组索引和TLB标记查看有无对应的物理页号及标记位是否为”1”,若存在,把物理页号拼接页内地址得到实地址;若不存在,说明TLB不命中,进入下面一步(2)查找内存中的页表。这里就相对比较单纯了,通过页号及页表寄存器找到相应的页表项,看一下有没有物理页号及有效位是否为“1”,若有,则命中,把物理页号拼接到页内地址即得到实地址;若无,则比较麻烦了,说明内存中没有要找的这个页面,产生缺页中断,需从外存调入。第一部分大体就是如此,具体细节不多说,但是这个过程一定要很清晰!
接下来就是根据地址来访问数据,在开始之前,有必要先给出Cache的工作原理图(摘自课本),该图非常清晰动人,哈哈!
关于Cache还要多说一下,Cache包括了可以对Cache中所包含的存储地址进行跟踪的硬件,也就是说,Cache的总容量包括:存储容量、标记阵列容量(包括有效位,标记位Tag,一致性维护位即脏位,替换算法控制位),每一个Cache行对应一个标记项。总的来说,访问数据也分为两步:(1)先查找高速缓存Cache(内存的部分副本),在根据第一步得到的实地址进行查找时,要了解Cache的几种映射方式,主要是直接映射方式和组相连映射方式,根据不同的映射方式来分析上一步得到的物理地址。一般说来,我们由Cache索引和标志位找到Cache中位置,再查看有效位是否为“1”,即Cache中是否存在要查找的内存地址中内容的副本;若为“1”,即有效,则根据偏移量(字块内地址)取出Cache单元的内容即可。如不在,则要去主存中查找对应的物理地址的内容,至此,一次访存完成。当然了,我这里没有展开细说,像Cache的局部性原理啊,地址映射与变换啊,这些课本都有详细介绍,这两步过程一定要清晰,然后结合具体知识点和例题就更好理解了。(多说一句,在准备考研时王道的《操作系统》参考书第三章最后就有一个很好地例子!)
首先要明确,想要从内存中取数据要分两步:1.获得数据在内存的物理地址 2.从内存中取数据 可能乍一看觉得有点像废话,但是这两步必须很清楚,而且这两步涉及的过程差别很大,下面具体说一下。
如何获得数据的内存实地址? 这里我们首先就要把虚拟地址(逻辑地址)进行转化,我以请求分页管理为例,一般说来这里也分为两步:(1) 先查找TLB(快表:为硬件结构,保存有部分内存中页表的内容,目的是提高效率)我们先把给出虚拟地址写成二进制的形式,由页面大小得到页内偏移位数,剩下的是虚拟页号,在这里虚拟页号进一步分为TLB标记和TLB组索引。
由组索引和TLB标记查看有无对应的物理页号及标记位是否为”1”,若存在,把物理页号拼接页内地址得到实地址;若不存在,说明TLB不命中,进入下面一步(2)查找内存中的页表。这里就相对比较单纯了,通过页号及页表寄存器找到相应的页表项,看一下有没有物理页号及有效位是否为“1”,若有,则命中,把物理页号拼接到页内地址即得到实地址;若无,则比较麻烦了,说明内存中没有要找的这个页面,产生缺页中断,需从外存调入。第一部分大体就是如此,具体细节不多说,但是这个过程一定要很清晰!
接下来就是根据地址来访问数据,在开始之前,有必要先给出Cache的工作原理图(摘自课本),该图非常清晰动人,哈哈!
关于Cache还要多说一下,Cache包括了可以对Cache中所包含的存储地址进行跟踪的硬件,也就是说,Cache的总容量包括:存储容量、标记阵列容量(包括有效位,标记位Tag,一致性维护位即脏位,替换算法控制位),每一个Cache行对应一个标记项。总的来说,访问数据也分为两步:(1)先查找高速缓存Cache(内存的部分副本),在根据第一步得到的实地址进行查找时,要了解Cache的几种映射方式,主要是直接映射方式和组相连映射方式,根据不同的映射方式来分析上一步得到的物理地址。一般说来,我们由Cache索引和标志位找到Cache中位置,再查看有效位是否为“1”,即Cache中是否存在要查找的内存地址中内容的副本;若为“1”,即有效,则根据偏移量(字块内地址)取出Cache单元的内容即可。如不在,则要去主存中查找对应的物理地址的内容,至此,一次访存完成。当然了,我这里没有展开细说,像Cache的局部性原理啊,地址映射与变换啊,这些课本都有详细介绍,这两步过程一定要清晰,然后结合具体知识点和例题就更好理解了。(多说一句,在准备考研时王道的《操作系统》参考书第三章最后就有一个很好地例子!)
相关文章推荐
- 使用数据2分处理的通用分页存储过程 前半部分与后半部分数据访问时间相同,同等访问速度提高一倍
- 我的数据访问层的源代码(四)存储过程部分,包括存储过程的参数
- ADO.NET访问数据-DataSet本地缓存与数据库的交互过程,以及应用
- CPU从内存中读取数据的过程
- CPU从内存中读取数据的过程
- 将 SQL Server 存储过程用于数据访问
- 远程过程调用中间件及数据访问中间…
- ADO.NET访问数据-(2) DataSet本地缓存与数据库的交互过程,以及应用
- Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程
- Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程
- 如何让数据访问过程更透明.
- 存储过程返回的多结果集数据,ado 访问调用
- 驱动开发过程中的内存访问——转载
- ADO.NET访问数据-(2) DataSet本地缓存与数据库的交互过程,以及应用
- SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
- 使用数据2分处理的通用分页存储过程 前半部分与后半部分数据访问时间相同
- SQL 数据存储过程 数据访问 用C#编写
- 通过存储过程访问SQL数据
- PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
- 3.2 应用层与内核的通信方法 :访问数据的I/O方式、读写驱动程序、发送I/O控制码、内存共享