存储器管理
一、单一连续分配
按顺序分配
二、固定分区分配
分区大小固定,存放时会出现很多内部碎片
三、动态分区分配
1、支持的数据结构
空闲分区表 空闲分区链
2、分区分配操作
1、分配内存
2、回收内存
3、分配算法
1、基于顺序搜索的分配算法:
1)FF
2)NF
3)BF
4)WF
2、基于索引搜索的分配算法
1)快速适应算法:空闲分区根据其容量大小进行分类。将空闲分区用链表链接起来的,并设立了一个索引管理表。
2)伙伴系统:规定任何分区大小都为 2^k 大小。分配空间时,产生的碎片加入到小空间的链表中
3)哈希算法:·构建哈希表
3、动态可重定位分区分配
1)将碎片移到一起
2)动态重定位:程序执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加形成
分页.分段存储管理
一、分页存储管理
1、基本方法:
1)页面: 将逻辑地址空间分成若干页。最后一页会形成页内碎片,页面大小往往为1~8kb。
2)地址结构: 地址结构分为两部分:页号和位移量。位移量位数为页面大小。
3)页表: 为管理页面的映像表,元素为 页号 块号。
2、地址变换机构:
1)基本:一个页表用一个寄存器
2)快表:单独一个页表,里面当前访问的页表项(放入联想存储器)
3、多级页表:
为页表建一个页表(外部页表,顶级页表)
4、反置页表:
为每个物理块设置一个页表项
二、分段存储管理
1、引入原因:
1)方便编程
2)信息共享
3)信息保护
4)动态增长
5)动态链接
2、与分页主要区别:
1)页是信息的物理单位
2)页的大小由系统决定
3)分页的用户程序地址空间是一维的
3、信息共享
不管每段多大,共享时为该段设置一个段表项,非常容易
三、段页式存储管理方式
将段表的每一段划分成页
信号量机制
一、整形信号
wait() signal()
未让权等待,会一直忙等
二、记录形信号量 (多对一)
增加一个记录链表记录请求进程
struct{
int value; //等待进程数
struct process_control_block *list;
}semaphore;
wait(semphore *s){
s.value--;
if(s.value < 0) block(s.list);
}
signal(semphore *s){
s.value++;
if(s.value <= 0) wakeup(s.list);
}
三、AND型信号量 (多对多)
防:a->A&&b->B死锁
增加一个AND条件
swait(s1~sn){
while(1){
if(s1&&s2&&...){
for(i : n) si--;
break;
}
else ...;
}
}
signal(s1~sn){
while(1){
for(i : n) {
si++;
...;
}
}
}
四、信号量集 、
康康每次请求耗费几个资源
Swait(s1~,t1~,d1~); si = si - di ; //t i 为资源下限值,判断符合减去需求di、
Ssignal((s1~,d1~)