1. 虚拟内存简介

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

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

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

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

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

2. 物理寻址和虚拟寻址

2.1物理寻址

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

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

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

2.2虚拟寻址

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

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

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

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

3. 内存管理技术发展

3.1人工操作

最早期的计算机并没有操作系统,而是采用人工操作方式处理任务。程序员将用机器语言编写好的程序和数据。通过穿孔的方式保存在纸带上,然后将穿孔纸带装入到机器就的输入机,随后通过控制台开关启动程序。计算器完成计算后,通过打印机输出计算结果。操作员取走结果并卸下纸带后,才能开始操作下一个程序(纸袋)。

纸袋识别原理:采集器是一组探针和一组对应的探针座, 纸带经过探针组,有孔的地方探针会接触导通,而没孔的地方则不会导通,匀速拖动纸带这样计算机就能够识别纸带编码,进而进行计算。

探针有两种类型:信号探针同步探针。信号探针读取的是程序代码和数据,同步探针就是产生同步信号,同步信号的作用就和现代计算机中时钟信号,每一个同步信号都会触发计算机执行一条指令。
人工操作方式的缺点非常明显:
1、计算机的高速与手工操作的低速之间矛盾巨大,人机速度极不协调,资源浪费严重。
2、一个程序独占全机,导致资源的利用率低。

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

3.2单道批处理机制

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

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

单道批处理系统的特征是内存中只允许存放一个作业,即当前正在运行的作业才能驻留内存,作业的执行顺序是先进先出,即按顺序执行。这种模型下用户进程总是加载到同一个固定内存地址上运行,用户进程使用的地址就是物理地址。
这种系统有两个致命的缺点:
1、系统只能运行比物理内存容量小的应用程序,不支持运行比物理内容量大的应用程序。
2、系统只能运行一个应用程序,不支持运行多个应用程序。

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

3.2多道批处理机制

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

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

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

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

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

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

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

3.3覆盖机制

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

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

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

3.4交换机制

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


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

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

3.5按需分页机制

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

3.6虚拟内存机制

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

4. 虚拟内存解决问题

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

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

5. 虚拟内存模型

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

未完待续…

创作不易希望朋友们点赞,转发,评论,关注。
您的点赞,转发,评论,关注将是我持续更新的动力
作者:李巍
Github:liyinuoman2017
CSDN:liyinuo2017
今日头条:程序猿李巍

虚拟内存技术的来龙去脉(上)相关推荐

  1. Linux内存技术分析(上)

    Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...

  2. android 6.0虚拟内存,Maxwell的统一虚拟内存只用在专业卡上,GTX 750 Ti或无缘

    拼 命 加 载 中 ... 在GeForce GTX 750 Ti/750显卡上,我们已经见识到了Maxwell架构在高效能上的威力,但Maxwell架构到现在还是个迷,NVIDIA还没有公布详细的架 ...

  3. 操作系统 虚拟内存技术

    前言 本文介绍操作系统里的虚拟内存技术,它是目前最常用的内存扩充技术. 本文先介绍了虚拟内存的概念, 再介绍如何实现虚拟内存,只以请求分页管理方式为例来表示如何实现: 再比较各种页面置换算法,用以确定 ...

  4. 操作系统-虚拟内存技术

    操作系统-王道老师 第三章-虚拟内存 目录: 1.虚拟内存的基本概念     1.1 传统存储管理方式的特征和缺点     1.2 局部性原理     1.3 虚拟内存的定义和特征     1.4 如 ...

  5. 清华操作系统笔记4——虚拟内存技术

    CSDN话题挑战赛第2期 参赛话题:学习笔记 系列文章目录 文章目录 系列文章目录 前言 一. 虚拟内存的需求背景 起因 问题 二.覆盖技术 (1)目标 (2)原理 缺点 三.交换技术 (1)目标 ( ...

  6. 虚拟内存技术的作用与设计

    想要了解虚拟内存技术,就必须要知道它的前世今生,我们都知道最底层的计算机程序运行于硬件上的内存中,我们称其为物理内存(主存), CPU 可以直接从物理内存中读取数据和指令.在物理内存中,每个存储单元被 ...

  7. 计算机组成--虚拟内存技术

    虚拟内存 虚拟内存 计算机系统使用的各种内存管理策略.所有这些策略都为同一目的:同时将多个进程存放在内存中,以便多道程序设计.不过,这些策略都需要在进程执行之前将整个进程放在内存中. 虚拟内存技术允许 ...

  8. MindSpore技术理解(上)

    MindSpore技术理解(上) 引言 深度学习研究和应用在近几十年得到了爆炸式的发展,掀起了人工智能的第三次浪潮,并且在图像识别.语音识别与合成.无人驾驶.机器视觉等方面取得了巨大的成功.这也对算法 ...

  9. Tensor Core技术解析(上)

    Tensor Core技术解析(上) NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构--Turing(图灵),黄仁勋称Turing架构是自2006年CUDA GPU发明以来最大的 ...

最新文章

  1. 蒙特卡洛算法贡献者之一Arianna Rosenbluth逝世 | AI日报
  2. NOIP200905潜伏者
  3. Python语言学习:Python随机生成那些事之随机生成使用方法、案例应用之详细攻略
  4. matlab计算每个细胞面积,手把手教你用 Imaris 计算细胞面积
  5. php向数据库添加数据失败,无法从PHP中的表单向数据库添加数据
  6. RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
  7. python求线段长度_python微元法计算函数曲线长度的方法
  8. JMeter——并发测试工具类安装及使用
  9. 删除Terminating状态的Pod
  10. 20051129: NetBeans
  11. MATLAB 撰写word
  12. 前端实现动画的6种方式详解
  13. Java 系统工具类 —— System、Scanner、Runtime
  14. MBR、主引导扇区,主分区、扩展分区、逻辑分区,活动分区、引导分区、系统分区、启动分区的区别详解
  15. 粒子滤波(Particle filter)算法简介及MATLAB实现
  16. java卡 apdu_java智能卡APDU学习笔记
  17. 微信小程序input禁止输入特殊符号
  18. 晶振外匹配电容应该怎样选取
  19. ASO优化关键词覆盖、曝光原理
  20. HYSBZ 3991 寻宝游戏

热门文章

  1. RAID5和RAID10在磁盘读写选择对比
  2. 小学教育怎么选择特别容易写的论文选题?
  3. 深度学习分类分到同一个类
  4. 详解C语言最快关键字——register
  5. 恢复重装系统后的EFS加密文件
  6. 单线激光雷达Windows测试备忘
  7. 苹果手机QQ扫正常二维码404
  8. JS基础 原型与继承
  9. 进击的JavaScript(对象,继承,单例模式)
  10. chatgpt赋能Python-python_patsy