循序渐进了解操作系统之——虚拟内存(一)

前言:虚拟内存是操作系统一个非常重要的部分,他关乎着操作系统的稳定,高效运行。如果你正面临着秋招,那么我相信这篇文章会对你进一步理解虚拟内存有所帮助。

什么是虚拟内存?为什么要有虚拟内存?

对于大多数上过操作系统课程或者是了解过操作系统的人来说,我相信大家一定听说过操作系统的虚拟内存,并且如果问操作系统的虚拟内存的作用是什么,大家可能会讲,虚拟内存提供了很强的隔离性,能够使各个进程相互独立、安全可靠的运行。总结就是,虚拟内存使得操作系统具有较好的**隔离性安全性可靠性**。

那么问题来了,为什么虚拟内存会使操作系统具有较高的隔离性,安全性,可靠性?

我们现在来分析一下~

在了解虚拟内存之前,我们应该先了解什么是进程,如果对进程还不是很熟悉,可以看一下我的这篇文章循序渐进了解操作系统之——进程

在这里插入图片描述

我们看一下上面这张图,对于一个进程,初始未运行时是保存在磁盘上,此时只能被称作是程序,不能被称作进程。当我们运行这个程序时,即这个程序跑起来后就变成了进程。如上图,比如我们现在的磁盘上存储了5个程序,括号内的数字表示运行该程序所需的内存大小(注:这里提到的运行该程序所需的内存大小只是假定的,你可以理解为在进程运行期间所申请的内存大小为我们假设的内存大小。这里只是为了便于分析作出的假设。实际上,一个进程在运行期间所使用的内存是随时都在变化的,比如我们应该熟悉的栈区,堆区等,都会改变我们程序的内存。)。从上面可以看出,运行程序1我们需要花费1G的内存,运行程序2我们需要花费1G的内存,运行程序3我们需要花费2G的内存,运行程序4我们需要花费4G的内存,运行程序5我们需要花费5G的内存。我们再看一下我们总共的内存只有4G,对于程序1,2,3,4运行时所需的内存都小于4G,故都可以单独运行。然而,只让我们的电脑一次只运行一个进程,貌似非常不合理吧?比如把你当成是一个电脑,你现在可以需要做两件事,一件事是吃饭,一件事是看电视。现在我规定你同时只能干一件事,即吃饭的时候不能看电视,看电视的时候不能吃饭,(假如你非常想吃饭和看电视,并且其他人不会左右你的思想和行动!!!)在这个规定下,你觉得合理吗?我猜你肯定不乐意吧,我就想吃饭和看电视一起干,这样相当于我花费了同样的时间,干了两件事。可是,你又想了,人是活的,有思想,电脑是死的,只是一个机器,他又不想这看电视,他只要把需要做的任务完成就好了。确实,电脑需要完成我们的任务,但是其中有一个非常重要的指标:效率。即电脑如何能高效的完成我们的任务,如果我让电脑处理一项非常简单的任务,电脑十来天才能完成,那么我需要电脑有什么用?所以,请大家先明确一个前提,电脑在工作稳定的前提下一定要保证工作的效率!所以,一次只让电脑运行一个进程显然是不合理的,我们如今的电脑基本上都同时运行数十上百个进程。
然而,我们再观察一下上边的这幅图,发现对于需要运行内存很大的进程,运行了该进程就很难有空间再运行其他进程,即一个进程占据了内存的绝大部分空间,使得其他进程无法运行。另外,由于程序5需要的运行内存为5G,而内存仅有4G,故目前来看程序5是无法运行的。那难道只要程序所需的运行内存大于我们的实际物理内存,我们的程序就无法运行了吗?显然是可以运行的,只是具体是如何运行,我们需要一步步了解。到这里,我们相当于又引入了一个问题,即我们电脑的实际物理内存有限,当我们申请的内存大于我们的物理内存时会发生什么问题?这是虚拟内存所解决的一个问题,即虚拟内存使得各进程间可以合理利用,分配物理内存。

我们上面只是大致讲了一下虚拟内存的一些作用,以及可以解决的一下问题,可是虚拟内存的具体原理我们还未开始讲,现在我们开始正式了解虚拟内存。分析为什么虚拟内存具有隔离性,安全性,可靠性,节省内存等特点。

要了解虚拟内存,我们先假设如果没有虚拟内存程序运行会怎样。

