当前位置: 首页 > article >正文

操作系统-lazy allocation

只有真正需要使用这些页的时候才进行物理内存页的实际分配sbrk()在xv6操作系统中,进程的用户内存布局由代码段(text)、数据段(data)、堆区(heap)和栈区(stack)组成。sbrk()主要修改的是堆区的大小,堆在xv6中由低地址向高地址拓展。当程序调用sbrk(n)时,操作系统内核会完成下面的这些过程:1. 首先通过 p-sz 获取当前堆区的起始位置;2. 通过传入的参数 n 计算新的大小 new _sz szn3. 这里传入的参数n 分为2种情况,如果a.n0内核需要为这n个字节的区域分配新的物理内存页,然后更新进程的页表,同时将这些新物理页映射到从 p-sz到 p-szn之间的虚拟地址空间p-szb.n0:此时就代表着释放 new_sz和sz 之间的物理内存页,然后从页表中移除对应的映射关系4. 完成前面的步骤后,需要更新进程控制块(PCB)中记录的进程大小,即p-sz的值应该是new_sz5.最后返回原来的进程大小 sz,因为这个地址是新分配的内存区域的起始地地址sys_sbrk()首先获取到用户输入的n字节后,也使用addr 来存储原始的进程大小(这个也是新分配内存的起始地址),然后会调用growproc来执行具体的内存拓展操作,注意最后返回的是addruint64 sys_sbrk(void) { int addr; // 获取用户输入的字节数 int n; if(argint(0, n) 0) return -1; addr myproc()-sz; if(growproc(n)0) //这里是调用内部函数 growproc来执行实际的内存增长或者收缩的功能 return -1; return addr; }growproc()growproc(n)的定义在 proc.c中 , 它的主要作用是在以n个字节大小为基础修改进程的用户内存空间,这里就会涉及到 n 的大小分为 n0/n0a.n 0此时计算出新旧大小,采用 uvmalloc(p-pagetable, oldsz, newsz),从旧的边界sz 开始,到新的边界szn 结束,然后为这段新的虚拟地址范围调用 kalloc分配物理内存页,同时分配到的物理页会清零,然后更新进程的页表(p-pagetable)建立新的虚拟地址和新的物理地址之间的映射,同时去设置对应的权限(也就是之前提过的PTE_W|PTE_R|PTE_U)。b.n0如果n0 表示需要释放尾部的内存空间,这里使用的核心是调用 uvmdealloc(p-pagetable,oldsz,newsz),负责扫描从新的边界sz n 开始,到旧的边界 sz结束的虚拟地址范围,然后在进程页表(p-pagetable)中解除虚拟地址与物理地址的映射,然后将对应的物理地址使用kfree 释放并回收。int growproc(int n) { uint sz; struct proc *p myproc(); sZ p-sz; if(n 0){ if((sz uvmalloc(p-pagetable, sz, sz n)) 0) { return -1; } } else if(n 0){ sZ uvmdealloc(p-pagetable, sz, sz n); } p-sz sz; return 0; }虚拟地址空间预留(Virtual Address Space Reservation)当用户程序请求内存时(比如调用 sbrk(n)扩展堆),操作系统立即更新进程的页表,为这n 字节的内存创建虚拟地址到物理地址的映射,但这些映射的页表项(PTE)被标记为“无效”或“不可访问”。这里操作系统只是在页表中为这n个字节预留了一个映射的位置,页表的数据结构中有了虚拟地址对应的条目,但是并不会指向任何有效的物理页帧,没有分配实际的物理内存。只有当发生了缺页中断时,操作系统才会在内核中执行 kalloc 分配一个物理页帧。然后再去更新对应的页表项PTE,并将 PTE 对应的有效位设置为1。缺页中断(Page Fault)触发程序执行时,第一次尝试访问预留的虚拟地址空间中的某个地址时(比如,刚刚新分配了一个堆内存,现在进行读写),这个地址对应的PTE 是无效或者不可访问的,CPU会立即触发一个缺页中断(Page Fault)。此时CPU会从用户模式切换到内核模式,并跳转到操作系统的缺页中断处理函数中。按需分配物理内存在用户触发缺页中断之后,CPU进行中断的处理,操作系统会检查导致这个缺页中断的虚拟地址,确认这个虚拟地址是否属于预留的合法地址(未分配实际的物理内存),然后分配一个实际的空闲物理页帧,接着更新进程的页表,将缺页的虚拟地址映射到刚刚分配的物理页帧上,并且将PTE标记为有效设置正确的读写权限。如果是匿名页,则新分配的物理页会被清零。完成这些操作之后,缺页中断处理函数会返回,然后CPU可以重新开始执行用户指令。此时页表已经更新了,访问可以成功。Lazy allocation在申请小空间时,程序通过 sbrk 调用在堆上分配内存,并且通过kalloc 函数申请内存页面,之后将页面映射到页表当中。但是当申请很大的空间时,按照这个方式就会很慢,这里采用lazy allocation 的方式,当调用sbrk 时不进行页面的申请映射,而是仅仅增大了堆的大小,当实际访问页面时,触发了缺页异常,此时再申请一个页面并映射到页表中,然后再次执行缺页异常的代码就可以正常读写内存了,通过这种方式将申请内存页面的开销分摊到读写内存中是我们可以接受的。Eliminate allocation from sbrk原理sbrk(n)的原始功能是增加n 个字节的进程内存,返回新分配区域的起始地址,原来的堆大小 old_size。要求我们修改之后的 sys_sbrk()需要只增加进程的内存大小(myproc()-sz)n 个字节,即更新进程的虚拟地址空间边界,然后返回旧的内存大小(old_size),不应该分配任何物理内存。直接进行修改即可跳过growproc的过程uint64 sys_sbrk(void) { int n; uint64 sz; struct proc *p myproc(); if(argint(0, n) 0) return -1; sz p-sz; // 如果是正数打白条只加数字不分配内存 if (n 0) { p-sz n; } // 如果是负数缩小内存老老实实调用原函数释放内存 else if (n 0) { if(growproc(n) 0) return -1; } return sz; // 返回旧的 size }当n 0时申请扩张可以骗程序向内核要内存。内核只要把虚拟边界p-sz往上提就算是完成了任务。 在这个阶段没有任何真实的物理资源被浪费。物理内存还乖乖地躺在操作系统的仓库里。直到程序真的去写这个地址内核才会抠抠搜搜地掏出一页物理内存给它当n 0时如果这个时候内核也“偷懒”仅仅是把虚拟边界p-sz往下划p-sz n会发生极其恐怖的事情物理内存被永远弄丢了Memory Leak 在那块被缩小的区域里可能已经存在之前因为缺页中断而分配好的真实的物理内存页。如果你只改数字不去把那些物理页kfree掉这些物理内存就成了“孤儿”。两头不认账 * 程序那边因为p-sz变小了以后再访问这些地址会报越界错误所以程序用不了这块内存了。操作系统那边因为你没调用释放函数系统以为这些内存还在被该进程占用也不会把它分给别人。结果 这块极其宝贵的物理内存就永远地消失在宇宙中了随着程序不断扩大又缩小操作系统的物理内存很快就会被彻底榨干最终死机。Lazytests and Usertests现在需要xv6能够相应用户空间的 page fault并且在page fault 发生时惰性分配一个新的物理页并建立映射,然后返回程序继续执行。第一步在usertrap函数中处理page fault情况r_scause() 13 / 15(读缺页写缺页)找到这个虚拟地址判断是否在p-sz的范围内并申请物理内存与其进行映射第二步大体修改完成现在完成“细枝末节”不容易想到并且会出bug的地方假设我们在lazy allocation中分配了一些物理页但还是有一些“白条”我们没有分配当我们调用uvmunmap函数时就会报错这个函数是用来解除虚拟内存与物理内存之间的映射的。我们之前本来就没有映射所以在uvmunmap函数中跳过那些没有设置有效位PTE_V的页表项第三步当调用fork时子进程会完全复制父进程但我们不需要完全复制全部的页表项只复制已经分配的物理地址就行没有分配的物理地址就忽略。所以修改uvmcopy()第四步当系统调用read、write时在内核态运行可能去访问这个不存在的物理地址不会触发中断所以我们要对walkaddr进行修改在访问到不存在的物理地址时要把物理内存垫上第五步当调用exit退出进程时会调用freewalk来递归释放存储页表本身的页内存在迟延时分配的环境下freewalk会出现两种情况由于我们的延迟分配机制和uvmunmap的清理是针对整个p-sz区域进行的,告诉内核这是一个有效的叶子节点,但是假设在前面已经被处理过了,这里不需要处理也就是不需要 panic了只要保证它被清零然后释放页表结构本身就行。

相关文章:

操作系统-lazy allocation

只有真正需要使用这些页的时候,才进行物理内存页的实际分配sbrk()在xv6操作系统中,进程的用户内存布局由代码段(text)、数据段(data)、堆区(heap)和栈区(stack)组成。sbrk()主要修改的是堆区的大小,堆在xv6中由低地址向高地址拓展。当程序调用sbrk(n)时,操作系统内核…...

太原烘焙培训排名

在太原选择烘焙培训机构时,许多朋友会关注不同机构的教学质量与特色。以下整理了一些选择时可以考虑的方面,供您参考。教学方式与内容部分机构采用以实操为主的教学模式,例如山西旭梦圆食品有限公司的课程安排中,实践操作占较大比…...

Java学习——String 类的不可变性、底层实现(JDK1.8+)

目录 一、核心定义与设计思想 1. 核心定义 2. 核心设计思想 二、底层实现原理(含 JDK 源码分析 / 反编译验证) 1. JDK1.8 String 核心源码解析 2. 字符串常量池(JDK1.8 底层) 3. 反编译验证(不可变性 编译器优…...

Qwen3-TTS开源大模型效果展示:俄文/葡萄牙文/意大利文等小语种高自然度语音生成

Qwen3-TTS开源大模型效果展示:俄文/葡萄牙文/意大利文等小语种高自然度语音生成 你听过AI用俄语讲普希金的诗吗?或者用意大利语念一段歌剧台词?过去,想让AI生成地道的小语种语音,要么音色机械,要么口音奇怪…...

AntdUI实战:用WinForm和.NET 6给老旧内部管理系统“换肤”的完整记录

AntdUI实战:用WinForm和.NET 6给老旧内部管理系统“换肤”的完整记录 当企业内部的WinForm系统运行超过十年,那些灰底蓝框的界面早已与现代审美格格不入。去年接手某制造业ERP系统改造时,我面对的是一个基于.NET Framework 4.0的"古董&q…...

万象视界灵坛效果展示:血条式置信度进度条与‘同步率’动态分布图实录

万象视界灵坛效果展示:血条式置信度进度条与同步率动态分布图实录 1. 平台概览 万象视界灵坛(Omni-Vision Sanctuary)是一款基于OpenAI CLIP技术的高级多模态智能感知平台。不同于传统视觉识别工具的单调界面,它将复杂的"语…...

Gemma-3 Pixel Studio实战教程:离线模式部署与本地模型权重缓存策略

Gemma-3 Pixel Studio实战教程:离线模式部署与本地模型权重缓存策略 1. 项目概述与核心价值 Gemma-3 Pixel Studio是基于Google最新开源Gemma-3-12b-it模型构建的多模态对话终端,将强大的文本理解能力与视觉感知功能完美结合。与传统对话系统相比&…...

Qwen3-0.6B-FP8应用场景:开发者测试LLM应用前端UI兼容性的沙盒环境

Qwen3-0.6B-FP8应用场景:开发者测试LLM应用前端UI兼容性的沙盒环境 1. 引言:为什么需要一个轻量级的“测试沙盒”? 如果你正在开发一个基于大语言模型的应用,比如一个智能客服系统、一个文档助手,或者一个创意写作工…...

手把手教你用Flotherm做热管仿真

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...

OpenRGB:开源跨平台RGB灯光控制方案,告别多软件困扰实现设备统一管理

OpenRGB:开源跨平台RGB灯光控制方案,告别多软件困扰实现设备统一管理 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcPr…...

深入ELF文件:从rpath和interpreter看懂Linux程序如何‘找到家’

深入ELF文件:从rpath和interpreter看懂Linux程序如何‘找到家’ 在Linux系统中,每个可执行程序背后都隐藏着一个精巧的加载机制。当你在终端输入一个命令时,系统如何找到并加载程序所需的所有组件?这背后是ELF(Execut…...

DanKoe 视频笔记:原创思维指南:如何进行原创思考

在本教程中,我们将学习如何摆脱思维定式,培养真正的原创思考能力。我们将探讨为何独立思考如此困难,并提供一套实用的方法来帮助你形成自己的观点、连接不同领域的知识,并最终创造出有价值的内容。 概述 每个人都希望成为一个原创…...

[模电]从PN结到实用电路:二极管的深度解析与设计指南

1. PN结:二极管的物理基础 想象一下把一块P型半导体和N型半导体紧密贴合在一起,就像把两块不同颜色的橡皮泥揉捏在一起。P型半导体里充满了带正电的"空穴"(可以理解为缺少电子的位置),而N型半导体则富含自由…...

千问3.5-2B镜像免配置优势解析:supervisor自恢复+健康检查+7860端口标准化

千问3.5-2B镜像免配置优势解析:supervisor自恢复健康检查7860端口标准化 1. 千问3.5-2B镜像核心价值 千问3.5-2B是Qwen系列的小型视觉语言模型,专为图片理解与文本生成任务优化设计。这个开箱即用的镜像解决了传统AI模型部署中最让人头疼的三个问题&am…...

源码级重构与低代码交付:企业级 AI 视频管理平台的二次开发实战

作为一位在安防行业摸爬滚打 10 年的架构师,我经常被集成商朋友的灵魂拷问:“有没有一套代码,既能直接拿去给客户演示(低代码),又能让我根据客户需求改得‘面目全非’(深度定制)&…...

如何为华硕笔记本安装轻量级性能控制工具:G-Helper完整指南

如何为华硕笔记本安装轻量级性能控制工具:G-Helper完整指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

Android BLE开发实战:从BlueDroid扫描流程到性能调优全解析(附代码示例)

Android BLE开发深度优化:从BlueDroid扫描机制到实战性能调优 1. 理解BLE扫描的核心机制 在Android蓝牙低功耗(BLE)开发中,扫描机制是连接设备的第一步,也是最容易出现性能瓶颈的环节。与传统的蓝牙扫描不同&#xff0…...

Neeshck-Z-lmage_LYX_v2多场景落地:LoRA动态加载赋能数字人直播背景实时生成系统

Neeshck-Z-lmage_LYX_v2多场景落地:LoRA动态加载赋能数字人直播背景实时生成系统 1. 项目简介:一个专为本地绘画优化的轻量级工具 如果你对AI绘画感兴趣,特别是想体验国产的Z-Image文生图模型,但又被复杂的部署流程、繁琐的参数…...

Face Analysis WebUI在金融领域的应用:远程开户身份核验

Face Analysis WebUI在金融领域的应用:远程开户身份核验 1. 引言 想象一下这样的场景:一位偏远地区的客户想要开设银行账户,但最近的银行网点在100公里外。传统方式下,他需要亲自前往网点,排队等待,提交各…...

YOLO26涨点改进| CVPR 2026 | 独家创新首发、注意力改进篇| 引入SDGW空间偏差引导加权模块,含多种二次创新改进,助力图像去噪、红外小目标检测、图像分割、变换检测、关键点检测高效涨点

一、本文介绍 🔥本文给大家介绍使用 SDGW空间偏差引导加权模块 改进YOLO26网络模型,可以在空间域对每个像素位置进行自适应加权,动态增强目标信号、抑制噪声,使网络在特征提取阶段对低亮度、小目标或高噪声区域更加敏感,从而提升检测精度和召回率,同时减少假阳性。该模…...

ROS 实战指南:从 rosbag 高效提取 RGB 与深度图数据

1. rosbag基础操作与核心概念 在机器人开发领域,rosbag就像是一个万能的数据记录仪。想象一下你正在调试一个机器人视觉系统,传感器数据像流水一样不断涌来,这时候rosbag就能帮你把关键数据"冻住",方便后续反复分析。我…...

零成本打造私有云盘:从PHPStudy安装到IPv6动态域名解析全攻略

零成本打造私有云盘:从PHPStudy安装到IPv6动态域名解析全攻略 在数字化时代,个人数据存储需求呈爆炸式增长。网盘限速、隐私泄露、订阅费用高昂等问题困扰着许多用户。本文将手把手教你如何利用闲置电脑和免费工具,打造一个完全由自己掌控的私…...

Java如何实现Excel表格中间插入列

在日常Excel数据处理中,通常需要调整表格结构,例如在特定列之间插入新列。本文将介绍如何有效地使用Java代码,特别是在现有的A列和B列之间插入新列。Excel文件的高效处理,避免直接操作二进制数据带来的复杂性和错误风险&#xff0…...

判断一个链表是否是环形链表

给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索…...

客服机器人开放平台能自建知识库吗?以百应Agent为例,探讨成都企业售后自动解答的实现路径

在数字化转型加速的今天,成都作为西部电商和制造业重镇,众多企业面临售后咨询量激增的挑战。退货、物流追踪、产品故障排查等售后问题占客服咨询的 60% 以上,传统人工客服成本高、响应慢,已难以满足用户即时需求。客服机器人开放平…...

s2-pro实战落地:跨境电商产品介绍多语种语音批量生成

s2-pro实战落地:跨境电商产品介绍多语种语音批量生成 1. 场景痛点与解决方案 跨境电商企业面临一个共同挑战:如何高效地为全球不同语言市场的产品生成专业语音介绍。传统方案需要雇佣多语种配音人员,成本高、周期长,且难以保证语…...

云原生图书馆管理系统架构设计:基于SaaS的一站式解决方案与实战案例分析

某中学图书馆数字化改造实战:传统Excel管理迁移至云端系统,借还效率提升300%,系统响应时间降低至200ms以内一、背景:传统图书馆管理的痛点分析1.1 技术债务积累在数字化转型的过程中,许多中小型学校图书馆依然停留在传…...

Kandinsky-5.0-I2V-Lite-5s效果展示:建筑图纸→镜头平移漫游视频生成案例

Kandinsky-5.0-I2V-Lite-5s效果展示:建筑图纸→镜头平移漫游视频生成案例 1. 惊艳效果预览 Kandinsky-5.0-I2V-Lite-5s带来的建筑漫游视频生成效果令人印象深刻。想象一下,你有一张静态的建筑设计图纸,通过这个模型,只需简单描述…...

springboot+vue基于web的汽车后市场维修保养管理系统的设计与实现

目录系统功能模块分析维修保养业务模块财务与统计模块客户端交互功能技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统功能模块分析 用户管理模块 实现用户注册、登录、权限管理(管理员、员工、客户…...

CMake + VTK 编译

CMake VTK 编译 1下载 1 CMake下载 https://cmake.org/download/#older2 VTK 下载 https://gitlab.kitware.com/vtk/vtk/-/tags2 安装和解压缩 3 配置CMake 这一部分忘了截图 ,可以查看这里的步骤,基本一致 https://blog.csdn.net/weixin_42964413/arti…...