写时拷贝的实现 *举例: *假定进程P的虚拟页ⅹ映射到物理页L上,需要复制 X的内容到进程P2的虚拟页Y 当P1对Ⅹ进行写时拷贝时: *内核修改页表,令Y指向物理页L *将X表项的COW保护位置位 *当P1试图写页X时: *硬件读X的COW位,发现置位,产生一个异常 *操作系统将物理页L拷贝到物理页L,清除ⅹ的COW 位,令X指向L,Y继续指向L
写时拷贝的实现 举例: 假定进程 P1 的虚拟页 X 映射到物理页 L上,需要复制 X的内容到进程 P2 的虚拟页 Y 当P1对 X 进行写时拷贝时: 内核修改页表,令 Y 指向物理页 L 将 X 表项的COW保护位置位 当P1试图写页X时: 硬件读X的COW位,发现置位,产生一个异常 操作系统将物理页 L拷贝到物理页 L’,清除 X 的COW 位,令 X 指向 L’,Y 继续指向 L
写时拷贝的实现(续) *对于不提供写时拷贝功能的操作系统(如 UNX和 Windows),也可以基于虚拟内存实 现类似的功能: *可以通过修改页表避免物理拷贝 *需要找到一种替代COW位的保护机制
写时拷贝的实现(续) 对于不提供写时拷贝功能的操作系统(如 UNIX和Windows),也可以基于虚拟内存实 现类似的功能: 可以通过修改页表避免物理拷贝 需要找到一种替代COW位的保护机制
54优化页面重映射 Packet data Process 1 Write Pre ocess 2 Page Table Page Table VP 10 VP 8 FIGURE 5.5 Basic operations involved in making a copy of a page using virtual memory *对页面重映射过于简单的看法: *只需修改P2的页表(一次写操作),令vP8指向存放 包的物理页,所有工作就结束了(X)
5.4 优化页面重映射 对页面重映射过于简单的看法: 只需修改P2的页表(一次写操作),令VP 8指向存放 包的物理页 ,所有工作就结束了(X)
页面重映射的开销 修改多级页表: *在目标域中分配虚拟内存: *实际映射可能要求修改多级*系统要在目标进程中找到 页表,当页表不在内存中时 个空闲的页表表项 要调入,并修改目录页 锁住物理页: 要求锁操作 *为防止页被换出,必须锁 *修改页表前后要有请求锁和 住物理页 释放锁的开销 刷新TLB: 以上开销在多处理器系统中 会被放大 *新的地址映射写入页表时, 相关TLB表项要清除或修正 页面重映射虽然只需常数时 间,但这个常数因子非常大 结论:如果只是简单地使用页表重映射来避免拷贝,结果 可能不像预期的那么好
页面重映射的开销 修改多级页表: 实际映射可能要求修改多级 页表,当页表不在内存中时 要调入,并修改目录页 要求锁操作: 修改页表前后要有请求锁和 释放锁的开销 刷新TLB: 新的地址映射写入页表时, 相关TLB表项要清除或修正 在目标域中分配虚拟内存: 系统要在目标进程中找到 一个空闲的页表表项 锁住物理页: 为防止页被换出,必须锁 住物理页 以上开销在多处理器系统中 会被放大 页面重映射虽然只需常数时 间,但这个常数因子非常大 结论:如果只是简单地使用页表重映射来避免拷贝,结果 可能不像预期的那么好
Fbufs( fast buffers *基本观察: *如果一个应用正在发送大量的数据包,那么一个包缓 冲区可能会被重用多次 *方法一: *提前分配好需要的包缓冲区,并计算好所有的页面映 射信息(P2a),发送时重复使用这些包缓冲区 *方法二: *数据传输开始时分配包缓冲区并计算页面映射,然后 将其缓存起来(P11a),消除后续包的页面映射开销 *基本思想:映射一次,重复使用
Fbufs(fast buffers) 基本观察: 如果一个应用正在发送大量的数据包,那么一个包缓 冲区可能会被重用多次 方法一: 提前分配好需要的包缓冲区,并计算好所有的页面映 射信息(P2a),发送时重复使用这些包缓冲区 方法二: 数据传输开始时分配包缓冲区并计算页面映射,然后 将其缓存起来(P11a),消除后续包的页面映射开销 基本思想:映射一次,重复使用