操作系统前传第三课--深入浅出处理器之虚拟内存

本文学习自狄泰软件学院 唐佐林老师的 操作系统课程,另外本文图片全部来源于唐佐林老师课程PPT,只用于个人笔记学习


目录:

一 虚拟内存

  • 1 从现象引入虚拟内存
  • 2 虚拟内存的由来
  • 3 虚拟内存的意义以及虚拟内存的映射机制

二 内存保护


一 虚拟内存

1 从现象引入虚拟内存

在这里插入图片描述

在这里插入图片描述

system(“pause”); 暂定执行,暂定到我们在键盘上按下一个值为止。假若我们这个程序编译好了,编译出可执行程序了,接下来我们执行这个可执行程序两次,执行两次的结果就是得到了图中所示的两个进程,那么问题来了。
问题:这两个进程所输出的全局变量的地址是不是一样的 ?
答案:不同,为什么?

问题1分析:
在这里插入图片描述

这个地方牵扯到程序与进程之间的区别,程序与进程是不同的,程序是静态的概念,程序其实就是存储器上面一段静态的二进制数据,这个静态的二进制数据就是可执行程序对应的文件。而进程是可执行程序运行之后所得到的动态的概念,这个动态的概念对应着内存上的实体,比如上图内存中的进程,一个可执行程序可以多次,这里运行两次,得到两个进程。而这两个进程在内存里面显然是位于不同的位置的,所以可以推论出,这两个进程中的各自的全局变量的地址是不一样的,下面我们做实验验证一下。

在这里插入图片描述
问题2
我们将编译通过得到的可执行程序, Test.exe 运行两次,却发现两个进程中各自的全局变量地址是一样的,这是为什么呢????这相当于在两个进程的内部,这个全局变量所占用的地址居然是同一个,不可思议啊!这是为什么呢???
在这里插入图片描述
答案2:由于这两个进程是在自己给的虚拟地址空间中执行的,那他们各自的全局变量的地址就完全有可能相同的。因为这两个地址不是真是的物理地址的值,而是虚拟地址。

答案1 : 针对于问题1所对应的实例,理论上,不同进程在内存中的不同位置执行,因此,全局变量的地址是不同的。而问题2的实验中所打印的是虚拟地址。

注意:我们在做软件开发时候经常忘记的东西:我们在开发软件的时候,所面对的内存都是虚拟内存。


2 虚拟内存的由来

很久以前最初的软件开发,在没有虚拟内存这个概念的时候,那时候的开发都是直接操作的就是真实的物理内存的,那时候指定一个地址值,那么那一个地址值就对应着真真正正的物理内存里面的地址值了。这种开发模式叫做实模式软件开发,在实模式下的软件开发,我们所操作的地址就是真是的物理内存地址。然而随着软件和操作系统的发展,实模式的开发方式对于应用程序的开发是非常致命的。于是就提出了使用虚拟内存的开发模式。


3 虚拟内存的意义以及虚拟内存的映射机制

在这里插入图片描述

在这里插入图片描述
如图所示有有两个进程,P1,P2, 这两个进程所需求的物理内存的量是非常大的,在我们日常使用电脑的经验可以知道,即便是这种情况,那么也可以同时的运行这两个进程。操作系统是怎么做的呢?我们的进程在执行的过程中有一个特定,他只会执行一个局部的代码,在某一个特定的时间里面只会执行一个局部的代码,于是的话系统就将需要执行的某部分代码放到内存中执行,其他执行过或者近期不会执行的代码放在外存中,就是磁盘中。于是这样其实就是一个大内存需求量的进程,在某一个时间点或者某一段时间内 所需要的物理内存量是非常小的了,按照这样的方法就可以同时执行多个大内存需求量的进程了。此处的P1 P2进程所需要的内存只要能满足当前所要执行的指令所需要的内存就够了,其他的代码暂时放到磁盘中,这部分特殊的磁盘叫 交换区。交换区就是暂时当前执行的进程的多数代码。

在这里插入图片描述

在上面的说明中,在需要的时候,将即将执行的进程的局部代码加载到物理内存中,这个过程就是虚拟内存重新映射到物理内存的过程,因为之前这个局部代码位于交换区中,即在磁盘中。此时要加载到物理内中,是需要重新映射,因为每次的加载的物理内存的起始地址可能是不同的,所以从虚拟内存到物理内存之间会有一个映射机制。物理内存中地址就是实地址。

在这里插入图片描述

在这里插入图片描述

如上图的活动页,他之前是在交换区中,当需要这个活动页中的代码的时候才把他加载到物理内存中。这个活动页在交换区里面的时候,肯定是有一个虚拟地址的,这个虚拟地址就是我们做应用程序开发的时候所面对的地址。在加载的过程中,就会更新这个映射表,如 虚拟页号,物理页号,以及相关属性,如只读只写等内存特性。

映射原理:

在这里插入图片描述

首先,我们的应用程序要访问 0xAABBCC12这个虚拟地址的时候,内存管理单元就会开始查询页面映射表,查找该虚拟地址页号所对应的物理地址页号。将对应的物理页号取出来,将虚拟地址的地位与物理地址页号拼接在一起,就得到了真正的物理地址了。

问题3: 假如查找目标虚拟地址所对应的物理内存地址的时候,映射表里面查不到该虚拟地址,没有该映射怎么办?

在这里插入图片描述

答案3: 假如查找目标虚拟地址所对应的物理内存地址的时候,映射表里面查不到该虚拟地址,没有该映射怎么办,说明此时的虚拟地址所在的页面还没有加载到物理内存中。按照上图的方法添加到映射表即可。

在这里插入图片描述
方法1: 换更高主频的处理器,使得运算能力更强,电脑的响应速度更快

方法2: 增加物理内存,是我们平常常见的提高电脑性能的方法,从上面的映射的过程中可以看出,增加物理内存之后,换入换出的时间就会减少了,因为物理内存充足,我们可以将大量的进程里面的页面全部一次性的加载到物流内存中,这时候没有页面的换入换出操作,那换入换出操作又有什么影响呢?将页面从内存里面换到交换区,其实就是从内存里面写入到磁盘中,这是换出。而从磁盘中将数据读如到内存中是换入,而磁盘的读写操作是一种很低级很费时的IO操作。如果我们能减少页面的换入换出的次数的话,就节约了时间,这样电脑的反应就更快了。

方法3 :更换固态硬盘,为什么呢?从上面的映射的过程中可以看出,假如物理内存不变,但是我们换一个固态硬盘,而这个固态硬盘上就有交换区,此时的换出换入页面的次数不变,但是在读写磁盘的时候速度更快了,时间更短了,这样整体的性能也更快了。这样就解释了我们把系统作在固态硬盘上的时候,电脑性能就提高了。

以上三中方法提高电脑性能的方法就是因为操作系统内部是使用虚拟内存管理内存的,需要地址的映射,以及页面的换入换出,就是磁盘的IO读写操作。


二 内存保护

在这里插入图片描述

假如写该虚拟地址的时候,此时内存管理单元发现映射关系表中的属性项目中是只读的,不可写,就会发生中断,起到了内存保护的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值