惰性空间分配 lazy space allocation

本文介绍了一种称为懒加载的设计模式,这种模式强调资源的延迟分配,即直到确实需要时才进行资源分配。通过一个Java示例,展示了如何实现懒加载模式来管理不同类型水果的实例,仅在首次请求特定类型时创建其实例。

Lazy allocation simply means not allocating a resource until it is actually needed.

 

Here is an example in Java:

 

public class Fruit {
 
    private static final Map<String,Fruit> types = new HashMap<String, Fruit>();
    private final String type;
 
    // using a private constructor to force use of the factory method.
    private Fruit(String type) {
        this.type = type;
    }
 
    /**
    * Lazy Factory method, gets the Fruit instance associated with a
    * certain type. Instantiates new ones as needed.
    * @param type Any string that describes a fruit type, e.g. "apple"
    * @return The Fruit instance associated with that type.
    */
    public static synchronized Fruit getFruit(String type) {
        if(!types.containsKey(type)) {
            types.put(type, new Fruit(type)); // Lazy initialization
        }
        return types.get(type);
    }
 
}
 
### xv6 Lazy Page Allocation 实现与实验 #### 背景介绍 xv6 是一个用于教学目的的操作系统,其设计灵感来源于 Unix v6。Lazy page allocation 的核心思想是在进程实际访问内存页面时才分配物理页框,而不是在请求时立即分配。这种方式可以减少不必要的内存消耗并提高系统的效率。 --- #### Eliminate Allocation from `sbrk()` (Easy) `Eliminate allocation from sbrk()` 需要在调用 `sbrk()` 函数时不直接分配物理页框,而是推迟到第一次访问该地址时再完成分配。以下是具体实现方法: 1. 修改 `kernel/sysproc.c` 中的 `sys_sbrk` 函数逻辑,使其仅更新程序的堆指针而不执行任何物理页框分配。 2. 当用户尝试访问新扩展的堆区域时,触发缺页异常(page fault)。此时,在处理函数中动态分配所需的物理页框[^1]。 ```c // sysproc.c: Modify the behavior of sys_sbrk to avoid immediate physical memory allocation. uint64 sys_sbrk(void){ uint inc; struct proc *p = myproc(); if(arg_int(0, &inc) < 0) return -1; acquire(&p->lock); p->sz += inc; // Update heap pointer without allocating pages immediately. release(&p->lock); return 0; } ``` 通过以上更改,`sbrk()` 不会主动分配物理页框,而只是调整虚拟地址空间范围。 --- #### Lazy Allocation (Moderate) 为了支持懒惰分配机制,需要进一步完善内核中的页表管理功能以及 trap 处理器的行为。主要涉及以下几个方面: 1. **Trap Handler Modification**: 更新 `trap.c` 文件内的 `trap()` 函数来捕获由未映射页面引发的错误码,并判断是否应为其创建新的映射关系。 如果检测到当前线程试图读取或写入尚未初始化的一段有效虚拟地址,则按照需求加载对应的实际存储单元[^2]。 2. **Page Table Management Enhancements**: 对于新增加的部分,需确保它们能够被正确标记为只允许特定类型的存取模式(比如初始状态下设置成可写的空白节点)。 下面展示了一个简化版的伪代码片段说明如何响应此类中断事件: ```c void trap(struct cpu *cpu, struct proc *p){ ... if ((r & T_PGFLT) && uva >= p->sz){ // Handle page faults within valid address space but not yet allocated. void* pa = kalloc(); // Allocate a new frame. memmove(pa, zero_page(), PGSIZE); // Initialize with zeros or other default values as needed. mappages(p->pagetable, uva, PGSIZE, V2P(pa), PTE_W | PTE_U); goto userret; } ... } ``` 此部分实现了当发生越界访问时自动配置好关联资源的功能。 --- #### Testing Your Implementation 最后一步是对整个解决方案进行全面测试验证。可以通过运行已有的 usertests 和专门针对本特性的 lazytests 来确认改动的有效性和稳定性。这些测试套件可以帮助发现潜在缺陷或者边界情况下的不当行为。 --- ### 总结 通过对 `sbrk()` 行为改造及增强陷阱处理器能力,成功达成了延迟页面分配的目标。这样的改进不仅优化了性能表现同时也展示了现代操作系统设计理念之一——按需供给原则的应用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值