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

段式虚拟存储器:一座“量身定制“的智慧大厦

楔子:一个关于"整理房间"的哲学问题

假设你要搬家,面前堆着一大堆东西:书籍、衣服、厨具、电子设备……

有两种打包方式:

方式一:拿来一堆完全相同的标准纸箱,不管装的是什么,每个箱子都装满固定的重量就封箱。于是一个箱子里可能既有书又有袜子还有半个炒锅。这种"一刀切"的打包法,就是我们上一篇讲过的分页

方式二:按照物品的种类来打包——书籍单独装、衣服单独装、厨具单独装。每一类东西用一个独立的箱子,箱子大小根据物品多少来定:书多就用大箱,袜子少就用小箱。这种"按意义分类"的打包法,就是今天的主角——分段

你有没有发现,第二种方式更符合人类的直觉?因为它尊重了物品本身的逻辑关系——同一类的东西放在一起,找起来方便,管理起来清晰。

段式虚拟存储器,正是这样一种"懂得尊重程序逻辑"的存储管理方式。让我们走进这座"量身定制"的智慧大厦,看看它的精妙之处。


第一章:程序员眼中的世界——程序本就是"分段"的

一个程序的"内部结构"

在动手之前,我们先思考一个问题:一个程序,在程序员眼里,到底长什么样?

一个典型的程序,并不是一团乱麻,而是由几个逻辑清晰的功能模块组成的:

  • 代码段(主程序):程序的指令,告诉计算机"做什么"
  • 子程序段(函数库):被反复调用的功能模块
  • 数据段:程序要处理的各种数据
  • 栈段:用来存放函数调用、临时变量的"草稿纸"

生动理解
这就像一家公司,天然地分成了研发部、市场部、财务部、后勤部。每个部门职能不同、人数不同,但都是独立而完整的单元。

你看,程序本身就是"分段"的!每一段都有它独立的意义和完整的功能。

那么问题来了:既然程序天然分段,我们为什么非要像分页那样,把它强行切成大小相等、毫无逻辑意义的碎块呢?

打个比方
分页就像把公司所有员工,不分部门,每50人硬塞进一间办公室。结果研发部的人可能和财务部的人挤在一起,一个完整的部门被拆散在好几个房间里。

而分段则说:让每个部门拥有自己独立的、大小合适的办公区域!研发部人多就给大空间,后勤部人少就给小空间。

这,就是分段的核心思想——按照逻辑模块来划分,每段大小不固定,量身定制。


第二章:什么是"段"——量身定制的空间

不再整齐划一,而是各取所需

在段式存储中,程序的逻辑地址空间,被划分成若干个段(Segment)

每个段有两个鲜明的特点:

  1. 每个段对应一个完整的逻辑模块(比如一个函数、一组数据)
  2. 每个段的长度可以不同,取决于它实际需要多大空间

对比记忆

  • :大小固定(如4KB),由"硬件"决定,不管内容
  • :大小可变,由"程序逻辑"决定,尊重内容

每个段内部,地址是从0开始连续编号的。也就是说,每个段都有自己独立的一套"门牌号"。

生动场景
想象一座写字楼,里面有好几家公司。每家公司内部,都是从"1号工位"开始编号的。研发公司有它的1号、2号工位;市场公司也有它自己的1号、2号工位。各家公司的编号互不干扰,自成体系。

于是,一个程序在分段后,就变成了若干个独立的、长度不一的段,每个段内部地址从0开始。


第三章:段式地址的"双重身份"——段号与段内偏移

一个地址,两个信息

在段式存储中,一个逻辑地址同样由两部分组成,但含义和分页不太一样:

┌──────────────┬──────────────────┐ │ 段号 S │ 段内偏移 W │ └──────────────┴──────────────────┘
  • 段号S:告诉你"在哪一个段"(哪个部门)
  • 段内偏移W:告诉你"在这个段内部的第几个位置"(这个部门的第几个工位)

生动理解
这就像公司里的定位方式——“研发部·第27号工位”。

  • "研发部"就是段号——告诉你去哪个部门
  • "第27号工位"就是段内偏移——告诉你在那个部门里的具体位置

