虚拟内存

来源:互联网 发布:扫矿老僧软件使用介绍 编辑:程序博客网 时间:2024/06/03 22:54

一:什么是虚拟内存

 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。没有使用虚拟内存技术的系统则要求在进程运行时,它的所有页或段必须都在内存中,除非使用覆盖技术,与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
 需要注意的是:虚拟内存不只是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。
 由于这种基于虚拟内存的机制,对于进程可能需要的某些数据块可能需要从磁盘换到内存中,而内存中某些暂时用不到的数据就会被换出,所以当一块数据正好在将要被用到之前换出,操作系统就不得不很快地把它再取回来,太多这样的操作会导致系统抖动,它就是说某些数据块在某段时间被频繁换入换出而导致处理器大部分时间都用来交换块,而不是执行指令的一种现象。
 为了解决此问题,就不得不讨论解决此问题的一些基础原理:局部性原理
 局部性原理:
 局部性原理描述了一个进程中程序和数据引用的集簇倾向。因此,假设在很短的时间内仅需要进程的一部分块是合理的。同时,还可以对在不远的将来可能会访问的块进行猜测,从而避免系统抖动。
 (1).时间局部性:是说如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。
 (2).空间局部性:是说一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
 时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。

二:虚拟存储器

 基于局部性原理,内存中可能保存着多个进程所需要的某些数据块,但并不是每个进程所需要的所有数据块全部都在内存中,所以在当前所执行进程需要某个数据块而该内存块在外存中时,便会产生中断,发出IO请求,控制权交给DMA去控制MMU进行数据块调入调出,此时,操作系统将当前进程挂起,由CPU去执行另一个已准备就绪的进程,各进程之间的数据内存区域独立,也就是说当前进程无法去访问其他进程的内存区域。与此同时,操作系统将原进程所需要的数据块加载到内存中后,产生IO中断,控制权再次交给操作系统,操作系统将原进程值为就绪态,再根据进程调度算法去调度执行原进程。整个过程中,对于用户来说是透明的,用户感觉不到原进程数据块被换入换出,就像一开始数据块就已经被加载至内存中一样,这样就好像系统为用户提供一个比实际更大的存储器,称为虚拟存储器。
 在以上过程中,涉及到以下性质:
 (1).多次性:一个进程的所有数据块并不是一次性存储在内存中,而是分多次调入内存使用的。
 (2).对换性:一个进程在运行时不需要一直常驻内存,而是允许在运行时,进行换入换出。
 (3).虚拟性:是指从逻辑上扩充内存的容量,使用户感觉有比实际内存大的连续的,独立的一块内存空间。

三:虚拟内存技术实现

 虚拟内存中,允许将一个作业分多次调入内存。釆用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虚拟内存的实需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现有以下三种方式:
 (1).请求分页存储管理。
 (2).请求分段存储管理。
 (3).请求段页式存储管理。

不管哪种方式,都需要有一定的硬件支持。一般需要的支持有以下几个方面:
 (1).一定容量的内存和外存。
 (2).页表机制(或段表机制),作为主要的数据结构。
 (3).中断机构,当用户程序要访问的部分尚未调入内存,则产生中断。
 (4).地址变换机构,逻辑地址到物理地址的变换。

四:用于虚拟内存的操作系统策略

读取策略:
 读取策略确定一个页应该在什么时候读入内存,常用的方法有两种:
 (1).请求分页:只有当访问到某页中的一个单元时才将该页读入内存。
 (2).预先分页:读取的页并不是缺页中断请求的页,其利用了大多数辅存设备的特性,这些设备有寻道时间和合理的延时,如果一个进程的页被连续存储在辅存中,则一次读取许多连续的页比隔一段时间读取一页更有效。
 这里需要注意,这里的预先分页与进程交换是不同的,当一个进程被换出内存并且置于挂起态时,它的所有驻留页都被换出,当该进程被唤醒时,所有以前在内存中的页都将被重新读回内存。在实际中,将预先分页与请求分页相结合,会更加合理且高效。
放置策略:
 放置策略决定一个进程块驻留在实存中的什么地方。在一个纯粹的分段系统中,比如最佳适配,以及首次适配等都是可供选择的,但对于一个纯粹的分页系统或者段页式系统来说,如何放置其实没有关系,这是因为地址转换硬件和内存访问硬件可以以相同的效率为任何页框组合执行它们的功能。
置换策略:
 置换策略决定当前内存中的哪个页将被置换。这里有一个概念叫做页框锁定,内存中某些页框可能是被锁定的,如果一个页框被锁定,当前保存在该页框中的页就不能被置换,大多数操作系统内核和重要的结构体就保存在锁定的页框中。IO缓冲区和其他的对时间要求比较严格的区域也可能锁定在内存的页框中。置换基本算法包括:
 (1).最佳(OPT)放置算法:置换下次访问距当前时间最长的那些页(理想型);
 (2).最近最少使用(LRU):置换内存中上次使用距当前最远的页;
 (3).先进先出(FIFO);
 (4).时钟(clock):为每一页关联一个附加位,当某一页首次进入内存将相应附加位置1,它将所有页所在位全部放入一个环形循环缓冲区中,并且有一个指针,当一页被置换时,该指针被设置成指向缓冲区的下一页,当需要置换一页时,操作系统扫描缓冲区,以查找使用位为0的页,每当遇到一个使用页为1的页,操作系统就将该位重新置为0。
驻留集管理:
 驻留集管理是说给每个活动进程分配多少页或者计划置换页的集合是局限在那些产生缺页中断的进程还是所有页都在内存中的进程。
 (1).固定分配策略:为每一个进程在内存中分配固定数目的页框用于执行时使用。
 (2).可变分配策略:允许分配给一个进程的页框在该进程的生命周期中不断地发生变化。
 置换的范围分为以下两种:
 (1).局部置换策略:仅仅在产生这次缺页的进程的驻留页中选择;
 (2).全局置换策略:把内存中所有未被锁定的页都作为置换的候选页,而不管它们属于哪个进程。
清除策略:
 清除策略是用于确定在何时将一个被修改的页写回辅存。分为以下两种策略:
 (1).请求式清除:只有当一页被选择用于置换时才被写入辅存;
 (2).预约式清除:将这些被修改的多个页在需要用到它们所占据的页框之前成批地写回辅存。

原创粉丝点击