操作系统学习笔记(九):连续内存分配——伙伴系统

伙伴系统是连续存储分配的一种办法。它比较好地折中了分配和回收过程中分配块的位置碎片和合并的问题。伙伴系统地概念如下图:整个可分配分区大小为2的幂次方,当需要的内存空间大于当前块的一半的时候就将整个分区分配给进程,如果小于当前分区的一半,就将当前分区对半分开,将其中一半继续与需要的内存大小进行比较,递归进行下去,直到满足所需内存大小大于分区一半。可以看到这种分配方式内部碎片最大为分区大小的一半减一。知道了伙伴系统的思想,下面我们看下具体实现。

伙伴系统的实现:

数据结构:

  • 空闲块按大小和起始位置组织称二维数组;
  • 初始状态时,只有一个大小为2^u的空闲块;

分配过程:

  • 由小到大在空闲块数组中找最小的可用空闲块;
  • 如果空闲块过大,对可用空闲块进行二等分,一个放入空闲块列表,另一块继续比较,直到得到合适的可用空闲块。

分配示例:

释放过程:

  • 把释放的块放入空闲块数组
  • 合并满足合并条件的空闲块

合并条件:

  • 大小相同2^i
  • 地址相邻
  • 起始地址小的块的地址必须是2^{i+1}的倍数。看起来有点抽象,其实就是地址较小的块的起始地址必须是要合并的块的大小的两倍的倍数。因此上图中三个256只有后面两个可以合并。

ucore实现:

其中我们最关心的是分配函数alloc_pages和回收函数free_pages

struct pmm_manager{
    const char *name;     //管理算法的名字
    void (*init)(void);   //初始化
    void (*init_memmap)(struct Page *base, size_t n);   //建立起管理数据结构
    struct Page *(*alloc_pages)(size_t order);          //分配
    void (*free_pages)(struct Page *base, size_t n);    //回收
    size_t (*nr_free_pages)(void);                      //得到空闲分区内还有多大空间
    void (*check)(void);  //检查,测试
}

 

 

 

  • 19
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
连续系统的时域分析是信号与系统学习中的重要部分。时域分析研究的是信号在时间域内的变化规律,常用的分析方法包括冲激响应法、单位阶跃响应法和相应方程法。 1. 冲激响应法 冲激响应法是一种基于系统输入信号的冲激函数的响应来分析系统时域特性的方法。具体来说,将系统输入信号表示为一个冲激序列的加权和,然后计算出系统对每个冲激的响应,得到系统的冲激响应函数。然后,通过线性时不变系统的特性,可以将任何输入信号都表示为冲激序列的加权和,从而得到系统对任何输入信号的响应。 2. 单位阶跃响应法 单位阶跃响应法是一种基于系统输入信号的单位阶跃函数的响应来分析系统时域特性的方法。具体来说,将系统输入信号表示为一个单位阶跃函数的加权和,然后计算出系统对每个单位阶跃函数的响应,得到系统的单位阶跃响应函数。然后,通过线性时不变系统的特性,可以将任何输入信号都表示为单位阶跃函数的加权和,从而得到系统对任何输入信号的响应。 3. 相应方程法 相应方程法是一种基于系统微分方程的解析解来分析系统时域特性的方法。具体来说,根据系统微分方程的特性,可以得到系统的传递函数,然后通过拉普拉斯变换将输入信号和传递函数变换到频域内,最终通过反变换得到系统的时域响应。 以上三种方法都是分析连续系统时域特性的重要方法,各自适用于不同的情况。掌握这些方法可以帮助我们更好地理解和分析连续系统的时域特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值