本章总结:
- 内存管理简介
- 多程序设计建模
- 固定分区的内存管理
内存管理:
计算机系统中的一种技术,用于有效地分配、跟踪和释放内存资源,以满足程序的需求并避免内存泄漏和内存碎片化。
内存管理简介
内存层级
计算机通常具有内存层次结构:
- 寄存器,L1/L2/L3缓存
- 主存储器(RAM)
- 磁盘
“高级内存”更快、更昂贵且易失性强,“低级内存”更慢、更便宜且非易失性强
操作系统提供了一个内存抽象
内存可以看作是字节/字(bytes/words)的线性数组
操作系统的责任
- 当进程请求时分配/释放(allocate/deallocate)内存
- 跟踪已使用/未使用的内存
- 在进程之间分配内存并模拟一个“无限大”的内存空间
- 应用多道程序设计时的控制访问
- 显式地将数据从内存移动到磁盘,反之亦然
内存管理方法
内存管理的历史:内存管理随着时间的推移而发展
历史重演:
- 现代消费电子产品通常需要不那么复杂的内存管理方法
- 许多早期的想法支撑了更现代的内存管理方法(例如:搬迁(relocation))
分区(Partitioning):连续vs.非连续

连续内存管理模型在单个块中分配内存,没有任何漏洞或间隙
非连续内存管理模型:
- 在多个块或段中分配内存
- 可以放置在物理内存中的任何位置(即,不一定彼此相邻)
连续的方法
1. 单编程(Mono-programming):为用户进程设置一个单独的分区
2. 使用固定分区进行的多路编程(Multi-programming)
- 固定大小相等的分区
- 固定大小不等的分区
3. 使用动态分区进行的多路编程
单编程
无内存抽象
在任何时间点,只有一个用户进程在内存中/执行(没有多编程)
一个固定的内存区域分配给OS/kernel,剩余的内存被保留给单个进程(MS-DOS就是这样工作的)
这个进程直接访问物理内存(即不发生地址转换)。
每个进程都被分配连续的内存块,即它不包含“漏洞”(“holes”)或“间隙”(“gaps”)。
整个内存空间被分配给一个进程
进程总是位于相同的地址空间
不同用户进程之间不需要保护(一个进程)
覆盖使程序员能够使用比可用内存更多的内存(对程序员的负担)
单程序设计的缺点:
- 由于进程可以直接访问物理内存,所以它可以访问操作系统内存
- 操作系统可以看作是一个进程——所以我们有两个进程
- 硬件资源利用率低(CPU、I/O设备等)
- 在现代机器上可以进行多道程序设计
在基本的嵌入式系统和现代消费电子产品中,如洗衣机、微波炉、汽车的ecu等,直接存储器访问和单编程是很常见的。
模拟Multi-Programming
通过交换(swapping)模拟多编程
- 将进程交换到磁盘并加载一个新磁盘(上下文切换将变得非常耗时)
- 在同一进程中应用线程(仅限于一个进程)
假设多路编程可以提高CPU利用率?直觉上,这是对的。我们如何建立这个模型?
多路编程
概率模型
内存中有n个进程
一个进程花费百分之p的时间等待I/O
CPU利用率计算为:1减去所有进程等待I/O的时间:
- 例如,p = 0.9,则CPU利用率= 1 - 0.9 ⇒ 0.1 (1 - p)
所有n个进程都在等待I/O(即CPU空闲)的概率是,即 p ×p ×p…
CPU利用率由1− 给出

在I/O等待时间为20%的情况下,四个进程几乎可以实现100%的CPU利用率 (1−)
在I/O等待时间为90%的情况下,10个进程可以实现大约65%的CPU利用率 (1−)
随着进程数量的增加,CPU 利用率会上升;而随着 I/O 水平的提高,CPU 利用率则会下降。
假设:
- 一台计算机有1MB的内存
- 操作系统占用200KB,为4个200KB的进程留出空间
然后:
- 如果我们有80%的I/O等待时间,那么我们将实现不到60%的CPU利用率(1 -
)
- 如果我们增加1 MB内存,它将允许我们运行另外5个进程
- 我们可以实现大约87%的CPU利用率(1−
)
- 如果我们添加另一个兆字节的内存(14个进程),我们会发现CPU利用率将增加到约96%(1−
)
多编程确实能够提高资源利用率 ⇒ 内存管理应该支持多程序设计
警告:
- 这个模型假设所有的进程都是独立的,这是不正确的
- 更复杂的模型可以使用排队理论来构建,但我们仍然可以使用这个简单的模型来进行近似预测
排队论 (queuing theory):
或称随机服务系统理论, 是通过对服务对象到来及服务时间的统计研究,得出这些数量指标(等待时间、排队长度、忙期长短等)的统计规律,然后根据这些规律来改进服务系统的结构或重新组织被服务对象,使得服务系统既能满足服务对象的需要,又能使机构的费用最经济或某些指标最优。
固定大小相等的分区
将内存划分为具有固定大小和固定位置的静态、连续和大小相等的分区
- 任何进程都可以占用任何(足够大的)分区
- 为进程分配固定大小相等的分区是容易解决的
- 开销很小,实现简单
- 操作系统跟踪哪些分区正在使用,哪些是空闲的
静态等大小分区的缺点:
- 低内存利用率和内部存储残片:分区可能不必要地大内存碎片_百度百科 (baidu.com)
https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E7%A2%8E%E7%89%87/3883950#2-1 - 如果程序不适合分区,则必须使用覆盖(程序员负担)

固定大小不相等的分区
将内存划分为具有固定大小和固定位置的静态、不相等大小的分区
- 减少内部碎片
- 必须仔细考虑将进程分配到分区

固定分区(分配方法):

每个分区一个私有队列:
- 将每个进程分配到适合它的最小分区
- 减少内部碎片
- 是否会降低内存使用率(例如,大量小作业导致未使用的大分区)并导致内存耗尽(starvation)
所有分区的单个共享队列可以将小进程分配给大分区,但会导致内部碎片增加
856

被折叠的 条评论
为什么被折叠?