注意一个关键区别

在分页中,因为每页大小固定,逻辑地址是"天然连续"的,页号和页内偏移是直接从一个二进制地址里"切"出来的。

而在分段中,因为每段长度不同,逻辑地址需要明确地由"段号"和"段内偏移"两部分组成,它们更像是程序员主动指定的"段名+位置"。


第四章:段式世界的"地址翻译官"——段表

一本记录"每个部门在哪、有多大"的档案

和页式存储一样,段也需要被搬进内存的某个位置。可问题是,每个段大小不同,被搬进内存后,散落在内存的各个角落,起始位置各不相同。

程序说"我要访问研发段的第27个位置",可它不知道研发段被搬到了内存的哪里。

这时,又需要一位"翻译官"了——它就是段表(Segment Table)

段表是一张记录每个段详细信息的档案,每一行(每个段表项)至少包含三样关键信息:

段号段长(这个段有多大)段基址(这个段在内存的起始地址)
0号段(代码)2KB内存第8000号位置
1号段(数据)5KB内存第3000号位置
2号段(栈)1KB内存第15000号位置

生动理解
段表就像物业管理处的租户档案。它记录着:

  • “研发公司租了多大面积”(段长)
  • “研发公司在大厦的哪个位置”(段基址)

你要找研发公司的某个工位,先查档案得知"研发公司从8000号位置开始,占地2KB",然后就能精确定位了。

注意,段表项比页表项多了一个重要信息——段长!这个"段长"可不是摆设,它马上要派上大用场。


第五章:地址翻译全过程——一次带"安检"的寻址

寻址五步曲(含安全检查)

假设CPU要访问逻辑地址(段号S,段内偏移W),完整的翻译过程如下:

第一步:从逻辑地址中取出段号S段内偏移W

第二步:拿着段号S去查段表,找到对应的段表项。

第三步:🚨关键的安全检查!比较段内偏移W和段长:

“你要访问的位置W,有没有超出这个段的范围?”

  • 如果W < 段长:合法访问,放行通过 ✅
  • 如果W ≥ 段长:越界了!触发越界中断,访问被拒绝 ❌

第四步:检查通过后,从段表项中取出段基址B,与段内偏移W相加:

物理地址 = 段基址B + 段内偏移W

第五步:CPU拿着这个物理地址,去内存对应位置取出数据,寻址成功!🎉

为什么要安检?
因为每个段都有明确的"边界"。研发部的工位只到第50号,如果有人非要访问研发部的第99号工位,那显然是出错了(要么程序bug,要么恶意攻击)。段长的存在,让系统能够精确地守护每一段的边界

这就像每个部门门口都有保安:你刷卡进研发部,但你要找的工位号超出了研发部的范围,保安立刻拦住你:“对不起,您找的位置不在本部门,不能放行!”


第六章:分段的两大"超能力"——保护与共享

段式存储有两个分页难以比拟的天然优势,这都源于"段对应完整逻辑模块"这一特性。

超能力一:精细的"安全保护"🛡️

因为每个段是一个完整的逻辑单元,我们可以给整个段设置统一的访问权限:

  • 代码段:设为"只读 + 可执行",防止程序运行时不小心把自己的指令改了
  • 数据段:设为"可读可写",方便处理数据
  • 只读数据段:设为"只读",保护常量不被篡改

生动理解
这就像给公司不同部门设置不同的门禁权限:

  • 财务部:只有财务人员能进(高度保密)
  • 接待大厅:所有人都能进(公开)
  • 机房:只能看不能动(只读)

权限以"部门"(段)为单位,清晰明了。如果用分页,一个部门被拆在好几个箱子里,权限管理就乱套了。

超能力二:方便的"资源共享"🤝

很多程序会用到相同的功能模块,比如同一个函数库。在段式存储中,多个程序可以共享同一个段

生动场景
假设大厦里有好几家公司,它们都需要用到"会议室"。与其每家公司都自建一个会议室(浪费空间),不如大家共用一个公共会议室——只要在各自的档案(段表)里,都指向同一个会议室的位置即可。

