ucore 操作系统os first-fit 算法实现

#define free_list (free_area.free_list)
#define nr_free (free_area.nr_free)

static void
default_init(void) {//初始化操作
    list_init(&free_list);//链表初始化
    nr_free = 0;//空闲内存清零
}

static void
default_init_memmap(struct Page *base, size_t n) {//内存块信息载入以及初始化
    assert(n > 0);
    struct Page *p = base;
    for (; p != base + n; p ++) {
        assert(PageReserved(p));
        p->flags = p->property = 0;//头标志位、块数清零
        set_page_ref(p, 0);
    }
    base->property = n;//创建一块大空闲内存
    SetPageProperty(base);
    nr_free += n;//设置空闲内存内的块数
    list_add(&free_list, &(base->page_link));//内存块插入空闲分配链表
}

static struct Page *
default_alloc_pages(size_t n) {//内存分配函数
    assert(n > 0);
    if (n > nr_free) {
        return NULL;
    }
    struct Page *page = NULL;
    list_entry_t *le = &free_list;
    while ((le = list_next(le)) != &free_list) {//根据first-fit算法特点进行首次适应块分配
        struct Page *p = le2page(le, page_link);
        if (p->property >= n) {
            page = p;
            break;
        }
    }
    if (page != NULL) {//对找到的可以块进行相应处理
        list_del(&(page->page_link));//从空闲内存链上摘除
        if (page->property > n) {//将分配块富余的部分切下来重新挂到空闲链上
            struct Page *p = page + n;//新块的首块地址
            p->property = page->property - n;//新块的大小
            SetPageProperty(p);
            list_add(page->page_link.prev, &(p->page_link));//挂载新块
        }
        nr_free -= n;
        ClearPageProperty(page);
    }
    return page;
}

static void
default_free_pages(struct Page *base, size_t n) {//内存块释放以及前后合并
    assert(n > 0);
    struct Page *p = base;
    for (; p != base + n; p ++) {//块数据初始化
        assert(!PageReserved(p) && !PageProperty(p));
        p->flags = 0;
        set_page_ref(p, 0);
    }
    base->property = n;
    SetPageProperty(base);
    list_entry_t *le = list_next(&free_list);
    list_add(&(free_list),&(base->page_link));//块插到空闲链头结点下面
    while (le != &free_list) {//对链表位置进一步调整
        p = le2page(le, page_link);
        le = list_next(le);
        if(p + p->property <= base){//空闲块前面存在其他空闲块
            list_del(&(base->page_link));//原来位置删掉
            if(p + p->property == base){//空闲块和前面的空闲块相邻->合并操作
                p->property += n;
                ClearPageProperty(base);
                base = p;
            }
            else{
                list_add(&(p->page_link),&(base->page_link));//不相邻直接插在后面
            }
        }
        else{
            if(base + base->property == p){//和下面的相邻直接合并退出
                base->property += p->property;
                list_del(&(p->page_link));
                ClearPageProperty(p);
            }
            break;
        }
    }
    nr_free += n;
}

static size_t
default_nr_free_pages(void) {
    return nr_free;
}

测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值