虚拟内存技术的来龙去脉

存储
虚拟内存是操作系统配合硬件实现,它是隐藏自动地工作着,不需要程序员进行任何干涉。虚拟内存给予应用程序强大的能力,应用程序可以创建和销毁内存片,应用程序可以将内存片映射到磁盘文件中,应用程序可以与其它进程共享内存。

1、虚拟内存简介

每个现代计算机系统都配有高速可随机访问存储器,称为主存储器、物理内存或者直接称为内存。内存是用于存放代码和数据的硬件,它是处理器能直接寻址的存储空间,内存由半导体器件制成,特点是存取速率快。

程序被执行前需要先将程序放到内存中才能被CPU处理,我们平常使用的程序,如:操作系统、办公软件、游戏软件等,通常是安装在硬盘等外存上,软件需要运行时,必须把它们调入内存中运行,才能真正被执行。

内存的承载实体通常是随机存取存储器(RAM),CPU可以直接与RAM交换数据。RAM在工作状态下,可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。

高效的内存管理系统是操作系统的重要功能之一,现代操作系统提供了一种内存管理技术:虚拟内存。虚拟内存是计算机系统最重要的概念之一,它几乎涉及计算机系统的所有层面,在硬件层面,编译器层面,文件层面,进程层面扮演重要角色。

虚拟内存是操作系统配合硬件实现,它是隐藏自动地工作着,不需要程序员进行任何干涉。虚拟内存给予应用程序强大的能力,应用程序可以创建和销毁内存片,应用程序可以将内存片映射到磁盘文件中,应用程序可以与其它进程共享内存。

2、物理寻址和虚拟寻址

(1)物理寻址

计算机系统的内存被组织成一个N个连续字节单元组成的数组,每个字节有且仅有一个唯一的物理地址(PA)。第一个字节的物理地址为0,接下来的一个字节的物理地址为1,再下一个字节的物理地址为2,依此类推。CPU访问内存最自然的方式时使用物理地址,这种访问方式称为物理寻址。

早期的PC使用物理寻址,目前数字信号处理器,嵌入式微控制器(单片机)任然继续使用这种寻址方式。下图展示了一个物理寻址的示例:

上图示例了一条加载指令,它读取物理地址4处开始的4字节。当处理器执行这条加载指令时,处理器会生成一个物理地址4,内存总线将物理地址4传递到内存的地址端口,内存取出物理地址4处的连续4个字节数据输出到内存数据总线上,传递给处理器,处理器会将这4字节数据存放在寄存器中。

(2)虚拟寻址

物理寻址最直接,效率高,但是这种寻址方式明显缺点:不支持运行比物理内容量大的应用程序;不支持编写与机器无关的代码,代码需要和物理内存配置有对应关系。现代计算机系统使用的是一种称为虚拟寻址的寻址方式。

虚拟寻址的寻址过程是:CPU通常生成一个虚拟地址(VA)来访问主存,这个虚拟地址被加载到内存之前,需要先转换成物理地址(PA),最终CPU间接的访问了内存的这个物理地址(PA)。将虚拟地址转换成物理地址的过程叫做地址翻译。CPU芯片内部有一个叫做内存管理单元(MMU)的专用硬件,内存管理单元利用查询表来动态完成地址翻译。

下图展示了一个物理寻址的示例:

上图示例了一条加载指令,它读取虚拟地址88处开始的4个字节。当处理器执行这条加载指令时,处理器会生成一个虚拟地址88给MMU,MMU查表得到虚拟地址88对应的物理地址4,内存总线将物理地址4传递到内存的地址端口,内存取出物理地址4处的连续4个字节数据输出到内存数据总线上,传递给处理器,处理器会将这4字节数据存放在寄存器中。

3、内存管理技术发展

(1)人工操作

最早期的计算机并没有操作系统,而是采用人工操作方式处理任务。程序员将用机器语言编写好的程序和数据。通过穿孔的方式保存在纸带上,然后将穿孔纸带装入到机器的输入机,随后通过控制台开关启动程序。计算器完成计算后,通过打印机输出计算结果。操作员取走结果并卸下纸带后,才能开始操作下一个程序(纸袋)。
纸袋识别原理:采集器是一组探针和一组对应的探针座, 纸带经过探针组,有孔的地方探针会接触导通,而没孔的地方则不会导通,匀速拖动纸带这样计算机就能够识别纸带编码,进而进行计算。

