思维导图

操作系统 —— 内存管理_寄存器
有需要可以下载:内存管理思维导图PNG

内存的基础知识

  • 进程应该放在内存的哪里?
  • 操作系统如何记录哪些内存区域已经被分配了,哪些还空闲?
  • 当进程运行结束之后,如何将进程占用的内存空间释放?
  1. 操作系统负责内存空间的分配与回收
  2. 操作系统需要提供某种技术从逻辑上对内存空间进行扩充
  3. 操作系统需要实现地址转换功能,负责程序的逻辑地址和物理地址的转换
  4. 操作系统需要提供内存保护功能,保证各进程在各自存储空间内运行, 互不干扰

什么是内存?

内存是用于存放数据的硬件
程序执行前需要先放到内存中才能被cpu处理

存储单元

如果计算机"按字节编址", 每个存储单元大小为 8 bit
如果计算机"按字编址", 每个存储单元大小为 16 bit

逻辑地址和物理地址

指令的编指一般采用逻辑地址,即相对地址
物理地址 = 起始地址 + 逻辑地址

编译、链接、装入

编译

由编译程序将用户源代码编译成若干个目标模块

链接

由连接程序将编译后形成的一组目标模块以及所需函数连接在一起, 形成一个完整的装入模块

链接的三种方式 :
  1. 静态链接
  2. 装入时动态链接
  3. 运行时动态链接

静态链接
在程序运行之前,先将各目标模块以及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。

装入时动态链接
将各目标模块装入内存时,边装入边链接的链接方式。

运行时动态链接
在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

装入

由装入程序将装入模块装入内存运行

为了使编程更方便,程序员写程序时应该只需关注指令、数据的逻辑性。而逻辑地址到物理地址的转换(这个过程称为地址重定位),应该由操作系统负责,这样就保证了程序员写程序时不需要关注物理内存的实际情况。

装入的三种方式:
  1. 绝对装入
  2. 静态重定位
  3. 动态重定位

绝对装入

在编译时,如果知道程序将放到内存的哪个位置,编译程序将产生绝对地址的目标代码, 装入程序按照装入模块中的地址,将程序和数据装入内存【灵活性低, 只适合单道程序环境,无操作系统】

静态重定位

又称为可重定位装入。 编译, 链接后的装入模块地址都是从 0 开始的,指令中使用的地址和数据存放的地址都是相对于起始地址而言的逻辑地址。可以根据内存的当前状况将装入模块装入到内存的适当位置。装入时对地址进行"重定位",逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。【早期多道批处理系统】

动态重定位

装入程序把装入模块装入内存后不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器(存放装入模块的起始位置)的支持。【现代操作系统】

内存保护

上、下限寄存器

在CPU设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。

重定位寄存器、界地址寄存器

采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址

内存空间的扩充

覆盖与交换

覆盖, 交换, 虚拟存储技术常用于实现内存空间的扩充

覆盖技术

覆盖技术的思想:将程序分为多个段,常用的段常驻内存,不常用的段在需要的时候调入内存

内存中分为一个"固定区" 和若干个"覆盖区",常用的段放在固定区,不常用的段放在覆盖区

缺点:必须由程序员声明覆盖结构, 对用户不透明, 增加了用户的编程负担,覆盖技术只用于早期的操作系统中。