9.Lab Eight —— Lock

开始之前,请先切换到lock分支

git checkoutt lock
make clean

Memory allocator

实现每个CPU的空闲链表,并且在CPU的空闲链表为空的时候争夺

  • 您可以使用kernel/param.h中的常量NCPU

  • 让freerange将所有可用内存分配给运行freerange的CPU。

  • 函数cpuid返回当前的核心编号,但只有在中断关闭时调用它并使用其结果才是安全的。您应该使用push_off()和pop_off()来关闭和打开中断。

  • 看看kernel/sprintf.c中的snprintf函数,了解字符串如何进行格式化。尽管可以将所有锁命名为“kmem”。

1.将存放空闲内存链表的结构体kmem(kernel/kalloc.c)修改成数组,对应NCPU个

2.x修改kinit(kernel/kalloc.c),为所有锁初始化,其中end是内核代码段结束后的位置,通过外部符号调用

extern char end[];// first address after kernel.
                   // defined by kernel.ld.

3.修改kfree,使用cpuid()和它返回的结果必须关中断,否则当前任务因为时间片切换到其他CPU上运行,那么之前获取的cpuid就不正确了

4.修改kalloc,使得在当前CPU的空闲链表没有可分配内存时窃取其他内存的

测试

Buffer cache

  • 修改块缓存,以便在运行bcachetest时,bcache(buffer cache的缩写)中所有锁的acquire循环迭代次数接近于零。

  • 理想情况下,块缓存中涉及的所有锁的计数总和应为零,但只要总和小于500就可以。修改bget和brelse,以便bcache中不同块的并发查找和释放不太可能在锁上发生冲突(例如,不必全部等待bcache.lock)。你必须保护每个块最多缓存一个副本的不变量。

  • 减少块缓存中的争用比kalloc更复杂,因为bcache缓冲区真正的在进程(以及CPU)之间共享。对于kalloc&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值