​探针有两种类型:信号探针和同步探针。信号探针读取的是程序代码和数据,同步探针就是产生同步信号,同步信号的作用就和现代计算机中时钟信号,每一个同步信号都会触发计算机执行一条指令。

人工操作方式的缺点非常明显:

1、计算机的高速与手工操作的低速之间矛盾巨大,人机速度极不协调,资源浪费严重。

2、一个程序独占全机,导致资源的利用率低。

特点:最早期的电子计算机并没有操作系统,没有内存,也没有内存管理,人工操作。

(2)单道批处理机制

20世纪50年代后期,为了克服手工操作的慢速度和计算机的高速度之间的矛盾,出现了单道批处理系统,即在计算机上加载一个系统软件,在系统软件的控制下计算机能够自动地、成批地处理一个或多个用户的作业。

单道批处理系统的目的是减少作业间转换时的人工操作,从而减少CPU的等待时间。批处理就是将作业按照它们的性质分组(或分批),然后再一个接一个地提交给计算机系统,由计算机自动完成后再输出结果,从而减少作业建立和结束过程中的时间浪费。这种工作模式就像是工厂里面的流水线一样。

​单道批处理系统的特征是内存中只允许存放一个作业,即当前正在运行的作业才能驻留内存,作业的执行顺序是先进先出,即按顺序执行。这种模型下用户进程总是加载到同一个固定内存地址上运行,用户进程使用的地址就是物理地址。

这种系统有两个致命的缺点:1、系统只能运行比物理内存容量小的应用程序,不支持运行比物理内存容量大的应用程序。

2、系统只能运行一个应用程序,不支持运行多个应用程序。

接下来的计算机历史,就是计算机先驱们一步一步克服这两个问题的历史。本节我们来看看计算机先驱们是怎样征服这两个BOOS的。

(3)多道批处理机制

由于在单道批处理系统中,一个作业单独进入内存并独占系统资源,直到运行结束后下一个作业才能进入内存,当作业进行I/O操作时,CPU只能处于等待状态,因此CPU利用率较低。

直到20世纪60年代中期,多道程序设计技术出现,正式进入多道批处理系统阶段。 1964年,IBM生产了第一台小规模集成电路计算机IBM 360,为该机开发的OS/360 操作系统是第一个能够运行多道程序的批处理系统。

多道程序设计技术可同时把多个程序放入内存,并允许它们交替在CPU中运行,共享系统中的各种硬、软件资源。当一道程序因I/O(输入/输出)请求而暂停运行时,CPU便立即转去运行另一道程序。多道批处理不是多个程序同时运行,而是多个程序在内存中准备运行,只有当正在运行的的那道程序因为某种原因(比如,等待输出或输出数据)而暂时无法继续运行的时候,系统将自动地启动另一道程序运行。

即在内存中可同时存在若干道作业,作业执行的次序与进入内存的次序无严格的对应关系,因为这些作业是通过一定的作业调度算法来使用CPU的。一个作业在等待I/O处理时,CPU调度另外一个作业运行,因此CPU的利用率显著地提高了。

由于多道程序能交替使用CPU,提高了CPU及其他系统资源的利用率,同时也提高了系统的效率。多道批处理系统的缺点是延长了作业的周转时间,用户不能进行直接干预,缺少交互性,不利于程序的开发与调试。

多道批处理系统的优点也很明显:系统内可同时容纳多个作业。这些作业放在外存中,组成一个后备队列,系统按一定的调度原则每次从后备作业队列中选取一个或多个作业进入内存运行,运行作业结束、退出运行和后备作业进入运行均由系统自动实现,从而在系统中形成一个自动转接的、连续的作业流。

多道批处理系统的缺点也很明显:在系统运行过程中,不允许用户与其作业发生交互作用,即作业一旦进入系统,用户就不能直接干预其作业的运行。

(4)覆盖机制

多道批处理系统解决了运行多个应用程序的问题,但是系统仍然不支持运行比物理内容量大的应用程序,这种限制产生了一种覆盖机制。覆盖机制通过覆盖应用程序不再需要的地址空间,来达到重用内存的目的。例如,一旦系统加载完成并开始运行,系统初始化的代码内存就可以回收给程序使用,这种软件覆盖机制需要应用程序开发人员做额外的编程操作。覆盖技术释放了无用代码空间,让可用的内存空间变大。

