概述
一、虚拟地址概念由来
早期计算机中,程序直接运行在物理内存,也就是说,程序在运行时所访问的地址都是物理地址。那么如果一台计算机只运行一个程序,只要这个程序要求的物理内存空间不超过物理内存的大小,就不会出问题。
但是!为了高效利用硬件资源(CPU、内存、IO设备),计算机一定要同时运行多个程序,那么多个程序直接运行在物理内存上,可能会出现不可描述的未知错误,比如:“如何将计算机有限的内存分配给多个程序”就是一个大问题。
举例:
假设某台计算机有128MB的内存,程序a运行需要10MB,b需要100MB,c需要20MB。同时运行a,b,比较直接的做法是将内存的前10MB给a程序,10MB~110MB给b。这样的话,就会出现问题。
1.地址空间不隔离
abc直接访问物理地址,程序所使用的内存空间不隔离。那么恶意程序就可以改写其他程序的内存数据,以达到破幻目的。或者程序不小心修改额其他程序的数据,会导致其他程序崩溃。
2.内存使用率低
由于没有内存管理机制,通常需要一个程序执行时,监控程序就将整个程序装入内存中然后开始执行。如果我们忽然要运行c程序,内存不够了,这时可以用交换分区解决:将其他程序写入磁盘空出内存,再运行c,c运行完再将磁盘中数据。大量的数据换入换出,导致效率低下。
3.程序运行时的地址不确定
程序每次需要装入运行时,需要给它从内存中分配一块足够大的空闲区域,这个空闲区域的位置不确定。这就带来了问题。
因为程序编写时,它访问数据和指令跳转时的目标地址很多是固定的,这就涉及到重定位问题。
为了解决这几个问题,思路就是:增加中间层,使用一种间接的地址访问方法。把程序给出的地址看作是一个虚拟地址,然后通过某些映射的方法,将虚拟地址转化为实际的物理地址。这样只需要控制好这个虚拟地址到物理地址的映射过程,就可以保证任意一个程序所访问的物理地址内存区域 和 另一个程序 互相不重叠,就达到地址空间隔离的效果。
------------------------------------------------
说回到我们现在的计算机,我们知道每个进程都有4G的虚拟地址空间?
怎么来的呢?
是因为在32位的机器中(32位说的是CPU硬件),有32根计算机地址线,那么物理地址就有4GB,那如果内存只有1G呢?
只是说有效的物理地址空间是1G,其他的是无效的存在。
----------------------------------------------
要把虚拟地址空间映射到物理地址(装载的概念)就要涉及到分段、分页的概念了。
这一部分就是操作系统要去做的事情了,涉及到页映射,页装载,及其映射的算法:FIFO先进先出、LUR最少使用......
二、分段和分页(可参考https://blog.csdn.net/QX_a11/article/details/89338810)
1.分段什么意思?
把程序所需大小的虚拟空间 映射到 物理地址上。
举例:
程序a需要10MB的内存空间,我们现在有a程序的虚拟空间,地址从0x00000000到0x00A00000 (大小10MB),然后从物理内存上划分出一个10MB的物理地址,假设是0x00100000到0x00B00000,然后把这两个10MB的虚拟空间和物理空间 一一映射(虚拟空间中的每个字节对应到物理内存空间上)。
结果:分段解决的地址隔离问题和运行时地址不确定的问题,但是解决不了效率低下(如果内存不足,就要换进换出)。怎么办?分页...
2.分页:
基本方法:把地址空间等份分成固定大小,每一页的大小由硬件决定,目前绝大多数PC中,设定为为每页4KB。
把进程的地址空间按页分割,把常用的数据和代码装载到内存中,把不常用的代码和数据保存在磁盘中,当需要用到时再把磁盘中的页取出来。
如图有两个进程:进程1和进程2,每个进程分割成8个页,中间的物理内存只能分割成6个页(硬件大小决定);
进程1的0、1、7号页分别映射到物理内存上的0、2、3号页,有的部分页在磁盘上,有的页没有被访问到。
虚拟空间中的页叫做虚拟页,物理内存上的页叫做物理页。图中的带箭头的线就是映射关系。
虚拟存储的实现需要依靠硬件的支持,几乎所有的CPU都采用MMU的部件来进行映射,,如下图:
页映射模式下,CPU发出虚拟地址,经过MMU转换以后变成物理地址。
关于MMU:Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。
最后
以上就是冷静航空为你收集整理的【读书笔记】虚拟地址的概念?分页分段的概念的全部内容,希望文章能够帮你解决【读书笔记】虚拟地址的概念?分页分段的概念所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复