MIT-6.s081-OS lab alloc: Allocator for xv6

本文介绍了MIT-6.s081操作系统实验室中关于buddy allocator的实验,包括用buddy allocator动态分配文件相关数据结构以替换静态数组,以及优化buddy allocator以节省内存。实验内容涉及修改file.c,理解buddy allocator的工作原理,以及如何用一个bit保存两个块的分配状态。
摘要由CSDN通过智能技术生成

代码:https://github.com/RedemptionC/xv6-riscv-6s081/tree/alloc

本实验并不需要实现一个allocator 主要做这两件事:

1.从实验指导书中我们了解到 在一开始的时候 xv6打开文件数是有限制的 最多为NFILE 因为他没有使用动态内存分配,而是静态定义了数组,所以首先要我们做的就是,让xv6使用buddy allocator来动态分配文件相关的数据结构,这一部分我们要修改的文件是file.c

2.这一部分我们需要优化给出的buddy allocator,在原始版本中,为每个block准备了一个alloc bit,为0,表示没有分配,为1,表示分配了,因为buddy allocator的特点,我们为每一对block使用一个bit,等于b1_is_free_xor_b2_is_free,这样下来,最终大概能节约1mb的空间

首先是第一部分:

首先注释掉静态定义的数组

struct {
  struct spinlock lock;
  // struct file file[NFILE];
} ftable;
// Allocate a file structure.
struct file*
filealloc(void)
{
  struct file *f;

  acquire(&ftable.lock);
  f=bd_malloc(sizeof(struct file));
  if(f){
    f->ref=1;
    release(&ftable.lock);
    return f;
  }  
  // for(f = ftable.file; f < ftable.file + NFILE; f++){
  //   if(f->ref == 0){
  //     f->ref = 1;
  //     release(&ftable.lock);
  //     return f;
  //   }
  // }
  release(&ftable.lock);
  return 0;
}
// Close file f.  (Decrement ref count, close when reaches 0.)
void
fileclose(struct file *f)
{
  struct file ff;

  acquire(&ftable.lock);
  if(f->ref < 1)
    panic("fileclose");
  if(--f->ref > 0){
    release(&ftable.lock);
    return;
  }
  ff = *f;
  f->ref = 0;
  f->type = FD_NONE;
  bd_free(f);
  release(&ftable.lock);

  if(ff.type == FD_PIPE){
    pipeclose(ff.pipe, ff.writable);
  } else if(ff.type == FD_INODE || ff.type == FD_DEVICE){
    begin_op(ff.ip->dev);
    iput(ff.ip);
    end_op(ff.ip->dev);
  }
}

然后修改fileclose和filealloc,前者中只需要在release前bd_free掉file

后者只需要在filealloc中,注释掉原来静态定义时用来初始化file的循环,然后用bd_malloc为file申请内存,并且初始化(ref为1),然后release并返回即可

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值