当多个程序同时驻留在内存中,使保护成为重要问题。人们不希望一个进程可以读取其他进程的内存,更别说修改了。
首先
如果没有虚拟内存,显然我们目前所能做的就是必须把运行该进程所需的全部数据加载到内存中去,因为我们此时没有什么额外的标记该程序的结构。这显然就带来了我们上述提到的如果一个进程所需的内存过大,那么将可能导致后续进程无可用内存的情况发生。这是一个问题,另一个问题就是安全性。
其次,
在我们生活的这个世界,安全性是我们时刻都应该得到保障的。就我们个人来说,我们有人身安全,财产安全;对公司来说,也有企业安全,资金安全等等。那么对于计算机来讲,也一样需要具有计算机安全,那么什么是计算机安全?关于计算机安全,或许我们平时在使用不能察觉,但是这要我们在使用计算机,那么我们就无时无刻不享受着操作系统提供给我们的计算机安全,可见不管是在何种地方都如此重要!
而我们此时要讲的计算机安全,其实就是操作系统提供给我们的数据安全。我们计算机里保存着很多数据,这些数据对我们很重要,比如这个数据就是你的毕业论文,那么我肯定希望这个毕业论文只有我能修改它,只有我能访问它。具体如何实现,这就是通过我们要讲的虚拟内存来解决。不过,可能有人会有疑惑,只有通过虚拟内存才能解决吗?我不使用虚拟内存会怎样?那么我们就来看一下不使用虚拟内存的情景;如果没有虚拟内存,那么自然而然的我们的数据实际保存的就是真实的物理内存。另外,我们在保证安全性时,我们必须作出假设,即除了我自己的进程,其他都是恶意进程,即别的进程总想攻击我。那么我们可以作出假设,比如有三个进程,这三个进程我都分配有独立的地址空间供进程访问,进程里面存有自己进程的数据;那此时我们可以把我们的进程一、进程二、进程三比作是三个挨着的房间,每个房间因为不想其他进程访问,故我对每个房间都上好锁;另外,房间里都存放有大量的现金。
至此,假设完成,我们看一下我们的假设:

在这里插入图片描述

如上图,就是我们的进程和我们假设的对象,之间的对应关系。每个虚线框框起来的就是一个独立的空间,即我们想提供给他隔离性。但真的能提供给隔离性吗?我们假设我们自己处在房间一(进程一),然后房间二(进程二)和房间三(进程三)里住着的都是小偷(比如黑客或病毒),他们没事总想偷东西(篡改数据),虽然我的房间装了锁(提供了独立的进程地址空间,但每个进程都是实际的真实物理内存),但是奈何小偷(黑客或病毒)神通广大,总能找到潜入(因为为每个进程提供的都是真实物理内存,那么他们肯定知道他们自己的内存的地址,并且也知道自己内存有多大,因此就能得到自己内存的边界,那么只要我跨过这个边界访问,我就可以访问到不属于我的内存)我的房间的方法,然后偷走我的现金(篡改数据),显然这样直接给进程分配一块真实的物理内存是极其不安全的。基于此,我们想到,如果我们不让每个进程知道他自己的真实位置,那么他是不是就不能通过越界他的地址来访问其他进程的内容了呢?问题来了,既然不给进程提供地址,那么进程怎么通过寻址来找到他所要访问的地址空间呢,并且如何知道他自己的内存有多大呢?咦~,这就要提到我们的虚拟内存了,既然不能提供给进程真实的地址空间,那么我们就提供给进程一个虚拟的地址空间,然后把这个虚拟的地址空间和真实的地址空间做一个映射,那么不就通过虚拟地址空间访问到真实地址空间了吗?另外,要让进程知道他的内存有多大,我们可以让操作系统告诉进程每个进程的大小!这就是虚拟内存实现的最基本的原理!!!

基于此,我们应该大致了解了虚拟内存如何实现的安全隔离,不过可能会感觉到似懂非懂,不过不怕,我们在从头理一遍,我相信就会豁然开朗!!!

对于访问一个进程,我们需要知道以下几点:

  • 进程的地址
  • 进程所占用的空间大小
    由于我们不能让进程直接访问物理内存,从而有了虚拟内存,那么虚拟内存就必须提供以下几点:
  • 能够访问到真实的物理地址
  • 需要知道进程占用的空间大小

我们看一下虚拟内存是如何实现的,上面提到通过虚拟内存访问到真实的物理内存是通过映射关系来做的,那么这个映射其实就是通过寄存器来做为支持的。对于每个进程,他们所能查看的都是虚拟地址,并且该虚拟地址都是从0开始。具体的通过虚拟地址来映射到物理地址,就是通过寄存器中保存的地址信息,结合每个进程的虚拟地址信息进行转换,具体如何转换,我们在下一节再进行细讲。看到这里,有些小伙伴可能会有疑问,计算机的寄存器是有限的,比切寄存器是所有进程共同使用的,可是每个进程的地址空间又不相同,那么寄存器是怎么实现地址空间的隔离,访问到每个进程正确的地址空间呢?说道这,我们可能得提一下操作系统的进程,我们应该知道我们的计算机可以并发执行许多进程,对于这么多进程肯定不会说操作系统一次让这些进程同时执行,只是看起来像是同时运行。那么这就会涉及到进程切换,也是进程调度,正是因为有了进程切换,所以说是多个进程共用一套寄存器。然而每个进程都有自己独立的地址空间,寄存器有保存着访问地址空间所需的必要的信息,所以,那么在进程调度时,我们必须要保存属于该进程的寄存器的值,以保证下一次唤醒该进程时该进程能正常工作!!!所以,这也是进程调度的一个点,即在进行进程调度时,我们必须要保存寄存器的值。

好啦~,这次关于虚拟内存就先写这么多,虚拟内存的内容很多,这篇讲的只是最基本的虚拟内存知识,比如剩下的还有虚拟内存的:分页、分段、页错误,懒加载(延迟加载),页面置换算法,共享内存等内容,剩下的我将分为多篇文章分享,有兴趣的小伙伴请三连支持呀

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bug.Remove()

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

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

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

打赏作者

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

抵扣说明:

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

余额充值