操作系统存储管理(分段、段页式、虚拟内存基础)
第一部分:基本分段存储管理
一、分段基本概念
1.划分规则:进程地址空间依照程序逻辑功能模块划分若干段,每一段是一个完整逻辑单元(如main主函数段、子函数段、局部变量段);编程时用户使用段名标识各段,编译后段名转为段号供CPU使用。
2.编址规则:每个段独立从0开始编址,各段长度不统一;操作系统以段为单位分配内存,单段占用内存连续空间,不同段在内存中离散存放、地址可不相邻。
3.分段优势:贴合程序逻辑,程序可读性高,用户编程便捷,可通过段名+段内地址精准访问指定模块数据。
4.逻辑地址结构(二维地址)
逻辑地址 = 段号 + 段内地址(段内偏移)
○段号位数:决定单个进程最大分段数量,N位→最多2N个段;
○段内地址位数:决定单个段最大长度,M位→单段最大2M字节(按字节编址)。
举例:段号16位→最多216=64K个段;段内地址16位→单段最大64KB。
编译行为:源代码段名→段号,变量符号(A单元/B单元)→段内地址。
二、段表(类比分页的页表)
1.作用:记录进程每个逻辑段在物理内存中的起始位置,建立逻辑段→物理内存地址映射,操作系统为每个进程单独创建段表。
2.段表项组成:段号(隐含)、段长、段基址(段内存起始物理地址)
○和页表核心区别:段表额外保存段长(各段长度不等);分页页面大小固定,页表无需记录页长;
○所有段表项占用存储空间长度固定,段号依靠下标隐含存储,不额外占用存储空间。
3.段表项寻址公式:目标段表项内存地址 = 段表起始地址 + 段号×单个段表项字节大小。
三、分段地址变换流程(逻辑地址→物理地址)
1.硬件支持:进程调度时,PCB中存放的段表起始地址、段表总长载入段表寄存器;进程运行全程依靠该寄存器获取段表信息。
2.五步地址转换
①拆分逻辑地址:拆分为段号S、段内地址W;
②段号越界检查:若S≥段表长度,触发越界中断;合法则继续;
③查找段表项:依据段表基址+段号×段表项长度,读出对应段表项(段基址、段长);
④段内地址越界检查:若W≥当前段段长,触发越界中断(分页无此步骤,页面长度固定);
⑤计算物理地址:物理地址 = 段基址 + 段内地址W。
3.访存次数:无快表时2次访存:第1次查内存段表,第2次访问目标数据。
4.快表优化:将常用段表项存入快表,命中仅需1次访存。
四、分页VS分段详细对比
补充:共享前提:仅纯可重入代码(不可修改)支持多进程共享;带可修改变量的代码段不能共享。
第二部分:段页式存储管理(分段+分页结合方案)
一、诞生背景:取长补短
1.分页优点:内存利用率高,无外部碎片,仅少量内部碎片;缺点:不方便按逻辑模块共享、保护。
2.分段优点:便于逻辑段共享保护;缺点:需要连续内存空间,产生大量外部碎片,紧凑整理耗时。
3.段页式思路:进程先按逻辑分段,每个段内部再分页;内存划分为固定大小页框(和页面等大),页面离散装入页框。
二、逻辑地址结构(段号+页号+页内偏移)
1.地址拆分说明:用户编程仅需给出段号+段内地址(二维),操作系统自动把段内地址拆分为【页号+页内偏移】,分页过程对用户透明。
2.位数作用:
○段号位数:进程最大分段数=2段号位数;
○页号位数:单个段最大页数=2页号位数;
○页内偏移位数:页面/页框大小=2偏移位数(按字节编址)。
三、段表与页表结构
1.段表(每个进程1张):段表项=段号(隐含)+页表长度+页表所在内存块号
区别于纯分段段表:纯分段存「段长+段起始地址」,段页式存「页表长度+页表块号」。
2.页表(每个段单独1张):页表项=页号(隐含)+物理内存块号,结构和分页页表完全一致。
四、段页式地址变换流程
1.硬件:进程运行前,PCB的段表基址、段表总长载入段表寄存器。
2.转换步骤
①拆分逻辑地址:段号S、页号P、页内偏移W;
②段号越界:S≥段表长度→越界中断;
③查段表:定位段表项,获取该段页表所在内存块号、页表总长;
④页号越界:P≥页表长度→越界中断;
⑤查页表:根据页表物理地址+页号,获取页面对应的物理块号;
⑥物理地址=物理块号拼接页内偏移W。
3.访存次数
○无快表:3次访存:1查段表→2查页表→3访问数据;
○引入快表(关键字:段号+页号):命中仅需1次访存。
第三部分:虚拟内存基础原理
一、传统存储管理的两大弊端(基本分页/分段/分区管理)
1.一次性:作业必须全部装入内存才能运行
○问题1:作业总大小>物理内存,大作业无法运行;
○问题2:多作业总容量超内存,并发进程数量受限。
2.驻留性:作业装入内存后全程常驻内存,直至运行结束;大量暂时不用的数据长期占用内存,浪费内存资源。
二、局部性原理(虚拟内存理论基石)
1.时间局部性:刚被访问的指令/数据,短期内大概率重复访问;成因:程序循环结构。
2.空间局部性:访问某内存单元,其相邻单元不久也大概率被访问;成因:指令顺序存储、数组等数据连续存放。
核心思想:程序运行仅使用自身一小部分代码数据,无需全量载入内存。
三、虚拟内存定义与三大特征
1.原理:作业仅把即将使用的部分调入内存,剩余数据存外存;缺数据时OS自动从外存调入,内存不足时换出闲置数据至外存;物理内存容量不变,逻辑上扩充内存(OS虚拟性体现)。
2.三大特性(对应抵消传统管理一次性、驻留性)
○多次性:作业分多次分批调入内存;
○对换性:运行中数据可在内存、外存换入换出;
○虚拟性:逻辑内存远大于物理内存。
四、虚拟内存实现前提与分类
1.实现基础:必须基于离散分配存储(连续分配难以分次调入),衍生三种实现:
○请求分页存储管理(主流)、请求分段存储管理、请求段页式存储管理。
2.OS必备两大核心功能
①请求调页(调段):访问内容不在内存时,自动从外存调入对应页/段;
②页面(段)置换:内存空间已满,淘汰暂时闲置页/段写入外存,腾出空间加载新内容。
整体总结
1.分段:按逻辑划分、二维地址、易共享、有外碎片;分页:按物理划分、一维地址、内存利用率高、难共享;段页式融合二者优点。
2.访存汇总:分页/分段无快表=2次访存;段页式无快表=3次访存;各类方案快表命中均只需1次访存。
3.虚拟内存依托局部性原理,打破传统内存一次性、驻留性约束,依靠请求调入+页面置换实现逻辑扩容。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)