zoukankan      html  css  js  c++  java
  • MIT-XV6/JOS hw: lazy page allocation

    Xv6使用lazy allocation

    当进程需要更多的内存的时候,调用malloc申请更多的堆内存,而系统调用sbrk()完成该工作

    但是有的进程会一次申请大量的内存,但是又可能根本用不到,比如说sparse array

    所以说复杂的内核涉及会将实际的allocation的工作推迟到实际用的时候,发生了page fault了,然后再进行实际的分配

    Part1.

    将系统调用sbrk的实际实现sys_sbrk进行修改,只讲进程的内存空间大小增加n,而不进行实际的分配

    系统调用malloc使用就是sbrk

    clip_image001

    返回的地址是新分配的地址空间的开头,在此处就是原来地址空间的末尾,此处都是虚地址

    那么此时再运行的结果就是

    clip_image002

    因为在shell中需要运行echo的时候,运行到了如下部分的代码

    clip_image003

    也就是在运行malloc的时候,虽然返回是成功了的,但是当程序试图操作cmd指向的内存区域的时候,发现该内存区域不是当前进程所有的,因为在sys_sbrk中根本没分配

    Part2.

    修改trap.c中的代码,使得系统可以处理上述错误

    在trap.c中,当发现是page fault错误的时候,可以按照当前进程的proc->sz来实际的分配内存,注意这个时候的sz的大小不是实际的大小,而是希望的大小值

    所以首先应该获取发生page fault时刻的虚地址,那个地址之后的部分就应该是本来应该分配但是实际没有分配的,而实际需要分配多少,应该根据proc->sz的大小来定。

    因为在发生page fault的时候的地址,是我们在malloc之后返回给进程的地址,而这个地址又是原来的proc->sz,所以该虚地址的大小就应该是实际的内存的大小

    clip_image004

  • 相关阅读:
    数学形态学——腐蚀、膨胀、开、闭、细化
    VS2010中 报错:error C2146、error C4430 原因一:缺少CvvImage类
    帧同步和状态同步
    HTML5触摸事件演化tap事件
    screenX clientX pageX的区别
    phaser的小游戏的onInputDown问题
    phaser入手
    pixi.js 微信小游戏 入手
    正则表达式
    剖析Vue原理&实现双向绑定MVVM-2
  • 原文地址:https://www.cnblogs.com/bdhmwz/p/5062892.html
Copyright © 2011-2022 走看看