同样,一个被多个程序使用的函数库,在内存里只需保存一份,各个程序的段表都指向它。这样既省内存,又便于维护。

由于段是完整的逻辑模块,共享起来"干净利落"——共享的就是一个完整的、有意义的单元,而不是分页那种"半个函数加半串数据"的尴尬碎块。


第七章:美中不足——恼人的"外部碎片"

段式存储如此优雅,但它也有一个挥之不去的烦恼——外部碎片

大小不一带来的麻烦

还记得吗?每个段大小不同。当段被不断地调入、调出内存,时间一长,内存里就会出现许多大小不一的空闲小块,它们零散地分布着,每一块都不大,单独拿出来谁也装不下一个完整的新段。

生动场景
想象一个停车场,停的全是大小不同的车——大巴、轿车、卡车。车来车往,开走几辆后,停车场里东一块、西一块地空出了一些缝隙。可这些缝隙,单独看每一个都太小,停不下一辆新的大巴。但如果把它们加起来,明明空间是够的!

这些"用不上的零散空间",就是外部碎片

这正是分段的痛点:因为段长不固定,内存分配后留下的"边角料"难以利用。

对比:分页就没有这个烦恼。因为页和页框大小完全相同,任何一个空闲页框都能装下任何一页,绝不会有"装不下"的尴尬(分页只有少量"内部碎片"——最后一页可能没装满)。

解决办法:紧凑技术

为了对付外部碎片,可以采用**紧凑(Compaction)**技术——把内存中分散的段重新挪动,向一端集中,让空闲空间连成一片大块

就像停车场管理员把所有车都往一边靠拢停齐,于是零散的缝隙就合并成了一大片空地,足以停下新来的大巴。

但紧凑需要大量地搬移数据,代价不小,不能频繁使用。


第八章:段式 VS 页式——一场理念之争

让我们把这两位"存储管理大师"放在一起,做个全面对比:

对比维度页式存储段式存储
划分依据硬件固定大小(不管内容)程序逻辑模块(尊重内容)
大小固定(如4KB)可变(按需而定)
划分者系统自动完成体现程序员的逻辑设计
地址结构一维(天然连续)二维(段号+段内偏移)
碎片问题内部碎片(少量浪费)外部碎片(需紧凑解决)
保护与共享不太方便非常方便、自然
优点内存利用率高、管理简单符合逻辑、便于保护和共享

一句话总结二者的哲学差异

  • 分页站在系统的角度:我只管把内存用满,至于你程序的逻辑结构,我不关心。重效率,轻逻辑。
  • 分段站在程序员的角度:我尊重你程序的每一个逻辑模块,让它们各得其所、方便保护和共享。重逻辑,轻效率。

那么,有没有办法取二者之长,避二者之短呢?

有!那就是把分段和分页结合起来的——段页式存储管理。它先把程序按逻辑分成段(满足逻辑性),再把每个段切成固定大小的页(解决碎片问题)。不过,那就是另一个精彩的故事了。


尾声:技术中的"以人为本"

回顾段式虚拟存储器,你会发现它身上闪耀着一种特别的光芒——它是"以程序员为中心"的设计

分页方便了机器,而分段,理解了人

它明白程序员心中的程序不是一团均匀的字节流,而是一个个有血有肉、各司其职的逻辑模块;它愿意为每个模块量身定制空间,愿意为每个模块设置专属的保护,愿意让有用的模块被大家共享。

这种"尊重逻辑、尊重结构"的设计哲学,启示我们一个朴素而深刻的道理:

最好的工具,不是逼着人去适应机器,而是让机器去贴合人的思维。

当然,段式存储也为这份"以人为本"付出了代价——外部碎片的烦恼,正是它尊重逻辑、不愿"一刀切"的副作用。世上没有完美的方案,每一个设计都是在取舍之间寻找平衡

而正是分页与分段各自的优劣,催生了后来集大成的"段页式"——这恰恰说明,技术的进步,往往来自于对不同思想的融合与超越

