Skip to content

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