存储管理疑惑总结
扫描二维码
随时随地手机看文章
内存的分配和回收
内存的分配是为进入系统准备运行的程序分配内存空间,内存的回收是当程序运行完成后回收所占用的空间,系统为了完成这个功能,必须跟踪记录内存空间的使用情况,按照一定的算法为进程分配和回收空间。
分配存储方案的因素:
存储空间的描述结构:系统采用某种数据结构登记当前的内存使用情况以及空闲区的分布情况,供存储分配使用。每次分配回收要修改这些数据。
分配的策略:确定安装内存的分配和回收算法,好的算法既能满足进程运行需要,又能充分利用内存空间。
存储地址变换
用户编程的时候无法预知确定程序在内存的位置,只能采用逻辑地址编程,程序运行的时候把程序的逻辑地址转换为实际地址,由内存管理模块与硬件的地址变换机构共同完成。
1.符合地址
高级语言编程使用符号名,比如函数名,变量名语句标号来表示操作对象或者转移的地址,高级语言使用的空间是符合地址
2.逻辑地址
编译程序将源代码的语句逐条翻译为机器指令,为每个变量分配存储单元,并利用存储单元地址替换变量名,这些指令和数据顺序存放在一起,从0开始编排地址,形成目标代码,目标代码所占据的地址范围称为逻辑地址空间,范围0~n-1,n是目标代码长度,逻辑地址空间的地址称为逻辑地址或者相对地址。
3.物理地址
物理内存由一系列的内存单元组成,这些内存单元从0开始按字节编址,称为内存地址,当目标程序加载到内存里时候,所占据的实际内存空间就是它的物理存储空间,物理空间不会从0开始,因为内存的低端地址通常被操作系统占据,对比下图可以理解。逻辑地址空间i的地址是96,真正的物理内存空间时1120.
现在程序地址的变换采用的是动态变换,程序装入内存的是不进行变换,在执行过程遇到逻辑地址,地址变换机构进行地址转换,然后再执行指令,特点是程序在内存中可移动,可共享。
内存保护
1.虽然内存的容量不断提高,对应用来说还是不足,扩充存储器空间的基本思想是借用外来存储空间扩展内存空间,方法是先让程序的部分代码进入内存,其他放在外存,需要的时候再调入内存。实现方式有三种
1.覆盖技术
将程序分为几个模块,重要的先进入内存,不重要的等需要的时候再进入,不重要的共享一些内存空间,用的时候覆盖掉某个暂时不用的块。缺点是编程的时候必须对程序进行模块划分,复杂。不好
2.交换技术
多个程序并发执行的时候,往往有些程序因为等待某个事件暂时不能运行,如果将暂时不执行的程序放入外存,和覆盖不一样的是交换技术是以进程为单位的,优点是增加了程序并发的程序数目,对程序结构没有要求,缺点是对整个进程换入换出操作浪费很多时间。
3.虚拟存储器
以上两种内存扩充技术都不是虚拟存储技术,在编程人眼中,看到的还是实际内存的大小,虚拟存储技术原理是将程序的部分代码调入内存,其余驻留在外存,需要时候调入,程序的代码的换入换出完全由系统完成,用户看到的是一个比实际内存大得多的内存。
程序局部性原理
实验证明,程序运行的过程中,CPU不是随机的访问整个程序或者数据范围,而是在一个时间段内只集中访问程序或数据范围,这种特性称为局部性原理,局部性原理表明在进程运行的某个较短的时间内进程地址空间只有部分是活动的,其余处于不活动状态,可能长时间不会用到比如初始化和终止代码,也可能根本不会用到,比如错误处理代码。它们完全没有必要在内存驻留,只有当需要的时候在被调入内存,可见局部性使得虚拟存储成为可能。
虚拟存储器原理
利用外存模拟内存,在外存开辟一个大的存储空间,叫做交换区,进程启动后部分代码进入内存,其余的留在外存交换区,需要时候调入,和覆盖不一样的是覆盖是用户有意识的进行,看到的内存大小还是原来内存大小,虚拟存储技术里,内存和交换空间之间的交换完全是系统动态完成,应用程序不会发觉,进程看到的是一个比实际内存大得多的虚拟内存。与交换技术不同的是交换是以进程为单位,进程映像大小受实际内存的限制,虚拟存储进程的逻辑空间可以超越实际内存容量的限制。
读写硬盘速度慢,访问虚拟存储器速度比访问真正的内存慢,以时间换空间,虚拟存储器大小也受到地址寄存器位数限制。32位计算机,可访问内存的上限是4GB。
虚拟存储器的实现技术
有虚拟页和虚拟段存储
下面介绍虚拟页存储
VM系统将虚拟存储器划分为虚拟页,固定大小处理数据,类似的物理存储器也分割为物理页,大小一样。
MMU利用页表实现对虚拟内存的管理,CPU里面的虚拟基址寄存器指向当前的页表,n位虚拟地址包含两个部分,一个是p为的虚拟地址偏移,一个是n-p位的虚拟页号,MMU利用虚拟页号选择适当的页表项,比如VPN0对应PTE0,依次类推,如果没有发生缺页异常,就可以根据根据PTE里面的物理页号和虚拟偏移量组合得到的物理地址。因为物理页的大小和虚拟页一样,所以偏移量也正好相当。
页表命中过程
处理器生成一个虚拟的地址,传送给MMUMMU生成PTE地址,并从高速缓存或者主存请求得到它高速缓存或者主存向MMU返回PTEMMU构造物理地址,并把它发送给主存或者高速缓冲高速缓存或者主存把返回请求的数据返回给处理器
页表不命中过程
处理器生成一个虚拟的地址,传送给MMUMMU生成PTE地址,并从高速缓存或者主存请求得到它高速缓存或者主存向MMU返回PTE因为PTE的有效位是0,触发异常,进行异常处理缺页处理程序从主存确定一个要牺牲的页,如果这个页被修改了,就把它重写回磁盘。缺页处理程序页面调入新的页面,并更新PTE缺页处理程序返回原来的进程,再次执行导致缺页的命令,CPU将原来的虚拟页再次发给MMU,因为这次已经缓存了所以不会产生异常。进程地址空间管理
地址空间映射
文件映射:进程的静态镜像以可执行文件的形式驻留在硬盘,在创建进程的时候要构造地址空间,方法是用可执行文件的相应的部分内容构建虚存区,映像不是被调入虚存区,而是在映像文件和虚存区之间建立地址映射这就是文件映射。建立映射的时候text区和data区被映射到磁盘上的可执行文件,stack区无须映射,BSS和heap为匿名映射不和任何实际文件建立对应的映射,BSS和heap的映射对象是一个抽象的“零页“文件,映射到零页文件的区将全是0.上述图非虚存区是不可用的,唯一的例外是栈,栈的空间会随着程序执行动态的增长,栈大小低于上限(通常是8M)是可以增长的,超出会栈溢出造成程序终止。
页表映射:
页表映像:文件映像只是将文件里面的映像映射到额虚存空间,进入物理内存的映像则是通过也表来映射的,建立了页表映射的地址空间是进程实际占用的可以直接访问的部分,就是图中提到的已经分配的。内核里有一个独立的内核页表,用来映射内核空间到物理存储的低1G空间,进程运行在用户空间的时候使用进程页表,陷入内核使用内核页表。