下一次,当你的程序在内存中优雅地运行,每个模块安守本分、互不侵犯时,请记得,这背后有一种叫"分段"的智慧,正默默地守护着秩序与逻辑之美。🏛️✨


核心知识点回顾

概念一句话理解
按程序逻辑模块划分,大小可变的存储块
段号 + 段内偏移段式逻辑地址的两个组成部分
段表记录每个段的"段长"和"段基址"的档案
越界检查用段长检查访问是否超出段的边界
地址翻译物理地址 = 段基址 + 段内偏移
段的保护以段为单位设置访问权限
段的共享多个程序共用同一个段,省内存
外部碎片段大小不一导致的零散空闲空间
http://www.jsqmd.com/news/1036874/

相关文章:

  • 中级OpenGL教程 010:Object 类设计与模型矩阵完全实现
  • NXP DPAA硬件加速实战:报文头操作与CAAM加密引擎配置详解
  • 2026 安徽哪所学校护理升学强?5大高升学率中职招生名单 - 小途xt
  • 包包有磨损、无配件?沈阳正规回收解决方案 - 开心测评
  • 2026年论文写作AI工具怎么用?豆包等工具详细使用教程 - 掌桥科研-AI论文写作
  • 2026滁州家长注意!离南京这么近,孩子学建筑去这所公办中职,比在南京打工强 - 我叫小周
  • 7 款无会员去水印工具实测,自媒体 2026 清单 - 时时资讯
  • 2026东莞寄卖回收一体奢品店推荐,不急出手可托管售卖到手收益更可观 - 名奢变现站
  • 50行Python实现人脸检测:OpenCV+Haar级联原理与实战
  • 2026重庆高端珠宝首饰回收排行 权威鉴定实测靠谱商家榜单 - 名奢变现站
  • Python自动化测试实战:从框架选型到工程化落地
  • 高价无损专业核验,2026哈尔滨回收百年灵手表优选榜单 - 名奢变现站
  • Linux Shell脚本结构化命令:条件判断与循环控制实战指南
  • 2026佛山宝格丽首饰回收正规门店实力排名:四大维度实测盘点靠谱变现渠道 - 薛定谔的梨花猫
  • 汇编语言工程实践:标签系统与伪指令在嵌入式开发中的核心应用
  • Windows Server 2016镜像获取、验证与部署实战指南
  • 新手部署 OpenClaw 完整操作流程 自动适配 Git/Node 运行依赖工具(含安装包)
  • 海南企业跨境出海必备|海南出口退税代办、海南ODI备案办理专业机构TOP5,海南ODI备案办理、海南出口退税代办哪家专业? - GrowthUME
  • 2026佛山不锈钢幕墙 售楼部金属门楼定制厂家推荐|佛山众亿金属,自有全套数控生产线,非标定制仿古镀铜、异形幕墙 - 热点速览
  • 论文写作AI工具有哪些?精选6款实用工具,科研必备 - 掌桥科研-AI论文写作
  • 从效率角度看公众号编辑器:如何用AI重构内容生产流程 - 行业产品测评专家
  • 口碑好的天津暖气片品牌生产厂家有哪些 - 资讯速览
  • 上海口碑优质企业财务合规咨询公司分梯队推荐 - GrowthUME
  • DisneyF1名创优品:多IP联名视频的AIGC制作复盘,版权边界内的符号化设计与视觉一致性控制
  • 长沙县郡优教育培训学校有限公司官方联系方式 - 第三方测评
  • SmartDSP OS内存与MMU管理:嵌入式实时系统的性能基石
  • 2026 海淀区靠谱门窗公司推荐,断桥铝门窗、老房换窗、全屋换窗、保温节能门窗、落地窗、推拉门、平开窗高性价比优选指南 - 品牌智鉴榜
  • 2026安徽省淮南中考2百多分可以上什么学校?——安徽合肥医药卫生学校3+2直升大学! - 小张zc
  • Google Colab零配置运行Tesseract-OCR中文识别实战
  • 多维PTE问题与组合设计的数学结构解析