在我们经过很长时间的一段时间学习后,逐渐掌握了指针、内存函数等很多相关知识,但是在讲解过程中,往往会有些疏漏,就比如在说内存的时候,我们提到过虚拟内存,但是并没有说虚拟内存的作用,所有个别初次接触C的朋友问我,这虚拟内存到底是干什么的。这期,我们就将过去的一些遗漏部分进行讲解。

虚拟内存怎么使用c语言 虚拟内存和物理内存的映射关系(1)

C语言学习

特别要声明的一点:我写的内容中有很多自己的理解在里面,所以有错误或遗漏,希望朋友们能够指出来,在这里,谢谢大家了。虚拟内存

我们先来说说虚拟内存,我前面说过,之所以使用虚拟内存的原因就是因为很多软件非常大,运行起来特别容易占满整个物理内存,所以为了能够让大型软件运行再我们常用的电脑里,就出现了虚拟内存,其运作方式就是将有用的资源复制进内存中进行处理,没用的暂时放回去,这样就大大减少了内存的占用情况。

虚拟内存延伸出来的知识就是虚拟地址空间,这个空间就是我们常说的程序运行的空间,也是一个程序使用虚拟地址的范围。我们一直认为,电脑的系统只是为了让所有操作可以图形展示出来,让电脑使用起来更简单。实际上这只是一方面,另一方面就是我们所说的虚拟内存,它是计算机进入生活的必须产物。

计算机在早期的时候,程序是直接运行再硬件设备上的,但是硬件设备元器件非常有限,所以它们可计算的范围非常有限,不够用怎么办,而且我们说过计算机中的程序大多占用的是连续不断的一块内存,万一我们使用过程中,内存被其它程序占用了岂不是就会出错,所以虚拟内存和操作系统(系统是先产生的,我只不过一起提到而已)顺应时代而产生。

操作系统的作用是什么,它是为了确定物理内存和虚拟内存的映射关系,结合一个程序的编译模式,最终确定虚拟地址空间的大小范围等,说简单点,就是虚拟内存和物理内存的管理都是操作系统来进行的,而且能有效的解决我们前面说到的内存占用问题,防止其他程序占用我们使用的这片物理内存空间,这就是我们说到内存空间的隔离。说通俗点,就是一个很有很多孩子的母亲,这位母亲通过合理的方式,将这些孩子的资源分配的清清楚楚,让它们都能够健康成长,不会吵架,和睦相处。

虚拟内存怎么使用c语言 虚拟内存和物理内存的映射关系(2)

软件层面

通过操作系统,是不是极少了出现错误的问题,而且因为程序直接从虚拟内存中操作,是不是可以让程序员们减少对物理内存的直接操作,让运行环境更加安全了。

虽然我们说了操作系统可以提高运行速度,而且提到了操作系统会受到编译模式影响,那么编译模式是什么。我们经常听到操作系统有64位,有32位等,除了软件上的问题,更多的是CPU的原因,因为CPU就是分位数的,早期的16位,到现在的64位,都让计算机发展的更快。而我们说的编译模式,就是指的不同平台,不同CPU下,数据位数不同,导致编译的模式也不一样,就是现在编译器来看大多都是64位和32位的。你们知道吗,实际上虚拟内存提出和应用,是32位系统出现的时候提出来的。

既然编译器的编译模式是多样的,那么我们来看一下编译模式是怎么个编译法,我们以32位系统为例,我们以前说过,不管指针还是地址,字节中每一位的二进制结果都位0和1两种,那么一个32位的操作系统就是2^32大概就是4G虚拟空间,注意这里说的是内存地址,不要搞错了。64位系统比较厉害了,它可以支持最大256TB的虚拟空间。不过受物理内存和操作系统影响,只使用了48位。

从上面的这些内容来看,一个32位系统需要搭配一个32位的CPU,然后运行的程序也必须是32位,这一套下来,我们可以统称为32位环境。

这里给朋友们做个知识小普及,为什么计算机系统除了分位数以外,还会有什么专业版,旗舰版,企业版等等,不要以为物理内存可以无限扩大,它也会受到计算机操作系统的限制,像Windows 7系统,它的家庭版最大支持16GB内存,而专业版却能支持192GB的内存。所以我们在选择扩大内存的时候,还需要更换操作系统。

上面说了那么多,无非就是操作系统将虚拟内存映射至物理内存,所以我们要对它的映射原理有所了解,这种映射并不是简单的一个内存映射至另一内存,它们是以块为单位划分,在系统上运行的程序所使用的空间看做一整块,在经过映射后,物理内存中也将按块划分,如果虚拟地址中,程序访问的地址超过了自己的使用范畴,那么系统就会将其认为成非法访问,直接在虚拟层面上禁止了访问物理内存,这样就不会存在内存相互占用的错误,我们将计算机的这种行为称为地址隔离。

虚拟内存怎么使用c语言 虚拟内存和物理内存的映射关系(3)

分页

当然,前面的这种以块为单位的方法,因为每次都需要占用一整块内存,难免会造成在使用阶段,出现大量程序没有使用,但是内存却仍然被占用的弊端,所以现在操作系统就使用了更加精细的划分方法,将虚拟地址和物理地址进行分割,简单的说,就是结合一一对应和整块对应的中间点,让内存区域不在以元器件和程序为单位,而是以切割的小内存块为单位,这样就像我们的活字印刷术一样,缺少了,就读取,多了,就放回原处,这样就会为内存腾出大量不需要的空间,也不用把一整块程序都放进来。小块内存之间有很多可以操作的余地,我们把这种均匀切割的内存看做一页,整体称作分页机制,这种地址转换的过程称为页表机制。这里就不再向下延伸,因为页表理解起来却是很绕,有兴趣的朋友可以自己去了解下。

这期,我们讲了一下关于虚拟内存的一些知识,但是涉及到CPU的知识点只是简单提了下,如果真的需要看看我的理解,朋友们可以告诉我,后面可以补上,虽然不一定是正确或者非常好,但是每个人有每个人的理解,学习的思维是可以的借鉴的。

原创首发于头条号,作者:小黄鸡软件

最后,感谢小伙伴们的阅读和关注,谢谢!

,