Memory allocator(moderate)
构造内存页 kmems 数组 & 修改 kinit()函数
diff --git a/kernel/kalloc.c b/kernel/kalloc.c
index fa6a0ac..a6203b2 100644
--- a/kernel/kalloc.c
+++ b/kernel/kalloc.c
@@ -21,12 +21,17 @@ struct run {
struct {
struct spinlock lock;
struct run *freelist;
} kmem;
char lockname[8];
} kmem[NCPU];
void
kinit()
{
initlock(&kmem.lock, "kmem");
char lockname[8];
for(int i = 0;i < NCPU; i++) {
snprintf(lockname, sizeof(lockname), "kmem_%d", i);
initlock(&kmem[i].lock, lockname);
}
freerange(end, (void*)PHYSTOP);
}
修改 kfree() 函数
diff --git a/kernel/kalloc.c b/kernel/kalloc.c
index fa6a0ac..a6203b2 100644
--- a/kernel/kalloc.c
+++ b/kernel/kalloc.c
@@ -56,10 +61,13 @@ kfree(void *pa)
r = (struct run*)pa;
acquire(&kmem.lock);
r->next = kmem.freelist;
kmem.freelist = r;
release(&kmem.lock);
push_off(); //关中断
int id = cpuid();
acquire(&kmem[id].lock);
r->next = kmem[id].freelist;
kmem[id].freelist = r;
release(&kmem[id].lock);
pop_off(); //开中断
}
// Allocate one 4096-byte page of physical memory.
修改kalloc() 函数
diff --git a/kernel/kalloc.c b/kernel/kalloc.c
index fa6a0ac..a6203b2 100644
--- a/kernel/kalloc.c
+++ b/kernel/kalloc.c
@@ -70,11 +78,29 @@ kalloc(void)
{
struct run *r;
acquire(&kmem.lock);
r = kmem.freelist;
push_off(); //关中断
int id = cpuid();
acquire(&kmem[id].lock);
r = kmem[id].freelist;
if(r)
kmem.freelist = r->next;
release(&kmem.lock);
kmem[id].freelist = r->next;
else {
int antid;
for(antid = 0; antid < NCPU; ++antid) {
if(antid == id)
continue;
acquire(&kmem[antid].lock);
r = kmem[antid].freelist;
if(r) {
kmem[antid].freelist = r->next;
release(&kmem[antid].lock);
break;
}
release(&kmem[antid].lock);
}
}
release(&kmem[id].lock);
pop_off(); //开中断
if(r)
memset((char*)r, 5, PGSIZE); // fill with junk
测试
bash
init: starting sh
$ kalloctest
start test1
test1 results:
--- lock kmem/bcache stats // [!code --]
lock: bcache: #fetch-and-add 0 #acquire() 1264
--- top 5 contended locks: // [!code --]
lock: proc: #fetch-and-add 52012 #acquire() 230814
lock: proc: #fetch-and-add 8910 #acquire() 230800
lock: proc: #fetch-and-add 6730 #acquire() 230904
lock: proc: #fetch-and-add 6221 #acquire() 230800
lock: uart: #fetch-and-add 5804 #acquire() 99
tot= 0
test1 OK
start test2
total free number of pages: 32495 (out of 32768)
.....
test2 OK
$ usertests sbrkmuch
usertests starting
test sbrkmuch: OK
ALL TESTS PASSED
$ usertests
usertests starting
test manywrites: OK
test execout: OK
...
test forktest: OK
test bigdir: OK
ALL TESTS PASSED