代码:https://github.com/RedemptionC/xv6-riscv-6s081/tree/lock
本实验主要是重新设计锁,增加并行性
分别是为kmem和bcache设计
memory allocator
https://blog.csdn.net/RedemptionC/article/details/108127655 这里对kalloc做了一点基本的分析
他的设计是所有的cpu(NCPU为8,但是实际是3个)都使用一个freelist,这样lock contention就很高
要做的改进是为每一个cpu设置一个free list,每个freelist一个锁,这样不同的cpu就能独立的进行分配
首先修改结构体的定义,改为定义一个结构体数组:
struct kmem{
struct spinlock lock;
struct run *freelist;
};
struct kmem kmems[3];
然后在kinit中初始化三个锁,仍然用freerange将全部内存分配给调用它的cpu
void
kinit()
{
printf("[kinit] cpu id %d\n",getcpu());
for(int i=0;i<3;i++)
initlock(&kmems[i].lock, "kmem");
freerange(end, (void*)PHYSTOP);
}
其实这里如果将全部的内存均匀的分给每个cpu的freelist,会更好,但是不管怎样,都会面临这样一个问题:当前cpu的freelist为空,但是其他cpu的freelist不为空,此时就需要向其他cpu借内存
修改kalloc
void *
kalloc(void)
{
// printf("[kalloc] cpu id %d\n",getcpu());
// printkmem();
struct run *r;
int hart=getcpu();
acquire(&kmems[hart].lock);
r = kmems[hart].freelist;
if(r)
kmems[hart].freelist = r->next;
release(&kmems[hart].lock);
if(!r)
{
// 当前cpu对应的freelist为空 需要从其他cpu对应的freelist借
r=steal(hart);
}
if(r)
memset((char*)r, 5, PGSIZE); // fill with junk
return (v