前言:
大家都知道计算机程序的运行采用的是“存储程序”的方式,也就是程序执行时必须将指令和数据放入主存,然后计算机会自动执行。这个过程中会牵扯到很多存储器。
既然有那么多不同的存储器,必然也有一定的体系结构。那么所谓的层次结构存储系统,就是各类存储器按照层次化方式,构成的计算机的存储器整体结构。
(1)按存储元件分类
(2)按存取方式分类
(3)按功能方式分类
(4)按信息可改性分类
(5)按断电后信息可保存性分类
(1)记忆单元:即存储元、位元,存储0或1,构成存储阵列。
(2)存储阵列:即存储体、存储矩阵,是存储器的核心部分。
(3)编址单位:存储器内每一个位元都会被编号,相同地址的位元构成一个编址单位,即一个存储单元。
(4)编址方式:指对存储单元进行编号的方式,如按字节编址(指存储阵列内一个地址中有一个字节的空间)、按字编址。
这里强调一下,
1、地址线的位数决定了主存地址空间的最大可寻址范围,如36位地址线的最大可寻址范围是0~236-1。
(同时MAR宽度与地址线宽度一致)
2、数据线的位数决定了每次最多存取数据的大小,如在字节编址方式下,64位数据线每次最多存取8个字节的内容。
(同时MDR宽度与数据线宽度一致)
(1)存储器容量
(2)存储器速度:访问时间、存储周期、存储器带宽等等
- 访问时间之读出时间T(A):存储器接到命令道信息送到数据线的时间。
- 访问时间之写入时间T(W):存储器接到命令道信息被写入存储器的时间。
- 存储周期:存储器进行一次读写操作所需要的全部时间。
- 存储器带宽B:存储器被连续访问时可以提供的数据传送速率(信息位数或字节数/时间)
(3)价格:这个就不用多说了,不看商业只看技术的话,那肯定是越贵越好。
这里主要介绍半导体存储器。
(1)随机存取存储器RAM(Random Access Memory)
- 静态RAM(SRAM):
1.一个二进位需要6个晶体管;
2.读写速度更快,信息能一直保存无需刷新;
3.功耗大,集成度低,价格贵;
4.一般用于高速小容量的存储器,如高速缓存cache。- 动态RAM(DRAM):
1.一个二进位只需1个晶体管;
2.读写速度较慢,需要定时刷新;
3.功耗小,集成度高,价格便宜;
4.一般用于慢速大容量存储器,如主存储器(内存条)。
(2)只读存储器ROM(Read-Only Memory)
前言里讲过,存储器的层次结构就是各类存储器按照层次化方式,构成的计算机的存储器整体结构。
那么为什么要有层次结构呢,这是因为不同的存储器有其不同的特性和优点,如果有一中存储器既便宜、又容量大、又速度快、还能满足各种特殊需求,那么我们或许就不需要层次结构了,直接把这种存储器往里面塞就行,但这显然是不大可能的。
所以我们需要一种层次结构以协调组织各种存储器,使其能在一定成本范围内完成我们预期的存储与读写效果。
第一节讲各类存储器的特点时提到过动态RAM(DRAM)主要用作主存,那么现在讲讲DRAM作为内存时的主存芯片技术。目前主要使用的是基于SDRAM的芯片技术的内存条,称为同步DRAM。
(1)DRAM芯片技术
(2)基本SDRAM芯片技术:DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM等等,其技术工作过程略显复杂,这里不多介绍。
(1)主存与CPU连接关系如下:
CPU内部总线接口–处理器总线–I/O桥接器–存储器总线–主存
(2)存储器拓展技术:
- 主存可以由多个内存条(内存模块)构成,内存条插槽就是存储器总线,而一个内存条是由多个存储器芯片拓展合成的。
- 多个存储器芯片构成一个存储器时,需要进行字拓展和位拓展。字拓展是单个芯片容量的拓展,位数不变;而位拓展则是将多个存储器芯片构成给定字长的存储器。
- 多个芯片构成的内存条采用交叉编址,芯片内地址是不连续的,即同一行列位置处会同时读写。比如8个8位芯片会在行列交叉点(i,j)处同时读取64位地址。而这读取的片内地址在8片中是相同的,都是指i,j),具体的选片工作会在主存地址的低位地址完成。
- 对于具体存储阵列,设行数r,列数c,那我们设计时一般要使r<=c,并且|r-c|最小。
如一个8片16M×8位芯片构成的128MB内存条,该芯片有8个位平面,行地址和列地址可以是各占12位。则:
- 128MB=212×212×8位(1B)×8片。
- 如果主存只有这一个内存条,则主存地址低3位用于选片,
- 高12+12位分别用于指示片内行地址、列地址。
load 和 store
(1)磁盘存储器的基本组成:
- 磁记录介质:保存信息。
- 磁盘驱动器:读写电路,读/写转换开关、读/写磁头与磁头定位伺服系统。
- 磁盘控制器:控制逻辑、时序电路、并->串转换电路、串->并转换电路用于连接主机和磁盘驱动器。
(2)磁盘驱动器:
- 磁头–盘面:每个盘片的俩面各有一个磁头,磁头号=盘面号。
- 磁道–柱面:多个盘片上的相同磁道形成一个柱面,磁道号=柱面号.
- 扇区:即扇段,每个磁道被分成若干扇区,磁盘读写时是以扇区为单位的,每一个扇区都有一个编号。而对于每一个扇区,有多个间隙、ID域、数据域组成,数据域一般都是512B(现在有趋势至4KB)。
- 磁道编号:读写磁盘时是一次读写一个柱面,然后移到下一个柱面。磁道最外面编址0,是自外向内编址的。
(3)磁盘读写过程逻辑
是磁盘读写的根据,由柱面号(磁道号)、磁头号(盘面号)、扇面号(扇段号)组成。有了盘地址,就可以读写目标磁道中的指定扇区。
- 寻道:磁盘控制器将盘地址送到磁盘驱动器的磁盘地址寄存器,产生寻道命令;启动磁头定位伺服系统,根据盘地址选择对应磁头到对应柱面;寻道结束,磁盘控制器收到信号,进入下一阶段----旋转等待。
- 旋转等待:扇区计数器清零,接下来每一个扇区标志脉冲都会使扇区计数器+1;当计数与磁盘地址寄存器的扇区地址符合时输出符合信号。
- 读写:此时已经确定读写信息就在磁头下,进行写操作或者读操作。
(1)记录密度:
- 道密度:径向单位长度内的磁道数目。
- 位密度:弧向单位长度内的二进制信息数目。
- 有高密度存储和低密度存储之分,高密度存储的外道扇区数多,低密度存储则内外道扇区数都一样。
(2)存储容量
(注:格式化的记录面数约为盘片数的两倍,此时容量为格式化容量)
- 存储容量=记录面数×柱面数×扇区数×扇区字节数
- 如果是低密度存储方式,则:存储容量=记录面数×柱面数×内圆长度×最内道位密度(如果只给出位密度,一般是最内圈位密度,且是低密度存储方式)
(3)数据传输速率(内部传输速率、持续传输速率)
(4)平均存取时间
- 存取时间=寻道时间+旋转等待时间+数据传输时间,而数据传输时间相对很小可以近似忽略。
- 平均存取时间=平均寻道时间+平均等待时间 其中寻道时间一般为5-10ms,可以根据道数和道间移动时间计算; 其中一般为4-6ms平均等待时间就取磁盘旋转半周的时间.
第二节讲到了到了主存域CPU的连接,提到了连接结构:
CPU内部总线接口–处理器总线–I/O桥接器–存储器总线–主存
而磁盘存储器的磁盘控制器就连接在I/O总线上,从而与I/O桥接器乃至整个CPU和主存连接。
用闪存颗粒代替了磁盘作为存储介质。
前面提到过存储器的层次结构,可以看到主存和CPU之间会有一个高速缓存Cache。根据层次结构原理,Cache里存放最可能被频繁访问的程序和数据。
这能大大提高CPU访问内存,而在这一节我们主要介绍Cache的相关性原理和自身性工作原理。
程序指令、数据很多时候都是连续存放的。而在较短的时间间隔内,程序产生的地址往往集中在存储空间的一个很小范围内。通过分析可以得到以下俩个程序访问局部性:
(1)时间局部性:被访问的某个存储单元在一个较短的时间间隔内很可能又被访问。
(2)空间局部性:被访问的某个存储单元的邻近单元在一个较段的时间间隔内很可能又被访问。
(1)主存块,cache行,cache有效位,cache行标记
- 主存块:cache是能和主存互相交换信息的,这就要保证cache和主存空间都被划分为等大的若干区域,以便按区域大小直接信息交换。其中主存中的区域称为主存块(简称块),信息交换以此为单位。
- cache行:cache的信息来自主存块,其中存放一个主存块的区域称为cache行(槽)。
- cache有效位:无信息时cache行是空的,具体标记形式是设立一个有效位(valid bit),有效位清0则意味着该cache行内信息无效、已被淘汰,置1则表示有效主存块装入。
- cache行标记:cache行内除了有效位,还有标记位,与接下来要讲的映射里的主存地址的标记位对应,用作映射匹配。
(2)Cache访问过程
(3)Cache-主存的平均访问时间
相关概念:
- cache命中-命中率p
- cache不命中-缺失率
- 命中时的访问时间:即命中时间,cache访问时间T c c c
- 不命中时的访问时间:读取主存块到cache的时间 主存访问时间T m m m+cache访问时间T c c c,其中T m m m称为缺失损失。
最后得到平均访问时间:
T a a a = p×T c c c + (1-p)×(T m m m+T c c c) = T c c c + (1-p)×T m m m
前面讲了cache访问的一些过程和相关时间概念。但现在有一个问题:
当我们要去访问某个主存单位时,要去哪个cache里面搜寻呢?或者说当我们要将某个主存块复制到cache中时,要怎么选择cache行呢?
这里就要讲到cache行和主存块的映射方式:
(1)直接映射(模映射):
如果无命中,则将主存块复制至对应cache行,设置有效位和标记位(此时标记指示在哪一个快群)
(2)全相联映射:
(3)组相联映射:
直接映射和全相联映射都各有其优缺点,前者容易过多的调进调出,而后者的搜寻开销大。两者结合取长补短就产生了组相联映射:
(1)先进先出算法(FIFO算法):
- 替换掉最早装入cache的主存块。
(2)最近最少用算法(LRU算法):
- 替换掉近期最少使用的主存块。
- 每一个cache行有一个计数器,计数值称为LRU位,越小越常用,被访问时置0。
(3)最不经常用算法(LFU算法)
- 替换掉cache行中引用次数最少的块。
- 与LRU类似但不完全相同。
(4)随机替换算法
- 随机替换,事实证明性能还可以,主要是代价很低。
cache行中的内容时来自主存块的副本,我们在写操作时也得更新cache,这里涉及到cache–主存一致性的问题。(当然,一致性问题在其他的一些情况也会涉及到,比如共享主存)。
总之,为了处理好cache一致性问题,那么关键在于处理好写操作。
(1)全写法
- 写命中时,即要写的内容就在cache内,则同时写cache和主存。
- 写不命中,则进行写分配法(更新主存并分配cache行装入)或者非写分配法(通写法和直写法)。
(2)回写法
- 只写cache不写主存,若缺失则将主存块调入cache中并更新cache。
- cache被替换时才将主存块内容一次写回。
- 会出现cache和主存不同步,通常由其他同步机制进行保证。
程序的性能指程序执行所用的时间,很大程度上体现在指令数据的访问时间上,而这几乎由cache命中率决定。这就要求我们的程序有良好的访问局部性。
计算机系统在运行程序时不是单纯地拿着主存的物理地址去进行指令、数据操作的。每一个程序通常会有一个独立的巨大虚拟存储空间,这样编写程序时就不会有物理内存的大小约束了。
可以理解为程序员在虚拟地址空间内编程,而程序实际运行时会有一套机制去到真正的内存内操作。
就好像cache与主存间的关系一样,虚拟存储空间也会有交换块大小、映射、替换、写一致性等等问题需要考虑。
每个进程都会对应一个结构相同,空间一样的虚拟地址空间映像。
(1)内核空间:用以存放操作系统内核代码和数据等,内核代码区和数据区在每个进程的地址空间中都一样。用户没有权限访问内核空间
(2)用户空间:用以给用户存放进程的代码和数据等。
主要介绍分页式虚拟存储器
(1)分页:
(2)页表:
页表是一张存放在主存中的虚页号和实页号的对照表,记录着程序的虚页调入主存时被安排在主存中的位置,且页表一般长久的保存在内存中。
进程的每一个虚拟页都在页表里有一个对应的页表项,有如下内容:
- 装入位:即有效位和存在位,“1”表示对应页面在主存,该虚拟页已从外存调入主存,是一个“缓冲位”。
- 修改位:即脏位,说明页面是否被修改过。修改过的话被替换时会写回磁盘。
- 使用位:说明使用情况,用来配合替换策略。
- 访问权限位:说明权限,用于存储保护。
- 禁止缓存位:说明是否可以装入cache,保证存储器一致性。
- 虚拟页的存放位置:若装入位为“1”,表示 主存物理页号(页框号);
若装入位为“0”:则该字段要么是虚拟页在磁盘上的地址,表示虚拟页面是一个未缓存页,
要么是null,表示虚拟页面是一个未分配页。
(3)地址转换:
这里的地址转换指将虚拟地址转换为主存物理地址,由CPU内的存储器管理部件MMU完成。
虚拟地址和主存物理地址都由页号和页内偏移地址组成,后者俩者一样,前者根据页表项关联,当我们知道了虚拟地址后,作如下转换过程:
(4)快表:
上述过程都需要从主存中查页表并且做各种后续操作,访存次数会变多,相对于主存中的页表(可以称为慢表),我们可以将活跃页表项复制到高速缓存内,形成快表TLB(后被转换缓冲器)。
TLB很小,表项是TLB标记+慢表项,标记表示该表项来自哪一个虚拟页。
----完结撒花 :: 2021/1/3,01:37