内存管理
约 1740 字大约 6 分钟
2025-05-16
概述
内存管理概念
内存管理的基本原理和要求
内存管理:操作系统必须对内存空间进行合理的划分和有效的动态分配。
内存管理的主要功能有:
- 内存空间的分配和回收
- 地址转换
- 内存空间的扩充
- 内存共享
- 存储保护
详细内容请继续往下看!
逻辑地址和物理地址
简单来说,逻辑地址就是程序员使用的,是虚假的,便于理解的,而物理地址是真正在内存中的地址,需要OS将逻辑地址转化得到的, 上层程序员不需要知道,是透明的。
程序在经过编译后,每个模块都是从0开始编址的,这些地址称为逻辑地址,当链接程序将各个模块链接为 一个可执行的程序时,需要将各个模块中的逻辑地址转换为物理地址,这个过程称为地址重定位。
逻辑地址方便了编程人员,也是用户和编程人员只用关心的,因为转换工作OS会自动处理好,而物理地址是真实在内存中的地址,进程运行时 需要的指令和数据都得从内存对应的物理地址上去取得。
需要说明的是:OS通过内存管理部件(MMU)将进程使用的逻辑地址转换为物理地址。进程使用虚拟内存空间中的地址, OS在相关硬件的协助下,将它转换物理地址。逻辑地址通过页表映射到物理地址,页表由OS维护并被处理器使用。
程序的链接和装入
将用户源程序变为可以在内存中执行的程序需要经过以下步骤:
- 编译:用编译程序将用户源代码编译为若干个目标模块
- 链接:用链接程序将若干个目标模块和目标模块需要的库函数链接在一起,形成一个完整的装入模块
- 装入:将装入模块转入到内存运行
比如编译运行C语言时,总会引用多个头文件,链接程序就会将我们引用的头文件和自己写的代码链接在一起。
在将目标模块链接时和将装入模块转入内存时,是有多种方式的。
将目标目标模块链接时
- 静态链接:在程序运行前,就已将链接完成了,以后不会再分开。
- 动态链接:在装入时,边装入边链接,便于修改和更新,便于实现对目标模块的共享。
- 运行式动态链接:执行到哪个模块才链接哪个模块,凡是程序执行时没有用到的目标模块都不会链,可以加快程序的装入过程和节省内存空间。
将装入模块转入内存时
- 绝对装入:在编译时就知道了程序将放到内存中的哪个位置,程序中的逻辑地址和物理地址完全相同。
- 可重定位装入(静态重定位):程序中使用的指令和数据的地址都是相对于起始地址而言的逻辑地址。可以选择装入内存中的位置,但是已装入就得全部装入,一旦装入就不能在内存中移动和申请内存空间了。
- 动态运行时装入(动态重定位):这种方式可以让程序在内存中移动,装入程序将装入模块装入内存后,并不会立即将装入模块中的逻辑地址转换为物理地址,而是将这种转换推迟到程序真正需要运行时才进行。
2和3都可以决定在内存中的位置,但是2是一次性全部装入,且装入内存后不可以移动,是固定的。3的实现需要一个重定位寄存器,在装入时,会将逻辑地址加上重定位寄存器中的值, 所以是可以在内存中不停的改变位置,是动态的,灵活的。
进程的内存映像
程序被调入内存时,在内存中的资源组成了该进程的内存映像。
进程的内存映像包括:
- 代码段
- 数据段
- 进程控制段
- 堆
- 栈
内存保护
在分配内存时,不能让OS受到用户进程的影响,也不能让用户进程受到另一个用户进程影响。换句话说,OS给进程分配了内存,该进程就只能访问这个内存空间,不能越界。
有两种保护方式,但是核心思想是一样的。
第一种:设置上、下限寄存器,用于存放用户进程在内存中的上、下限地址,每当CPU要访问内存时,要通过上、下寄存器判断是否越界。
第二种:设置 重定位寄存器(基址寄存器) 和 界地址寄存器(限长寄存器),前者保存进程的起始内存地址,后者保存进程最大的逻辑地址。
加载重定位寄存器和界地址寄存器必须使用特权地址,所以只有OS才能加载和修改这两者。
内存共享
内存分配与回收
总体来说是从连续分配到离散分配,这样提高了内存利用率。
连续分配中有:单一连续分配、固定分区分配、动态分区分配。
离散分配中有:页式存储管理、段式存储管理、段页式存储管理。
离散分配可用于虚拟内存技术的实现!
连续分配管理方式
基本分页存储管理
基本分段存储管理
段页式存储管理
虚拟内存管理
虚拟内存的基本概念
请求分页管理方式
页框分配
页面置换算法
最佳置换算法(OPT)
先进先出置换算法(FIFO)
最近最久未使用置换算法(LRU)
时钟置换算法(CLOCK)
抖动和工作集
抖动是在页面置换过程中,刚刚把一个页面换入马上又要换出,换出后又要马上换入,这种频繁的页面调度行为。
其根本原因是:分配给进程的物理块太少了,不能满足进程正常运行的基本要求,导致频繁地换页。
出现抖动的后果是很严重的,会导致磁盘I/O操作大量增加,CPU时间都用去换页,真正工作用的时间很少,使得 CPU利用率大大降低。
虚拟存储器性能影响因素
更新日志
版权所有
版权归属:代码・生 活・THINKING