目录
Eliminate allocation from sbrk()
这个实验在2021的版本中没有,需要去2020版本中找,具体实验如下:
https://pdos.csail.mit.edu/6.828/2020/labs/lazy.html
lazy page allocation主要是对堆区空间采取“延迟分配”的策略,即当采取sbrk申请堆区内存时不分配页面,仅当实际使用时发生也错误才实际分配内存。
Eliminate allocation from sbrk()
在sbrk中删除实际分配页面,只给进程的内存大小修改。修改代码如下:
uint64
sys_sbrk(void)
{
int addr;
int n;
if(argint(0, &n) < 0)
return -1;
addr = myproc()->sz;
myproc()->sz += n;
// if(growproc(n) < 0)
// return -1;
return addr;
}
Lazy allocation
上个步骤只在用户进程申请分配时只增加了用户进程的空间当并未实际分配,接下来就需要分配了,首先在trap.c中,根据页错误(错误码是13或15),拿到页错误失败的虚拟地址,之后给该地址分配物理页面。将分配页面相关代码写成函数如下:
//懒分配相关函数
int lazy_alloc(uint64 va)
{
// printf("页错误导致惰性分配!");
uint64 page_addr = PGROUNDDOWN(va); //得到要分配页的虚拟地址的对齐后的结果
char *mem = kalloc();
struct proc* p = myproc();
if(mem == 0){
return -1;
}
memset(mem, 0, sizeof(PGSIZE));
if(mappages(p->pagetable, page_addr, PGSIZE, (uint64)mem, PTE_W|PTE_X|PTE_R|PTE_U) != 0){
kfree(mem);
return -1;
}

最低0.47元/天 解锁文章
2563






