内存管理章节围绕分页机制展开,通过分页管理方式在物理内存大小基础上提高内存的利用率。再进一步引入请求分页管理方式(虚拟内存),使得内存脱离物理大小的限制,从而提高处理器的利用率。
需要思考以下问题:
为什么要进行内存管理?
页式管理中每个页表项大小的下限怎么决定
多级页表解决了什么问题,又会带来什么问题?
在学习经典的管理方法时,注意比较,本节给出的内存管理是循序渐进的,后一种方法会解决前一种方法的不足,着重掌握页式管理。
操作系统必须对内存空间进行合理的划分和有效的动态分配。
有效的内存管理不仅方便用户使用存储器,提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。
在进行具体的内存管理之前,需要了解一下进程运行的原理
1.程序装入和链接
创建进程首先需要把程序和数据装入内存,将用户的源程序变为可在内存中执行的程序,通常需要以下的步骤
1编译
2链接
3装入
程序的链接有以下的三种方式
静态链接:在程序运行前,先将各目标模块及它需要的库函数链接成一个完整的可执行程序,以后不再拆开
装入时动态链接
将用户源程序编译后得到的一组目标模块,在装入内存时,采用边装入边链接的方式。
运行时动态链接:
对某些目标模块的链接,是在程序执行中需要该目标模块时才进行。优点是便于修改和更新,便于实现目标模块的共享
内存的装入模块装入内存同样有以下三种方式
1绝对装入
在编译时,若知道程序驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。
2可重定位装入
在多道程序环境下,多个目标模块的起始地址通常从0开始,程序的其他地址都是相对于始址的。此时应采用可重定位装入方式,根据内存当前情况,将装入模块装入内存的适当位置。
装入时对目标程序中的指令和数据的修改过程叫做重定位。
地址变换通常是装入时一次性完成的,所以又称为静态重定位。
静态重定位的特点是,一个作业装入内存时,必须给它分配要求的全部内存空间,若没有,则不能装入。作业一旦进入内存,整个运行期间都不能在内存中移动,也不能在申请内存空间。
3动态运行时装入
程序在内存中若发生移动,则需要采取动态的装入地址。装入程序把装入模块装入内存后,并不立即把装入模块的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行,因此装入内存后的所有地址均为相对地址。需要一个重定位寄存器的支持。
特点如下:可以吧程序分配到不连续的存储区,在程序运行前只装入它的部分代码即可投入运行。在程序运行期间,根据需要动态申请分配内存,便于程序段的共享,可以给用户提供一个比存储空间大得多的地址空间。
2逻辑地址空与物理地址空间
编译后,每一目标模块都从0号单元开始编址,是该目标模块的相对地址。
当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。
不同进程可以有相同的逻辑地址,这些相同的逻辑地址可以映射到主存的不同位置。
物理地址指的是内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最终都是要通过物理地址从主存中存取。
当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换为物理地址,这个过程叫做地址重定位。
3内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。
内存保护可采取以下两种方式
1 CPU中设置一对上下限寄存器,存放用户作业在主存中的下限和上限地址,每当cpu要访问一个地址时,分别和两个寄存器的值相比,判断有无越界
2 采用重定位寄存器和界地址寄存器来实现这种保护。
重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器。内存管理机构动态地将逻辑地址和界地址寄存器进行比较,如果没发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
Cpu调度程序选择进程执行时,派遣程序会初始化重定位寄存器和界地址寄存器。每一个逻辑地址都需要和这两个寄存器进行核对,以保证操作系统和其他用户程序不被该进程运行影响。
注意两个寄存器区别:界地址寄存器是比较,重定位是+
原文:https://www.cnblogs.com/yizhizhangBlog/p/14229057.html