覆盖技术通俗的讲就是将程序分为多个段,经常会被执行的段就放在固定区,调入后除非运行结束,否则是不会被调出的。而不常用则放在覆盖区,只有要用到的时候才能载入内存,否则就会被调出被其它程序覆盖。

如下图所示,假如我们有一个程序A,8k的main经常会被执行,那么内存就会为其分配一个8k的固定区。而对于B、C这两个指挥被A段偶尔调用的地方,内存就会取这两个段的最大值也就是10k的空间作为这两段的覆盖区。DEF同理。可以看出覆盖技术仅用30k的内存空间,解决了52k的程序加载到内存的问题。

(5)交换机制

内存同时容纳少数几个进程,每个进程被加载到一个连续的物理内存中,系统为内存中的这些进程提供分时服务。如果要运行其它进程,系统就需要选择内存中的一个进程交换出去,系统会把选中的进程复制到磁盘上的特定交换分区中。然后将需要运行的其它程序加载到内存中运行。

交换一个进程时,操作系统会保证交换的内存大小,保存进程时,不仅仅是保存进程的数据,同时还会保存处理器的运行状态,当被保存进程得到恢复时,进程将会从被暂停的位置继续执行。

交换机制,使得物理内存容量“变大”,系统可使用的内存就可以远远大于物理内存的容量。

内存变得更大更强。

(6)按需分页机制

按需分页机制需要由操作系统和分页硬件共同完成。在按需分页系统里,物理内存和进程的地址空间都被划分成固定大小的页,数据以页为单位加载和释放出内存。物理内存中的页通常称为页框或者物理页。
在任意时刻内存中可以活动多个进程,但是每个进程可能只有部分页在物理内存中,进程的地址是虚拟的,虚拟的地址包含页号和页内偏移。在操作系统和硬件的配合下,程序的虚拟地址被转换成物理地址,并访问对应的物理内存。在按需分页机制中,所有页都是在需要的时候才加载到内存中。

(7)虚拟内存机制

内存虚拟技术并非单一的新技术,而是结合多种技术形成的技术。内存虚拟使用的虚拟地址技术,分页机制,交换机制。
虚拟内存机制是一种综合的内存管理技术。

4、虚拟内存解决问题

虚拟内存是计算机系统最重要的部分之一,虚拟内存可以实现以下功能:

1、运行比物理内存容量大的程序。如64位计算机系统有256T的虚拟内存,理论上可以运行约256T大小的程序,而当今主流的64位计算机的物理内存大小约4G。因此使用虚拟内存理想情况下可以运行任意大小的程序。
2、程序运行时只需要加载部分。因为虚拟内存使用了分页机制,程序被分割成了多段,降低了程序启动时间,降低了物理内存使用率。
3、支持多个程序同时在内存中运行。每个程序只有部分段在物理内存中,使得物理内存能同时容纳多个程序。
4、支持代码与机器无关,代码和物理内存不需要有对应关系。
5、支持重定位的程序,重定位程序可以存储在内存中的任何位置,并且位置可以在执行时改变。
6、支持内存共享。
7、不需要应用程序的程序员直接参与物理内存的分配和管理

5、虚拟内存模型

虚拟内存是硬件异常,硬件地址翻译器,主存,磁盘,内核软件共同协作实现。

责任编辑:姜华 来源: 今日头条
相关推荐

2019-03-20 14:29:46

Linux虚拟内存

2010-06-10 17:12:23

Linux 内存监控

2019-12-26 08:45:46

Linux虚拟内存

2009-06-26 08:21:57

微软Windows 7操作系统

2023-10-18 13:25:00

操作系统进程

2020-04-14 16:03:31

Linux虚拟内存操作系统

2020-11-06 07:11:40

内存虚拟Redis

2014-01-14 10:52:06

Linux vmsta虚拟内存

2019-03-14 09:29:02

Linux系统内存

2022-08-21 16:52:27

Linux虚拟内存

2021-06-01 08:20:55

Linux虚拟内存命令

2010-07-05 08:57:48

SQL Server虚

2010-06-02 11:33:26

Linux 内存监控

2021-05-31 10:03:52

虚拟内存管理

2020-08-10 07:44:13

虚拟内存交换内存Linux

2011-03-23 13:00:22

SQL Server虚拟内存

2010-07-06 09:27:01

SQL Server

2022-08-21 10:21:07

Linux虚拟内存

2020-11-02 07:05:54

虚拟内存Go

2010-05-24 10:32:20

Linux swap
点赞
收藏

51CTO技术栈公众号