在学习操作系统或刷题时,"分页"是个绕不过去的概念。你可能听过简单分页,也可能好奇分段、分段分页这些"兄弟"方式有什么不同。尤其是它们带来的"碎片"问题,还有"进程共用页表"这种特殊情况,可能是考试或题目里的重点。这篇博客会用小白能懂的方式,带你搞清楚这些知识,重点强调碎片问题和共用页表的场景!
什么是分页?为什么要用?
**分页(Paging)**是操作系统管理内存的一种方法。想象内存是个大仓库,程序是"货物",操作系统是"管理员"。为了高效利用空间,内存和程序被切成小块,分给程序用。分页有几种方式,每种方式都会影响"碎片"(内存浪费)的类型和程度。我们先从"简单分页"讲起,再看看其他方式,最后聊聊碎片和共用页表。
分页的三种方式与碎片情况
1. 简单分页(Simple Paging)
- 怎么分?怎么用?
- 内存和程序都切成固定大小的小块(页面),比如4KB一页。
- 页面可以散落在内存各处,不需要连续。
- 生活比喻: 像把书拆成固定大小的纸片,书架分成同样大小的格子,随便放哪儿都行。
- 碎片情况 :
- 外部碎片 : 很少。因为页面大小固定,不要求连续,零散空闲页面也能用。但如果空页面太分散,可能不够放新程序(比如总空闲8KB,但需要连续4KB)。
- 内部碎片 : 存在。页面固定大小,程序用不满一页时,剩下的空间浪费。比如程序10KB,页面4KB,需要3页(12KB),最后2KB没用上。
- 刷题Tips: 题目可能问:"简单分页有外部碎片吗?" 答案是:理论上很少,但不绝对。
2. 分段(Segmentation)
- 怎么分?怎么用?
- 按程序的逻辑单元切分,比如代码段、数据段,大小不固定。
- 每段需要连续的内存空间。
- 生活比喻: 像把行李按类型分(衣服一堆、鞋子一堆),每堆得塞进一个连续的大格子。
- 碎片情况 :
- 外部碎片 : 严重。因为需要连续空间,内存用了一段时间后,会出现很多小块空闲区域,总量够但不连续,没法用。比如内存剩5KB+3KB空闲,但一个6KB的段放不下来。
- 内部碎片 : 没有。段大小按需分配,不会有固定块的浪费。
- 刷题Tips: 题目可能问:"分段为啥碎片多?" 答案是:连续分配导致空闲块分散。
3. 分段分页(Segmented Paging)
- 怎么分?怎么用?
- 先按逻辑单元分段(比如代码段10KB)。
- 每段再切成固定大小的页面(比如4KB),页面不需连续。
- 生活比喻: 先把行李按类型分,再把每类切成小份,散开放进格子。
- 碎片情况 :
- 外部碎片 : 很少。段内的页面可以不连续,像简单分页一样灵活,空闲页面分散也能用。
- 内部碎片 : 存在。页面固定大小,段内最后一页可能不满。比如代码段10KB,分3个4KB页,最后2KB浪费。
- 刷题Tips: 题目可能问:"分段分页碎片咋样?" 答案是:外部少、内部有。
碎片对比总结
方式 | 外部碎片 | 内部碎片 | 原因 |
---|---|---|---|
简单分页 | 很少 | 有 | 固定大小、不需连续 |
分段 | 严重 | 无 | 需连续、大小不固定 |
分段分页 | 很少 | 有 | 页面固定、不需连续 |
进程共用页表:啥时候会出现?
页表是内存管理的"地址簿",记录逻辑页面和物理页面的对应关系。通常,每个进程有自己的页表,确保独立性。但有些情况下,进程会共用页表,这在刷题或考试中可能是个陷阱点。
1. 共用页表的场景
- 共享内存 : 多个进程需要访问同一块内存时(比如进程间通信),可以用同一个页表条目指向相同的物理页面。
- 例子: 两个进程共享一个数据缓冲区,操作系统让它们的页表指向同一个物理地址。
- 线程 : 一个进程内的多个线程天然共用页表。因为线程共享进程的内存空间,只用一个页表就够了。
- 例子: 你写了个多线程程序,线程A和B操作同一块内存,用的是一张页表。
- 节省空间 : 如果多个进程运行同一个程序(比如多个终端运行
bash
),操作系统可能让它们的代码段页面共用,只读不改,页表指向同一块物理内存。- 例子 : 系统中10个
bash
进程,代码部分页表都指向同一个地方,节省内存。
- 例子 : 系统中10个
2. 生活比喻
想象页表是"地图",正常每个游客(进程)拿一张独享地图。但如果几个游客要去同一个景点(共享内存),可以用同一张地图;或者一群朋友(线程)一起旅行,只需一张地图就够。
3. 刷题Tips
- 题目可能问:"进程共用页表的好处?" 答案是:节省内存、方便共享数据。
- 或者问:"线程和进程页表区别?" 答案是:线程共用进程的页表,进程间通常独立。
为什么这些知识重要?
- 碎片问题: 不同分页方式影响内存利用率,分段外部碎片多,简单分页和分段分页更高效但有内部碎片。考试可能让你分析哪种方式适合什么场景。
- 共用页表: 理解它能帮你搞清楚进程、线程、共享内存的机制,刷题时遇到相关问题不慌。
小结:碎片与共用页表的重点
- 简单分页: 外部碎片少,内部碎片有,简单高效。
- 分段: 外部碎片多,无内部碎片,逻辑清晰但浪费空间。
- 分段分页: 外部少、内部有,兼顾灵活性和逻辑。
- 共用页表: 共享内存、线程、节省空间时出现,提升效率。
希望这篇博客让你对分页、碎片和共用页表有个清晰的认识!下次刷题,看到这些概念,记得想想"切法""碎片"和"共享"的比喻。有疑问欢迎留言~