目录
- 存储器的层次结构
- 外存(辅存)
- 内存
- CPU的寄存器
- Cache
- 总结
- 举例
- 局部性原理
- 练习题
- 高速缓存Cache
- 总结
- 举例
- 总结
- 练习题
- Cache的地址映像方法
- 直接相联映像
- 全相联映像
- 组相联映像
- 练习题
- Cache替换算法
- Cache页面淘汰算法
- Cache的读写过程
- 练习题
- 磁盘
- 总结
- 固态硬盘
- 练习题
存储器的层次结构
外存(辅存)
我们接触比较多的存储器:电脑的硬盘,转移文件的U盘,光盘,移动机械硬盘,使用NAND芯片的SSD固态硬盘。这些都属于外存(辅存),主要是存放当前不参加运行的数据,在需要的时候再调度到内存,这个调度过程是由软件和硬件结合实现的。
内存
内存可以理解为集成在我们主板上属于主机部分的存储器。这种存储器我们把它叫做主存,主要用来存储当前运行所需的程序和数据。它相对于外存,速度更快一些但是容量更小一点。比如:我们买手机看到的8GB+128GB。这里的8GB就是我们的内存,而128GB就是外存。
内存(主存)特点:有DRAM或者RAM构成,切断电源之后,丢失所储存的数据。比如:我们的电脑卡死机或者手机卡住了,那么我们常用的方法就是电脑直接重启或手机清一下内存。电脑重启后会掉电,那么内存当中的所存储的数据就会被清空,我们再打开我们想运行的程序的话,程序和数据就会重新被加载到内存当中来。
相对于RAM,我们常听到的还有一种ROM存储器(Read-Only Memory只读存储器),这种存储器掉电后,数据不会丢失。我们电脑当中哪些数据是存放在ROM当中的?典型的就是开机引导程序BIOS,他就存在ROM存储器当中,掉电不会丢失
CPU的寄存器
CPU的寄存器读写速度最快,但是存储容量是最小的,存储单位一般都是byte。比如32位计算机存储容量是32比特位。
那CPU的寄存器和内存相比,速度和容量的差距是非常大的。那么速度和容量不匹配怎么办?我们可以在中间插入一个折中的存储器,速度是两者的折中,容量也是两者的折中,从而去解决CPU与内存不匹配问题
Cache
Cache也叫高速缓存。我们目前在考试当中提到的缓存一般就是cpu的寄存器和内存之间的高速缓存。其实我们每一级或者两级之间都可以插入缓存,比如外存和内存之间也可以插入缓存。
cache这种寄存器,它的组成用的是SRAM相联存储器。
特点:按内容存取。
工作原理:把数据和数据的某一部分作为关键字,按顺序写入信息。读取的时候,并行的将该关键字与存储器中的每一个单元进行比较。找出存储器中所有与该关键字相同的数据字。它特别适合于信息的检索和更新,cache一般就是采用这种SRAM相联存储器。
我们知道内存也是主存,它与外存之间的交互是由软件和硬件结合来实现的,那么cache和储存之间的交互,它是完全由硬件来实现的。–历年考过
总结
整个存储器的层次结构里面有很多的存储器,这些存储器可以分成各个层次。速度、容量、成本它是不一样的。那由于这种速度,容量和成本它们之间的一个平衡关系,所以才有了我们的层次化存储结构。
举例
有这样一个场景:
玩游戏对吧,或者是看那种高清的四 k 电影。那么我们的游戏是安装在哪里?或者我们的高清四 k 电影是放在哪里? 通常是放在电脑的硬盘里的,也就是外存或者辅存当中。
那最终是由谁来调用?或者说谁来执行?只有 cpu。可是我们 cpu 里面的寄存器的容量非常小。他一定是放不下我们的整个游戏程序,或者是我们的一整部电影的。而我们的内存也不可能把我们的这个整个游戏或者是电影都放到内存当中来它。只会用到哪一部分就去加载哪一部分。调用什么就去加载什么。那么我们为什么可以做到用什么就去加载什么? 或者说用什么就去调什么呢?因为在这个过程当中,它有局部性原理的支撑。
局部性原理
所谓的局部性原理,它指的是程序在执行的时候,会呈现出局部性的规律。也就是说在某一段时间内,整个程序的执行,它仅仅是限于程序当中的某一个部分,相应的执行所访问的存储空间也局限于某一个区域。具体来说,局部性通常它有两种形式,一种是时间局部性,另一种是空间局部性。
所谓的时间局限性,它指的是被引用过一次的存储器的位置在未来还会被多次引用。通常它是在循环当中,比如说for循环。
所谓的空间局部性,它指的是如果一个存储器的位置被引用,那么将来它附近的位置很有可能也会被引用。这个就是局部性原理。
那在我们的存储器的层次结构当中,哪些存储器我们是可以操作的,我们首先看外存,它一定是可以操作的,因为我们会往外存当中存放文件。 安装程序很多也是安装在外存内存,它是程序员可以用代码去指定内存的地址,也是可以进行操作的。寄存器可以用汇编语言来操作里面的内容。唯独cache他对程序员来说是透明的。也就是那不可操作的。
以上就是我们存储器的层次结构所涉及到的内容。这部分内容在考试当中一般也就是以选择题的形式出现,偶尔可能会考个一分。
练习题
在程序的执行过程中,Cache与主存的地址映射是由()完成的。(2017下半年试题
A.操作系统
B.程序员调度
C.硬件自动
D.用户软件
答案:C
高速缓存Cache
这部分的内容在我们的考试当中同样也是以选择题的形式出现,分值也就是1分。
Cache就是我们提到的 cpu 与主存之间所存在的高速缓存。它可以去解决cpu 与主存之间速度容量不匹配的问题。这个问题我们也通常把它叫做冯诺伊曼瓶颈,现在的主流的计算机基本都是冯诺伊曼结构。
在计算机发展的过程当中就会发现 cpu 的处理速度越来越快。而存储的速度,反而有些跟不上了。所以我们就在CPU和主存之间加上了Cache,从而提高 cpu 与储存数据的交换速率。最终可以提高计算机的整体效率。
那么针对开始而言,在整个存储体系当中,它是除了 cpu 中的寄存器以外,访问速度最快的层次。并且在整个存储系统当中,程序员是无法对开始进行操作的。也就是说对程序它是透明的。
Cache与主存之间相关的一些地址映射也都是由硬件来直接完成的,与程序而是无关的。
在我们当前的计算机当中,设置了是多级高速缓存Cache。分为一级Cache,二级Cache和三级Cache。
cpu 访问储存的时候,他首先会查找一Cache。
如果要访问的数据或者是指令在一级Cache当中没有被命中,那么才会访问二级Cache。
如果在二级Cache当中也没有命中,那么再去访问三级开始。以此类推,直到所有级别的Cache都不命中,才会去访问主存。
通常会要求一级Cache的速度要足够的快到什么程度?要能够赶上 CPU 的主频。
如果开始分为两级的话,那么一级Cache的容量一般都会特别的小,大概也就是几千字节。而二级Cache相对于一级开始来说,容量可能会高一点,但也不会太大,一般也就是到几M之间。
我们之所以要设置多级高速缓存,就是为了提高 cpu 访问Cache的命中率,或者说是为了提高 cpu 访问主存数据或者指令的效率。
那么Cache为什么能够改善我们的系统的整体性能?主要是由于有程序的局部性原理的支撑。
那什么是程序的局部性原理?它是指程序在执行的时候会呈现出局部性的规律,也就是说在一段时间以内,整个程序的执行仅限于程序当中的某一部分。而相应的执行所访问的存储空间也局限于某个内存的区域。具体来说,局部性通常有两种形式。一种是时间局部性,另一种是空间局部性。
所谓的时间局部性是指被引用过一次的存储器位置在未来会被多次引用。它通常体现在for循环当中。
另一种空间局部性是指如果一个存储器的位置被引用,那么将来他附近的位置也会被引用,主要体现是顺序执行的过程。
总结
- Cache位于CPU与主存之间
- Cache对程序员来说是透明的
- 设置多级高速缓存Cache以提高命中率(访问主存的效率)
- 使用Cache改善系统性能的依据是程序的局部性原理
- 时间局部性:
被引用过一次的存储器位置在未来会被多次引用,
主要体现是主要是循环。 - 空间局部性:
如果一个存储器的位置被引用,那么将来他附近的位置也会被引用,
主要体现是顺序执行的过程。
- 时间局部性:
举例
看以下代码:求数组arr中各个元素的和。
int[]arr={1,2,3,4,5};
int sum =0j
for (int i=0;i<arr.length;i++){sum +arr[i];
)
System.out.println("数组中的值的和为:"+sum);
那么根据代码以及局部性的定义可以知道:
对于for循环当中的sum变量,它有良好的时间局部性。为什么这么说呢?因为在for循环之前,每次执行循环体都会对sum进行访问。而sum没有空间局部性,那是因为sum是一个变量。也就是说sum这个地址只能找到一个值,所以说sum没有空间局部性。
那么对于循环体当中的数组arr变量,它具有良好的空间局部性。因为数组arr他是按顺序放到内存当中的。比如数组arr里面有五个数据,它在存储当中也是按照顺序进行存储的。我们每次访问数组中的第i个元素,它一定在数组当中的第i-1元素的下一个位置即arr[i]在arr[i-1]后面位置。而数组arr没有时间局部性,因为在循环体当中,数组中的每一个元素i,它只会被访问一次。
总结
在for循环中,循环体内的指令多次被执行,所以有良好的时间局部性, 循环体中的指令是按顺序执行的,有良好的空间局部性
也就是说局部性原理当中的时间局部性它主要对应的是for循环。而空间局部性主要体现的是顺序执行。
练习题
在CPU内外常设置多级高速缓存Cache其主要目的是()。(2019下半年试题)
A. 扩大主存的存储容量
B. 提高CPU访问主存数据或指令的效率
C. 扩大存储系统的容量
D. 提高CPU访问外存储器的速度
答案:B
Cache的地址映像方法
Cache它本身就是高速缓存,是为了解决主醇与 cpu 之间速度容量不匹配的问题。
我们在处理这个过程当中,会将主存的内容复制到Cache当中,方便 CPU 就近进行访问,从而提高计算机数据存取的效率。
我们要将主存的内容复制到 Cache 里面去,显然主存它是比较大的,比如说我们现在的主存者内存,一般它的容量都是8G/12G/16G。而 Cache比较小,一般只有 k 的级别,或者是M的级别。
这样主存里的内容能不能全部复制到开始当中?显然不可能。我们一般也不会把Cache做得这么大。毕竟Cache的造价很贵,如果开始做这么大的话,性价比就会高。
所以我们会将主存里面的一部分内容调入到Cache当中,这个调入过程是按一个一个的比特位还是一个一个的字这样的形式来调入?这显然太细致了。计算机一般是按照页
或块
方式进行调入的。
那么什么是页或者块?我们会把 Cache 和主存分成大小相同的存储区域,这种区域就叫做页或者块。我们按页或者块来调用的过程当中,会形成一个地址映射关系,某一个储存的页或者块,它在Cache始当中应该处于什么样的位置。那这就是Cache的地址映像方法。
我们了解到主存与Cache之间的映射是由硬件来完成的,但是程序显然不知道的。其实Cache本身对程序员来说就是透明的,看不到的。所以我们在这里首先了解有这么一个特性。
那这种映射的关系有没有规律?有,主存与Cache的地址映射关系过程当中,我们有三种映射方法可以选择。分别是直接相联映像、全相联映像和组相联映像。
直接相联映像
主存的块与Cache块的对应关系是固定的。也就是说它会将主存划分成与Cache大小一致的区域。比如说它有0号区、1号区、2号区… n 号区,那么每一个区域与Cache都有相对应的关系,大家都有0号区域。每一区域的0号页,只能放在Cache的0号页位置,那这种映像的方式就叫做直接相联映像。
我们想一想,如果说一个 Cache里面有多个页面,只有0号页放了数据,其他页面都是空的,但是我们恰好想要再放一个0号页的位置。其他区域的0号页进去会怎么样?它所对应的能够放置的位置是有数据的。我们把这种情况叫做冲突。
冲突了怎么办?这就可能涉及到页面需不需要淘汰掉的问题。那这个过程当中我们会发现,如果说它是直接相连映射的方式,页面它的放置位置相对来说就比较固定,这也就导致它的冲突率非常的高。灵活性也会比较差。每一次产生冲突我们就要考虑淘汰和新的调入,非常的耗时间。
那么直接相连映像它有没有优点?有的,它的硬件电路设计、地址变换比较简单。但是就像我刚刚讲到的,它的缺点也很明显:冲突率较高、灵活性差
那有没有更好的方式来解决冲突率高的这个问题?有,全相联映像
全相联映像
主存与Cache均分成大小相同的块,允许主存的任一块可以调入Cache存储器的任何一个块的空间中。
也就是说,全相联映像就不再考虑区域中每一个页面的相对位置问题了。我们所有的0号页、1号页还有 n 号页都能够放置到Cache的0号页位置。只要有一个空间是空闲的,我们就能放进去。所以这种情况下它的冲突率就会非常的低,并且主存的块要调入Cache的位置,它是不受限制的,十分的灵活。
但是以上这些优点它也是有代价的,最明显的就是其电路难于设计和实现,只适合用于小容量的Cache;无法从储存块中直接获取Cache的块号,变幻也比较复杂,速度也比较慢。
组相联映像
是前面两种的折中
将Cache中的块再分成组,组采用直接映像方式而块采用全相联映像方式。即主存任何区的0组只能存到Cache的o组中,1组只能存到Cache的1组中,依此类推。组内的块则采用全相联映像方式,即一组内的块可以任意存放。即主存一组中的任一块可以存入Cache相应组的任一块中。
换一种理解方式就是它会先分区,在区域内分组之后,主号与Cache的主号是对应的或者说主号与主号之间之以直接相联的方式来处理的。而主内有多个页的话,里面内部的对应关系是以全相联的方式来进行连接的。在这种情况下,组相联映像它的电路复杂程度还有冲突率,都是直接相联和全相联二者的折中。
对于这三种映像方式,具体的电路实现是不需大家去掌握的,在以前的考试当中会有对主存和Cache地址转换的求取,但在这几年的考试当中,这一部分已经逐渐的消失了。我们只需要了解这三种映像的特点 ,尤其是冲突率和硬件电路设计的复杂度,以及每一种映像方法的优缺点
练习题
Cache的地址映像方式中,发生块冲突次数最小的是()。(2015年上半年)
A.全相联映像
B.组相联映像
C.直接映像
D.无法确定
答案:A
Cache替换算法
也就做页面置换算法或页面淘汰算法。因为当我们将主存的页面调入到Cache的时候,经常会出现冲突。冲突就应该把那些页面淘汰出去,替换成为我们想要的页面,这个时候就要有一定的算法来决定了。那常见的开始页面淘汰算法上大概有如下五种。
Cache页面淘汰算法
- 随机替换算法RAND(Random)
它使用随机处发生器产生一个需要替换的块号,然后将该块号替换出去。
也就是说,它是以随机数的形式来决定淘汰的页面。这就是我们说的随缘或者佛系淘汰 - 先进先出算法FIFO(First in First out)
这是将最先进入Cache的信息替换出去,考虑到谁先记录,我们就把它淘汰掉。 - 近期最少使用算法LRU(Least Recently Used)
他是将近期最常见的Cache中的信息替换出去。其实应该能翻译为近期最久未使用。很好理解:我们会参照Cache页面的使用时间,它的时间越久就优先淘汰它。这是因为过了很久都没有用,那么此时我们再用到它的可能性相对来说小一些。也就是说这种算法它有局部性原理的思想在里面 - 最不频繁使用算法LFU(Least Frequently Used)
这里的 F代表的是频繁的含义。也就是说,它会用一个计数器
来记录我们访问页面的次数。这个次数如果说经常访问说明我们接下来要访问的可能性就会更大。相对来说,它的合理性也会更强一些。也就是说,我们用计数器来记录相应页面的访问次数,在淘汰过程当中,判断哪里的次数越少,我们就优先淘汰谁。这就是 LFU最不频繁使用算法的淘汰过程。
这里大家要尤其注意的是LFU 使用了计数器。这一点在曾经的历年考试当中是考过的。哪一种淘汰算法使用的计数器? - 优化替换算法
这种算法必须先出现一次程序统计Cache的替换情况,有了这样的信息,在第二次执行该程序的时候,就可以用最有效的方式进行替换
这几种算法在近几年的考试中出现的频率并不高。
出来淘汰算法,我们还要考虑Cache的读写过程
Cache的读写过程
Cache的内容是对主存内容的直接复制。我们要把主存的内容复制到Cache里面去之后,Cache会在CPU的调度下进行使用,这个过程会不会修改Cache页面的内容?有可能,如果对Cache页面内容进行修改,那么与主存之间是不是会存在不一致的情况。所以我们要考虑如何解决这种不一致,这种读写过程有三种算法:
- 写直达:同时写Cache与内存
Cache修改的同时就修改内存的相应内容。显然这个效率会慢一些,损耗也会大一点。其次我们可以写回Cache,写回Cache后与内存不一样了怎么办? - 写回:只写Cache,淘汰页面时,写回内存
写回Cache后与内存不一样了怎么办?淘汰修改页面的时候,再将修改写回到内存当中。这个过程,我们可以避免多次的修改某一个页面。这就需要写回内存的操作。如果说Cache一直在用这个页面的话,我们只需要在最后不用的时候写一次内存就够了。所以损耗上这个效率要比写直达稍微有点优势 - 标记法:只写入内存,并将标志位清零,若用到此数据,只需要再次调取
前面我们考虑Cache和主存一起写,然后只写Cache。接下来我们只写主存(内存)。只写内存的情况我们可以理解为对Cache来说,它本身就是一类缓存存储机制,那我们是指的内容其实还是内存。所以每次修改我们直接将内存给它修改了,修改的时候注意对Cache做一个修改的标记(标志),之后如果我们再用到这个数据,就可以从主存(内存)重新来调取新的页面;不用的话就不需要再调取了。
简单了解这三种方式的区别就可以了,在考试当中考的并不多。
练习题
Cache的替换算法中,()算法计数器位数多,实现困难。
A. FIFO
B. LFU
C. LRU
D. RAND
答案:B
磁盘
外存(辅存)是用来存放不用的程序和数据,并且以文件的形式进行存储。我们都知道CPU是不能直接访问外存中的程序和数据的,只有将其以文件为单位调入主存以后才可以进行访问。
外存储器主要包括光盘存储器(常见的光盘、固态硬盘)以及磁表名存储器(电脑机械硬盘,移动硬盘中的机械硬盘注:移动硬盘还有固态硬盘是光盘存储器,磁带)
我们这里要了解一种典型的外存储器:磁盘也叫机械硬盘
磁盘是指利用磁记录技术来存储数据的存储器。它是计算机主要的存储介质,可以存储大量的二进制数据,并且在断电以后也能把数据保留下来不流失。比如说我们电脑以前装的机械硬盘,在我们关了电脑后再打开的时候,数据依然在里面,并不会因为断电而丢失,这一点有别于我们的主存或者内存。主存或者内存的数据,只要掉电了数据就会丢失,比如说我们重启一下电脑,里面的数据就没有了。
在本节课当中,我们主要了解的是磁盘当中的机械硬盘,它的基本结构以及简单的存取过程。后面我们所说到的磁盘,那指的都是机械硬盘。
首先针对一个磁盘,它其实是一个立体结构,如下图。它里面有很多个盘面。比如说从上往下一直有0号盘面、1号盘面、2号盘面、3号盘面。
而且一个盘片可能会有两个盘面(上面和下面,正反两面都可以作为存储数据的盘面)
每个盘面都一个磁头,这些磁头通过硬件连接在一个主干上面。
对于磁盘而言,它是绕着轴心来做匀速运动的。无论发生了什么,只要是这个机器运行的话,这个磁盘都能够匀速、同向的、一直的运动
而磁头它是沿着盘面的半径方向直线运动,我们的机械臂控制着磁头连着磁面的半径方向做直线运动。
从这个立体结构当中我们选择一个盘面来进行分析:
我们可以看到一个盘面上,它可以画出很多个同心圆。我们把这个一圈一圈的同心圆叫做磁道。
这一圈的磁道记录的数据量相对比较大,我们会将磁道按角度进行切割,就像切蛋糕一样(图中的白线切割)。
按角度切出来的这些内容叫做扇区。在实际读取数据的过程当中,我们都是以扇区来读取数据块的。
我们的磁道有自己的编号,一般从外往里依次是0号磁道,1号磁道…n号磁道。
扇区也有自己的编号:1号扇区,2号扇区…n号扇区。依次类推这些,这些盘面从立体结构来看,每个面都有0号磁道。
我们可以想一下每个盘面都有0号磁道,那所有的这些0号磁道可以形成一个圆柱。
这个圆柱是空心的,每个圆柱我们可以称之为柱面。也就是说,在同一个柱面编号它所对应的是所有磁盘上同一编号的磁道。
由于磁头都是固定在一个主干上的,所以在运行的时候,寻找迟到的过程就是在寻找柱面的过程。在磁盘上读取信息就是磁头在磁道上运动的过程。让磁头向圆心来回的移动,这个移动的过程会跨越不同的磁道,直到我们得到我们需要的磁道为止。
我们把它叫做随着圆心的垂直方向来做垂直寻到的过程,或者说磁头沿着半径的方向直线运动,在寻道之后真正读取数据。这个扇区在计算机当中,磁盘是固定方向,匀速不停的转动的,所以找到对应磁道之后,就等着磁盘匀速转动,将扇区位置转动到磁头的下方位置就可以了,那么这个等待的过程就叫做旋转延迟或者等待时间
。也就是等待读写的扇区转到磁头下方所用的时间
我们一般说磁盘存取数据的时间就分为寻道时间和等待时间,也就是跨越磁道垂直移动的过程,以及等待磁盘、等待散区走到磁头下面的旋转延迟时间。或者是等待时间,那这就是一个平均存取数据的时间了。对于磁盘而言,我们在读取数据的时候,磁头走到对应的磁道,等到旋转到相应扇区的起始位置,就开始读取数据了。那旋转的时候,磁道会经过这个扇区,也就相应地将数据读取出来了。
那读取数据的过程当中,它有寻道时间,有找扇区,也就是旋转延迟时间,有时候还要考虑到它的数据传输时间,我们一般所说的平均存取时间,其实是没有考虑传输时间的。
很多同学可能会存在这样的疑问:存取时间为什么只有寻道时间和等待时间,而没有存取扇区内容的时间?这是因为磁盘读取数据,本质上是通过磁头读取介质中的正负磁性,然后通过电流传输回去。这个读取过程是非常非常的快的,相对于寻道时间或者是等待时间,几乎可以忽略不计。所以,读取数据速度的瓶颈就是如何减少寻道时间和等待时间,而且寻到时间要远大于等待时间。所以我们在做磁盘寻址优先,再去考虑磁头的移动,而后考虑的是磁盘的旋转
总结
机械磁盘存在两组运动:
- 磁盘的旋转运动
- 机械臂控制磁头沿半经方向的直线运动
存取时间=寻道时间+等待时间
- 寻道时间:指磁头移动到磁道所需的时间
- 等待时间:等待读写的扇区转到磁头下方所用的时间。或者叫做旋转延时
固态硬盘
固态硬盘和我们的机械磁盘物理结构上有着本质的区别。固态硬盘它没有扇区,没有盘片、圆柱体这些的概念,从名字就可以看出它不是用机械来驱动的,而是采用存储芯片进行数据的存储。固态硬盘的存储芯片可以分为两种。一种是用闪存作为存储介质;另一种是采用DRAM作为存储介质。
目前我们使用较多的是采用闪存作为存储介质的固态硬盘,相比于我们的机械硬盘,固态硬盘的读写速度要比机械硬盘快很多,工作噪声也比较低,防震效果还很好,但是他也有自己的不足。比如说它的写入次数是有限制的,通常也就在上万次左右。而机械硬盘它就没有这个限制。这是第一点不足。第二点不足就是同样的存储容量,固态硬盘的价格要比机械硬盘要高一些。
固态硬盘它有写入次数的上限,有的同学它可能有误解,那是不是说我的固态硬盘在电脑上插拔一万次左右它就坏了?并不是这样的。这里面的写入次数并不只是指文件的写入次数,而是写入超过多少的量才算一次。一般我们的固态硬盘的寿命基本是在十到二十年之间。
练习题
在磁盘调度管理中,通常()(2019下半年试题)
A. 先进行旋转调度,再进行移臂调度
B. 在访问不同柱面的信息时,只需要进行旋转调度
C. 先进行移臂调度,再进行旋转调度
D. 在访问同一磁道的信息时,只需要进行移臂调度
答案C