存储器管理&信号量机制

187 阅读3分钟

存储器管理

一、单一连续分配

按顺序分配

二、固定分区分配

分区大小固定,存放时会出现很多内部碎片

三、动态分区分配

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~)