目录
1.虚拟内存空间解决了什么问题?
闲谈:在研究虚拟地址空间,看到了一篇博客,说:在看到一项技术时,如果直接去看他的概念、用法、而忽视了他对比以前的技术有什么提升,解决了了以前技术中的哪些问题,这样是很不负责的。
正题:在计算机技术发展的早期,通常程序是直接访问物理地址的,只要程序需要的内存大小不超过物理内存空间大小就不会出错,我们就不用考虑内存管理这个麻烦的事。但现在我们能看到,我们周围的大多数计算机都是多进程运行。这时候问题就来了,假设现在物理内存有128M,1号进程需要10M进程,2号进程需要100M进程,3号进程需要20M进程,这时候我们可同时运行1,2号进程,1号进程占用0-10M内存地址,2号进程占用11-100的内存地址。这时候,如果还想运行3号进程,如果直接在物理内存上运行时,就不能实现了。于是乎,为了解决这个问题,产生了虚拟内存技术。暂时将不用的数据存储在硬盘中了。但这个方法也有一些缺点
- 物理内存不隔离:所有程序直接访问物理内存,如果有一些恶意代码,会非常容易干扰正常运行的其他代码。
- 内存使用效率低下:如果我们要像让程序1、2、3、同时运行,那么唯一的方法就是使用虚拟内存技术将一些程序暂时不用的数据写到磁盘上,在需要的时候再从磁盘读回内存。这里程序3要运行,将1交换到磁盘上去显然是不行的,因为程序是需要连续的地址空间的,程序3需要20M的内存,而1只有10M的空间,所以需要将程序2交换到磁盘上去,而B足足有100M,可以看到为了运行程序3我们需要将100M的数据从内存写到磁盘,然后在程序B需要运行的时候再从磁盘读到内存,我们知道IO操作比较耗时,所以这个过程效率将会十分低下。
2.LINUX虚拟内存空间结构
- LINUX采用的内存管理机制通过管理虚拟内存地址来管理程序的内存使用权限
-
虚拟内存空间采用映射原理,在一个程序运行时,LINUX操作系统会给每一个程序分配一个虚拟内存空间,这个内存空间都是从(内存为4g时)0x00 00 00 00 开始到0x ff ff ff ff 。而这个虚拟内存空间会通过硬件映射到真实的地址空间,这样就解决了进程间相互干扰的问题。这个虚拟内存空间和物理地址空间通过页表映射。
- 这个虚拟地址空间大概被分
名称 | |
代码段(Date) |
可执行代码,字符串字面值,只读变量 |
数据段/已初始化常量区 | 已初始化且初值非0的全局变量和静态局部变量 |
未初始化常量区(BSS) | 未初始化或初始化为0的全局变量和静态局部变量 |
堆 | 动态分配的内存 |
栈 | 局部变量,函数参数,返回值地址等 |
3.页表
- 我们可以通过页表就能实现每个进程的独立空间访问,不至于越界,而且也可以充分利用内存资源,将虚拟地址空间以512Byte ~ 8K,作为一个单位,称为页,并从0开始依次对每一个页编号。这个大小通常被称为页面
- 将物理地址按照同样的大小,作为一个单位,称为块,也从0开始依次对每一个框编号。 操作系统通过维护一张表,这张表上记录了每一对页和框的映射关系
-
若:CPU访问的虚拟地址:A
页面:L
页表号:(A/L)
页内偏移:(A%L) - MMU为硬件,使用硬件实现更加高效
来源:CSDN
作者:第一视角丶
链接:https://blog.csdn.net/weixin_43747178/article/details/103767615