todo:为每个CPU实现一个物理内存分配器,每个分配器有自己的锁,从而减少锁竞争
you must use a dedicated unloaded machine with multiple cores,可以用你自己的笔记本
要求使用细粒度的锁来进行内存分配,而非一个锁保护 kmem 或 bcache
Allocations and frees on different CPUs can run in parallel
Your job is to implement per-CPU freelists
, and stealing
when a CPU’s free list is empty.
you should call initlock for each of your locks, and pass a name that starts with “kmem”
每个CPU维护一个freelist,与其锁。初始时全部把物理页给第一个CPU(可优化,例如均分),本CPU物理页不够了就调用 kborrow,从其他CPU偷一个物理页,此过程中需要获取锁
优化后:
偷取策略还是可以优化:
另外局部性应该也可以优化?但是意义似乎不是很大,这里的调用频率不算太高
todo:与上面的差不多,但是这里是为 buf cache 实现分配器,和CPU无相关性,目的地都是使用细粒度的锁,从而减少锁竞争
这个思路有问题,万一你找着找着前面的结构变了怎么办?以及获取锁的顺序怎么规定?如何避免可能的复杂死锁情景?
不同于上一个实验(可以为每个CPU维护其固定的分配器),buffer cache 是与进程直接交互的,并不局限于特定的CPU
还是要从固定的池
中分配buffer出来,可以考虑hash,将blockno映射到某个池中,每个池分配buffer的算法与原始的bcache一样
在池中buffer不够时,需要从其他池借buffer…借buffer的算法?
每次偷一半?进程可能频繁交互,线性搜索的时间有点长;又或者直接维护一个ref=0的list
也可以每次偷一个
结果:tot=0