操作系统概念阅读笔记8
##内存管理
背景
- CPU所能直接访问的存储器只有内存和处理器内的寄存器。机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数
- 为了协调CPU高速与内存访问的相对低速,高速缓存技术应运而生
- CPU所生成的地址通常称为逻辑地址,而内存单元所看到的地址(即加载到内存地址寄存器中的地址)称为物理地址。编译和加载时的地址绑定方法生成相同的逻辑地址和物理地址。但是,执行时的地址绑定方案导致不同的逻辑地址和物理地址。
- 由程序所生成的所有逻辑地址的集合成为逻辑地址空间,所有物理地址的集合成为物理地址空间
- 运行时从虚拟地址到物理地址的映射是由被称为内存管理单元(MMU)的硬件设备来完成的。
- 采用动态加载时,一个子程序只有在调用时,才被加载。所有子程序都以重定位的形式保存在磁盘上。
交换
交换需要注意的是:
- 不能换出有待处理I/O的进程
- I/O操作的执行只能是用操作系统缓冲区
连续内存分配
内存通常分为两个区域:1.用于驻留操作系统 2.用于用户程序
内存映射
重定位寄存器含有最小的物理地址值;界限地址寄存器含有逻辑地址的范围值。
内存分配三种方法
- 首次适应:分配第一个足够大的孔
- 最佳适应:分配最小的足够大的孔
- 最差适应:分配最大的孔
碎片
-
内部碎片
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;(分配后,一个块剩余空闲部分)
内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
-
外部碎片
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。(多个小空闲块组成,其累加和可用于分配,单个却一般却无法满足需求) 解决方法:紧缩或允许物理地址空间为非连续
分页
分页内存管理方案允许进程的物理地址空间可以是非连续的。分页避免了将不同大小的内存块匹配到交换空间上这样的麻烦。
基本方法
- 将物理内存分为固定大小的帧,将逻辑内存也分为同样大小的块,称为页
-
采用分页技术不会产生外部碎片,但有内部碎片
-
快表 TLB
页表结构
层次页表
哈希页表
反向页表
分段
逻辑地址空间是由一组段组成的。每个段都有名称和长度。地址指定了段名称和段内偏移。用户可通过两个量来指定地址:段名称和偏移。(分页中,为页码和偏移)
典型例题
8.1
解释内部碎片和外部碎片的区别?
内部碎片是指分配一个页后,(页大小大于实际需求)该页剩余的空闲部分。 外部碎片是由一系列未分配的页组成,这些页的空间非常小无法满足一个进程的需要,但是如果将所有的页的内存空间累加起来能满足进程需要。
8.3
按顺序给出 5 个部分的内存,分别是 100KB,500KB,200KB,300KB 和 600KB,用 firstfit,best-fit 和 worst-fit 算法,能够怎样按顺序分配进程 212KB,417KB,112KB, 和 426KB?哪个算法充分利用了内存空间? Answer:
a. First-fit:
b. 212K is put in 500K partition
c. 417K is put in 600K partition
d. 112K is put in 288K partition (new partition 288K = 500K − 212K)
e. 426K must wait
f. Best-fit:
g. 212K is put in 300K partition
h. 417K is put in 500K partition
i. 112K is put in 200K partition
j. 426K is put in 600K partition
k. Worst-fit:
l. 212K is put in 600K partition
m. 417K is put in 500K partition
n. 112K is put in 388K partition
o. 426K must wait
Best-fit: 算法充分利用了内存空间。
####8.9 考虑一个分页系统在内存中存储着一张页表。a.如果内存的查询需要 200 毫秒,那么一个分页内存的查询需要多长时间?b.如果我们加上相关联的寄存器,75%的页表查询可以在相关联的寄存器中找到,那么有效的查询时间是多少?(假设如果入口存在的话,在相关的寄存器中找到页表入口不花费时间)
- 一次页表访问需要先查找页表,再查找内存中的字。200*2=400ns
- 0.75*200+0.25*200*2=250ns