41.虚拟存储器以及相关算法

虚拟存储器,又有人叫虚拟内存。很容易大家就会把它当做硬件看待。
所以我们先给虚拟存储器定性。
虚拟存储器是计算机系统内存管理的一种技术,它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
虚拟存储器并不是硬件,而是一种技术
那么它的作用是什么呢?上面的话说的很抽象。但是通俗讲就是虚拟出一块内存,简直就是无中生有。我们知道主存的大小不大,而且比较贵。所以有的时候会出现内存不够用的情况,这个时候虚拟内存就起作用了。它把硬盘上划出了一块地方,用障眼法告诉CPU,这是内存,你拿去用吧。
那这个时候我们就很好奇障眼法是怎么实现的呢?它是怎么骗CPU的呢?
这个时候我们先讲讲内存是怎么分配给程序的?
一般有两种分配方式:
1.连续分配 2.非连续分配
1.连续分配管理(会出现碎片):
①.单一连续分配
划分成系统区和用户区 只能用于单用户单任务。
②.固定分区分配
划分多分固定分区。 单个作业进入单个分区,会出现内部碎片。
③.动态分区分配
作业进入内存时才划分,大小刚好适应,会出现外部碎片
那问题来了,我们第一轮可以直接就分,很简单,但是有作业完成时释放内存后,就不是规则了,该怎么分配呢?于是就有了一下几种算法
a.首次适应算法(从头到尾找,有合适的就动态划分)
b.循环首次适应算法(不是每次都从头开始,而是从上次分配结束的地方开始)
c.最佳适应算法(按从小到大顺序,找到了就用)
d.最坏适应算法(按从大到小顺序,找到了就用)
④.动态重定位分区分配
基本跟动态分区一致,区别就是在动态分区上加了一个紧凑的功能,在运用程序找不到足够大的内存使用的时候,把内存紧凑后给应用使用。
2.非连续分配管理:
①基本分页存储管理方式
进程:页;内存:页框(块)。
逻辑地址:页号+页偏移量
物理地址:内存上真正的地址
页表:逻辑地址和物理地址的映射表

这个时候有一个问题,程序员关注的都是逻辑地址,那么CPU访问一个逻辑地址需要访问多次内存呢?

答案是两次,第一次先访问内存的页表,找出对应的物理地址,再次访问对应的物理地址。我们也知道cpu速度比内存速度快,所以访问内存会降低cpu的利用率,那么怎么减少访问内存的次数呢?

这个时候有一个概念:TLB 旁路翻译缓存或者叫快表

作用是什么呢?TLB是在cpu上的缓存,只存放经常用到的页表。那么我们访问的逻辑地址能够在cpu的TLB上找到对应的物理地址,那么我们只需要访问一次内存就可以了 。那找不到怎么办?
找不到这个时候就是另外的算法了。cpu会访问内存,然后把这个页表放到TLB里。这时候访问内存的次数是2次。

页的大小一般是固定的,是由系统决定的。一般是4K
②基本分段存储管理方式
段:段内是连续的,不同段间不要求连续。
逻辑地址:段号和段内偏移量
跟页不一样的地方是:因为段的大小不一样,页的大小是一样的。
所以 分页的地址空间就相当于一个y=kx+b函数,两个值就会对应一个物理地址。也就是说是一维的(一条直线)。
但是段就没有这么一个K(k不同),所以找一个地址空间,就相当于在一个平面上找,所以就是二维的。
段表
段可以共享。
③段页式管理方式
页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享
分页管理方式是从计算机的角度考虑设计的,以提高内存的利用率,提升计算机的性能, 且分页通过硬件机制实现,对用户完全透明;而分段管理方式的提出则是考虑了用户和程序员,以满足方便编程、信息保护和共享、动态增长及动态链接等多方面的需要。

段页式:段里再分页。
逻辑地址:段号 页号和页内偏移量

讲完这么多,我们回来讲讲障眼法把。
这里的障眼法就算配非连续分配管理方式。
CPU要用到某一个内存空间时,看是否是在内存上,如果是在内存里,那么直接用。如果不是,而是在硬盘上,那么这个时候就需要把内存匀出一块,然后把硬盘的数据放进去。然后CPU即能用了。
也许有人会问?那么要是一直都不在内存,那岂不是累死了,一直换。但是我们考虑到局部性原理进行交换,就能减少交换数量。

那把内存的哪部分跟硬盘数据交换呢?这个时候就有相关算法

页面置换算法:
1.FIFO 2.LRU 3.LFU 4.CLOCK置换 5.第二次置换

你可能感兴趣的:(复习)