[工学]06第六章-存储管理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章 存储管理
6.1 存储管理功能 6.2 内存资源管理 6.3 存储管理方式 6.4 外存空间管理 6.5 虚拟存储系统
6.1 存储管理功能
内存/外存的管理; 内/外存管理采用相同
或相似的管理技术; 功能
存储分配 存储共享 存储保护 存储扩充 地址映射
6.1 存储管理功能(Cont.)
可能需要合并空闲区。
6.2.2.2 动态异长分区的分配(Cont.)
最先适应算法(First Fit) :
空闲区首址 空闲区长度
128
64
空闲区: 首址递增排列; 申请: 取第一个可满足区域 ;
256
32
优点: 尽量使用低地址空间,
1024
256
高区保持大空闲区域。
0
……
……
空闲区表
缺百度文库: 可能分割大空闲区。
进程空间
0:
……
……
限长寄存器 首址寄存器
L
b
内存空间 ……
b:
……
……
<逻辑地址> ……
L-1: ……
a CMP
越界中断
+ b+a
<物理地址>
L
……
b+L-1:
……
……
步骤 : ⑴ 由程序确定逻辑地址 a ;
⑵ a与 L 比较判断是否越界,不满足: 0≤a≤L-1,越界;
⑶ a与 b 相加得到物理地址。
如申请32将分割第一个区域。
6.2.2.2 动态异长分区的分配(Cont.)
最佳适应算法(Best Fit) :
空闲区首址 256 128
空闲区长度 32 64
空闲区: 空闲区长度递增排列 ; 申请: 取最小可满足区域 ; 优点: 尽量使用小空闲区,
1024
256
保持大空闲区域。
0
……
……
空闲区表
6.3.1 界地址管理方式(Cont.)
双对界 代码区域: 首址寄存器、限长寄存器 ; 数据区域: 首址寄存器、限长寄存器 ; UNIX : 代码I空间、数据D空间。
交换与重定位 交换: 换入(swap-in)/换出(swap-out) ; 滚入(roll-in)/滚出(roll-out) ; 交换的基本单位为整个进程。 可重定位程序: 程序编址与内存存放位置无关 ; 浮动程序: 满足重定位要求的程序,如0起始编址。 重定位: 换入程序需重定位。
if ( bp -> m_size >= size ) { a= bp -> m_addr ; bp -> m_addr += size ; if (( bp -> m_size -= size ) == 0) //当前块=size do { bp ++; //do循环压缩size=0的存储表项 (bp-1) -> m_addr = bp -> m_addr ; } while((bp-1)->m_size = bp -> m_size); return(a); //分配成功,返回分配存储块的首地址 }
存储分配/去配 记录内/外存资源的使用情况: 分配表、空闲表 ; 分配/去配对象 内存、外存(相同方法) ; 分配/去配时刻 进程创建、撤销、交换、长度变化(栈溢出, execl)
存储共享 多个进程共用内存的相同区域 ; (物理空间有相交的部分) 目的:节省内存、相互通讯 ; 内容:代码、数据。
存储分配函数: mp=
coremap 内存分配 swapmap 外存分配
int malloc (mp, size ) //存储分配函数 struct map *mp; { register int a ;
register struct map *bp ; for (bp = mp; bp -> m_size ; bp ++)
120
4
……
……
空闲页面表结构
分配/去配: 需修改空闲页面表。 特点: 可以分配连续页面。
DMA 要求
内存
…… 占用 120页 121页 122页 123页 占用 ……
6.2.2.1 静态等长分区的分配(Cont.)
空闲页面链 :
head
占用
占用
分配/去配: 调整链表。
占用
特点: 节省空间。
(不适合外存管理)
缺点: 容易形成碎片fragment。
如申请30将留下长度为2的空闲区。
6.2.2.2 动态异长分区的分配(Cont.)
最坏适应算法(Worst Fit) :
空闲区首址 空闲区长度
1024
256
128
64
256
32
0
……
……
空闲区表
空闲区: 空闲区长度递减排列。 申请: 取最大可满足区域。 优点: 防止形成碎片。 缺点: 分割大空闲区。
空闲页面链结构
6.2.2.2 动态异长分区的分配
常用于界地址存储管理和段式存储管理。
空闲区首址 空闲区长度
......
……
address
size
……
……
……
0
空闲区表
初始时一个连续空闲区; 空闲区首址由小到大; 长度 = 0 为表尾。
分配: 按分配策略调整表项; 去配: 把去配的空间插入表中,
k×2i
第k页
2i
…
……
…
(2n-i-1)×2i 第 2n-i-1 页 2i
内存空间划分
物理地址 =页架首址+页内地址 =页架号×2i+页内地址 = 页架号 页内地址
n-i 位
i位
n 位一维地址码
6.3.2 分页式存储管理(Cont.)
⒉ 进程空间划分: 静态等长,2 i, 称为一个页面。
0×2i
6.3.1 界地址管理方式(Cont.)
覆盖技术: 将较大程序装入较小进程空间的技术, 最大限度提高内存利用率。
只将全局代码和数据静态装入内存, 其它部分动态装入;
后装入的成分重复使用先装入成分所使用的 存储区, 即覆盖先装入的成分;
用户编写覆盖驱动程序, 无需操作系统支持。
6.3.1 界地址管理方式(Cont.)
for (bp = mp; bp -> m_addr<=a && bp ->m_size !=0; bp ++); if (bp >mp && (bp-1)->m_addr+(bp-1)->m_size == a)
{ (bp-1)->m_size =+ size; //与前项存储块合并 if (a+size == bp -> m_addr) //判断与后项存储块是否相连 { (bp-1)->m_size += bp ->m_size; //再与后项存储块合并 while (bp->m_size) //删除后项存储块表项 { bp++; (bp-1)-> m_addr = bp -> m_addr ; (bp-1)->m_size = bp -> m_size ; } }
页架: 静态等长, 长度2 i ; 页架号: 所有页架由0开始依次编号 ; 页内地址: 页架内单元由0开始依次编址。 例如: 内存容量为2 n , 则共有2 n-i个页架。 第 k 个页架的起始地址为 k×2 i。
6.3.2 分页式存储管理(Cont.)
0×2i
第0页
2i
1×2i
第1页
2i
…
……
…
6.3.1 界地址管理方式
单对界存储管理方式: (首地址, 长度) 基本原理 ⒈ 内存空间划分: 动态异长;
⒉ 进程空间划分: 一个进程一个区域, 逻辑地址0~L -1 ;
⒊ 进程空间与内存空间对应关系(可以浮动) :
……
0:
b:
L
L-1 :
进程空间
b+L-1 :
……
内存空间
6.3.1 界地址管理方式(Cont.)
第0页
2i
逻辑地址
1×2i
第1页
2i
=逻辑页首址+页内地址
…
……
…
=逻辑页号×2i+页内地址
k×2i
第k页
2i
= 逻辑页号 页内地址
…
……
…
(l-1)×2i
第 l-1 页
2i
进程空间划分
n-i 位
i位
6.3.2 分页式存储管理(Cont.)
0 KB
操作系统空间 20KB
20 KB
进程p1空间 30KB
50 KB
进程p1空间 20KB
70 KB
空闲区域
30KB
90 KB
空闲区域 紧凑前
10KB
紧凑后
6.3 存储管理方式
无虚拟功能的存储管理方式: 界地址管理方式(一维地址) 页式管理方式(一维地址) 段式管理方式(二维地址) 段页式管理方式(二维地址)
1 0 0 ……… 1 …….. 1 0
第第 第
01 2 页页 页
第
……… k 页
第第 n-1 n 页页
分配: 按页号从小到大查字位图, 找到为0的位改为1,返回页号。
去配: 把页号对应的 bit 置为 0 。
6.2.2.1 静态等长分区的分配(Cont.)
空闲页面表:
首页面号 页面个数
……
……
} while (size = t ); } }
6.2.3 碎片与紧凑
紧凑(Compaction): 移动占用区域,使所有空闲区域 连成一片(开销很大)。
0 KB
操作系统空间 20KB
20 KB 30 KB
空闲区域 进程p1空间
10KB 30KB
60 KB 70 KB
空闲区域 进程p1空间
10KB 20KB
例: UNIX存储分配-First Fit
(见12章p286-12.4.2 )
最先适应算法,空闲区首址递增排列
define CMAPSIZ 100 define SMAPSIZ 100 struct map //存储资源表结构 { char *m_size;
char *m_addr; }; struct map coremap[CMAPSIZ]; //内存资源表 struct map swapmap[SMAPSIZ]; //外存资源表
return(0); //分配不成功,返回0 }
存储释放算法: mp=
coremap 释放内存 swapmap 释放外存
mfree (mp, size, aa) struct map *map; { register struct map bp ; register int t , a ; a = aa ;
例[覆盖技术]:四遍扫描的编译程序
Pass1 30 KB
Pass2 50 KB
符号表 公共例程
覆盖驱动程序
覆盖区 50 KB
………… 内存
Pass3 40 KB
Pass4 25 KB
6.3.2 分页式存储管理
页式存储管理(paging): 一个进程占多个等长、连续内存空间; 无碎片。 6.3.2.1 基本原理 ⒈ 内存空间划分:
6.1 存储管理功能(Cont.)
存储保护 防止地址越界 ; 防止操作越权。
存储扩充 内存、外存结合,虚拟存储体系 ; 速度接近内存,容量相当外存。
地址映射 逻辑地址=>物理地址 硬件支持
基址寄存器(base)、限长寄存器(limit)、快表; 使用上述寄存器完成地址映射过程; 不能正常完成地址映射时产生中断。
6.2 内存资源管理
6.2.1 内存分区
分区时刻 静态分区: 系统初始化时分; 动态分区: 申请时分。
分区大小 等长分区 : 2 i 异长分区 : 依程序, 程序单位, 对象大小。
通常作法 静态+等长 (页式、段页式) ; 动态+异长 (段式、界地址) 。
6.2.2 内存分配
静态等长分区的分配 分配策略: 分配几个等长区域 ; 分区表示:
⒋ 所需表目: ⑴ 内存分配表: 在PCB中 ; ⑵ 空闲区域表: array of ( addr , size )。
⒌ 所需寄存器: ⑴ 基址寄存器b: 保存运行进程起始地址; ⑵ 限长寄存器l : 保存运行进程长度。
6.3.1 界地址管理方式(Cont.)
⒍ 地址映射:σ : (a) → (b+a) ∪{ Ω }
字位映象图 ; 空闲页面表 ; 空闲页面链。
动态异长分区的分配 最先适应 (First Fit) ; 最佳适应 (Best Fit) ; 最坏适应 (Worst Fit) 。
6.2.2.1 静态等长分区的分配
字位映象图(bit map)
用一个 bit 代表一页状态,0: 空闲,1: 占用。
存储释放算法(Cont.)
} else //是存储表项的第一项或不与前项存储块相连 { if (a+size == bp ->m_addr && bp ->m_size) //与后项存储块相连?
{ bp-> m_addr -= size; //与后项存储块合并。 bp ->m_size += size ;
} else if (size) //与前、后项存储块均不相连, 插入(size,a)表项
do { t = bp -> m_addr ; //do循环逐项后移 bp -> m_addr = a; a = t; //a与 bp -> m_addr 交换 t = bp -> m_size; bp -> m_size = size; // size 与bp -> m_size 交换 bp++;
6.1 存储管理功能 6.2 内存资源管理 6.3 存储管理方式 6.4 外存空间管理 6.5 虚拟存储系统
6.1 存储管理功能
内存/外存的管理; 内/外存管理采用相同
或相似的管理技术; 功能
存储分配 存储共享 存储保护 存储扩充 地址映射
6.1 存储管理功能(Cont.)
可能需要合并空闲区。
6.2.2.2 动态异长分区的分配(Cont.)
最先适应算法(First Fit) :
空闲区首址 空闲区长度
128
64
空闲区: 首址递增排列; 申请: 取第一个可满足区域 ;
256
32
优点: 尽量使用低地址空间,
1024
256
高区保持大空闲区域。
0
……
……
空闲区表
缺百度文库: 可能分割大空闲区。
进程空间
0:
……
……
限长寄存器 首址寄存器
L
b
内存空间 ……
b:
……
……
<逻辑地址> ……
L-1: ……
a CMP
越界中断
+ b+a
<物理地址>
L
……
b+L-1:
……
……
步骤 : ⑴ 由程序确定逻辑地址 a ;
⑵ a与 L 比较判断是否越界,不满足: 0≤a≤L-1,越界;
⑶ a与 b 相加得到物理地址。
如申请32将分割第一个区域。
6.2.2.2 动态异长分区的分配(Cont.)
最佳适应算法(Best Fit) :
空闲区首址 256 128
空闲区长度 32 64
空闲区: 空闲区长度递增排列 ; 申请: 取最小可满足区域 ; 优点: 尽量使用小空闲区,
1024
256
保持大空闲区域。
0
……
……
空闲区表
6.3.1 界地址管理方式(Cont.)
双对界 代码区域: 首址寄存器、限长寄存器 ; 数据区域: 首址寄存器、限长寄存器 ; UNIX : 代码I空间、数据D空间。
交换与重定位 交换: 换入(swap-in)/换出(swap-out) ; 滚入(roll-in)/滚出(roll-out) ; 交换的基本单位为整个进程。 可重定位程序: 程序编址与内存存放位置无关 ; 浮动程序: 满足重定位要求的程序,如0起始编址。 重定位: 换入程序需重定位。
if ( bp -> m_size >= size ) { a= bp -> m_addr ; bp -> m_addr += size ; if (( bp -> m_size -= size ) == 0) //当前块=size do { bp ++; //do循环压缩size=0的存储表项 (bp-1) -> m_addr = bp -> m_addr ; } while((bp-1)->m_size = bp -> m_size); return(a); //分配成功,返回分配存储块的首地址 }
存储分配/去配 记录内/外存资源的使用情况: 分配表、空闲表 ; 分配/去配对象 内存、外存(相同方法) ; 分配/去配时刻 进程创建、撤销、交换、长度变化(栈溢出, execl)
存储共享 多个进程共用内存的相同区域 ; (物理空间有相交的部分) 目的:节省内存、相互通讯 ; 内容:代码、数据。
存储分配函数: mp=
coremap 内存分配 swapmap 外存分配
int malloc (mp, size ) //存储分配函数 struct map *mp; { register int a ;
register struct map *bp ; for (bp = mp; bp -> m_size ; bp ++)
120
4
……
……
空闲页面表结构
分配/去配: 需修改空闲页面表。 特点: 可以分配连续页面。
DMA 要求
内存
…… 占用 120页 121页 122页 123页 占用 ……
6.2.2.1 静态等长分区的分配(Cont.)
空闲页面链 :
head
占用
占用
分配/去配: 调整链表。
占用
特点: 节省空间。
(不适合外存管理)
缺点: 容易形成碎片fragment。
如申请30将留下长度为2的空闲区。
6.2.2.2 动态异长分区的分配(Cont.)
最坏适应算法(Worst Fit) :
空闲区首址 空闲区长度
1024
256
128
64
256
32
0
……
……
空闲区表
空闲区: 空闲区长度递减排列。 申请: 取最大可满足区域。 优点: 防止形成碎片。 缺点: 分割大空闲区。
空闲页面链结构
6.2.2.2 动态异长分区的分配
常用于界地址存储管理和段式存储管理。
空闲区首址 空闲区长度
......
……
address
size
……
……
……
0
空闲区表
初始时一个连续空闲区; 空闲区首址由小到大; 长度 = 0 为表尾。
分配: 按分配策略调整表项; 去配: 把去配的空间插入表中,
k×2i
第k页
2i
…
……
…
(2n-i-1)×2i 第 2n-i-1 页 2i
内存空间划分
物理地址 =页架首址+页内地址 =页架号×2i+页内地址 = 页架号 页内地址
n-i 位
i位
n 位一维地址码
6.3.2 分页式存储管理(Cont.)
⒉ 进程空间划分: 静态等长,2 i, 称为一个页面。
0×2i
6.3.1 界地址管理方式(Cont.)
覆盖技术: 将较大程序装入较小进程空间的技术, 最大限度提高内存利用率。
只将全局代码和数据静态装入内存, 其它部分动态装入;
后装入的成分重复使用先装入成分所使用的 存储区, 即覆盖先装入的成分;
用户编写覆盖驱动程序, 无需操作系统支持。
6.3.1 界地址管理方式(Cont.)
for (bp = mp; bp -> m_addr<=a && bp ->m_size !=0; bp ++); if (bp >mp && (bp-1)->m_addr+(bp-1)->m_size == a)
{ (bp-1)->m_size =+ size; //与前项存储块合并 if (a+size == bp -> m_addr) //判断与后项存储块是否相连 { (bp-1)->m_size += bp ->m_size; //再与后项存储块合并 while (bp->m_size) //删除后项存储块表项 { bp++; (bp-1)-> m_addr = bp -> m_addr ; (bp-1)->m_size = bp -> m_size ; } }
页架: 静态等长, 长度2 i ; 页架号: 所有页架由0开始依次编号 ; 页内地址: 页架内单元由0开始依次编址。 例如: 内存容量为2 n , 则共有2 n-i个页架。 第 k 个页架的起始地址为 k×2 i。
6.3.2 分页式存储管理(Cont.)
0×2i
第0页
2i
1×2i
第1页
2i
…
……
…
6.3.1 界地址管理方式
单对界存储管理方式: (首地址, 长度) 基本原理 ⒈ 内存空间划分: 动态异长;
⒉ 进程空间划分: 一个进程一个区域, 逻辑地址0~L -1 ;
⒊ 进程空间与内存空间对应关系(可以浮动) :
……
0:
b:
L
L-1 :
进程空间
b+L-1 :
……
内存空间
6.3.1 界地址管理方式(Cont.)
第0页
2i
逻辑地址
1×2i
第1页
2i
=逻辑页首址+页内地址
…
……
…
=逻辑页号×2i+页内地址
k×2i
第k页
2i
= 逻辑页号 页内地址
…
……
…
(l-1)×2i
第 l-1 页
2i
进程空间划分
n-i 位
i位
6.3.2 分页式存储管理(Cont.)
0 KB
操作系统空间 20KB
20 KB
进程p1空间 30KB
50 KB
进程p1空间 20KB
70 KB
空闲区域
30KB
90 KB
空闲区域 紧凑前
10KB
紧凑后
6.3 存储管理方式
无虚拟功能的存储管理方式: 界地址管理方式(一维地址) 页式管理方式(一维地址) 段式管理方式(二维地址) 段页式管理方式(二维地址)
1 0 0 ……… 1 …….. 1 0
第第 第
01 2 页页 页
第
……… k 页
第第 n-1 n 页页
分配: 按页号从小到大查字位图, 找到为0的位改为1,返回页号。
去配: 把页号对应的 bit 置为 0 。
6.2.2.1 静态等长分区的分配(Cont.)
空闲页面表:
首页面号 页面个数
……
……
} while (size = t ); } }
6.2.3 碎片与紧凑
紧凑(Compaction): 移动占用区域,使所有空闲区域 连成一片(开销很大)。
0 KB
操作系统空间 20KB
20 KB 30 KB
空闲区域 进程p1空间
10KB 30KB
60 KB 70 KB
空闲区域 进程p1空间
10KB 20KB
例: UNIX存储分配-First Fit
(见12章p286-12.4.2 )
最先适应算法,空闲区首址递增排列
define CMAPSIZ 100 define SMAPSIZ 100 struct map //存储资源表结构 { char *m_size;
char *m_addr; }; struct map coremap[CMAPSIZ]; //内存资源表 struct map swapmap[SMAPSIZ]; //外存资源表
return(0); //分配不成功,返回0 }
存储释放算法: mp=
coremap 释放内存 swapmap 释放外存
mfree (mp, size, aa) struct map *map; { register struct map bp ; register int t , a ; a = aa ;
例[覆盖技术]:四遍扫描的编译程序
Pass1 30 KB
Pass2 50 KB
符号表 公共例程
覆盖驱动程序
覆盖区 50 KB
………… 内存
Pass3 40 KB
Pass4 25 KB
6.3.2 分页式存储管理
页式存储管理(paging): 一个进程占多个等长、连续内存空间; 无碎片。 6.3.2.1 基本原理 ⒈ 内存空间划分:
6.1 存储管理功能(Cont.)
存储保护 防止地址越界 ; 防止操作越权。
存储扩充 内存、外存结合,虚拟存储体系 ; 速度接近内存,容量相当外存。
地址映射 逻辑地址=>物理地址 硬件支持
基址寄存器(base)、限长寄存器(limit)、快表; 使用上述寄存器完成地址映射过程; 不能正常完成地址映射时产生中断。
6.2 内存资源管理
6.2.1 内存分区
分区时刻 静态分区: 系统初始化时分; 动态分区: 申请时分。
分区大小 等长分区 : 2 i 异长分区 : 依程序, 程序单位, 对象大小。
通常作法 静态+等长 (页式、段页式) ; 动态+异长 (段式、界地址) 。
6.2.2 内存分配
静态等长分区的分配 分配策略: 分配几个等长区域 ; 分区表示:
⒋ 所需表目: ⑴ 内存分配表: 在PCB中 ; ⑵ 空闲区域表: array of ( addr , size )。
⒌ 所需寄存器: ⑴ 基址寄存器b: 保存运行进程起始地址; ⑵ 限长寄存器l : 保存运行进程长度。
6.3.1 界地址管理方式(Cont.)
⒍ 地址映射:σ : (a) → (b+a) ∪{ Ω }
字位映象图 ; 空闲页面表 ; 空闲页面链。
动态异长分区的分配 最先适应 (First Fit) ; 最佳适应 (Best Fit) ; 最坏适应 (Worst Fit) 。
6.2.2.1 静态等长分区的分配
字位映象图(bit map)
用一个 bit 代表一页状态,0: 空闲,1: 占用。
存储释放算法(Cont.)
} else //是存储表项的第一项或不与前项存储块相连 { if (a+size == bp ->m_addr && bp ->m_size) //与后项存储块相连?
{ bp-> m_addr -= size; //与后项存储块合并。 bp ->m_size += size ;
} else if (size) //与前、后项存储块均不相连, 插入(size,a)表项
do { t = bp -> m_addr ; //do循环逐项后移 bp -> m_addr = a; a = t; //a与 bp -> m_addr 交换 t = bp -> m_size; bp -> m_size = size; // size 与bp -> m_size 交换 bp++;