开始之前,请先切换到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
&#