段页结合物理内存

📅 2026/7/30 13:49:51 👁️ 阅读次数 📝 编程学习
段页结合物理内存

引言

实际的内存到底是如何管理,是段存储还是页存储。上文详细讲解了段页储存,感兴趣请阅读:https://blog.csdn.net/weixin_52748928/article/details/163102020?spm=1011.2124.3001.6209

其实操作系统采用的是段页结合的方式来管理内存的。对程序员来说是内存是,但是对操作系统来说内存是页(减少内存碎片)。

笔者持续更新Java 技术栈的知识,个人的语雀笔记:Object.N · 语雀https://www.yuque.com/objectn

实际管理内存

段、页同时存在:段面向用户/页面向硬件。提出了虚拟内存这个概念,用户看到的是内存是分段的,由虚拟内存映射到对应内存的页中,这样即避免了内存的碎片,也给用户提供了方便管理的内存。

地址重新定位

通过虚拟内存中映射获得对应的基址,然后拿到基地址去找对应的页。每个进程由独立的段表页表

内存的换入和换出

使用换入换出来实现虚拟内存,如果有4G 内存,给用户的感觉就是有4G的内存。但是实际的物理内存没有这么多。

因此我们要换入,即可用的内存可能没有4G,但是分配的内存有可以在使用时把要使用的加载进来,不用的内存页换出。只要加载和换出的速度够快,感觉上就是你有4G的空间。

关于内存换出的细节

当内存调用时发现没到到对应的页(缺页),这时去加载磁盘中的数据到一块空的内存中,然后继续执行,把加载进来的地址通过总线发送给cpu。这就是换入的大体过程。

换出算法

min页面置换

选最远将使用的页淘汰,是最优方案 。但是MIN需要知道将来发生的事?说以没法实际使用

LRU页面置换

选最近最长一段时间没有使用的 页淘汰(最近最少使用)。

使用LRU 准确实现无论使用时间戳或者使用页码栈,实现起来资源消耗都很大。因此就有了LRU 的近似的实现。

LRU近似实现-将时间计数变为是和否

每次访问一页时, 硬件自动设置一位为1,否则是0,淘汰该位为0的。这种算法叫 Clock。有可能会所有的R=1,这样算法就会退化为FIFO。为了解决这个问题,应该加入一个指针,定时清除。

cpu颠簸

系统内进程增多=》每个进程 的缺页率增大=》缺页率增大到一 定程度,进程总等待调页完成=》CPU利用率降低=》进程进一步增 多,缺页率更大…

解决方案
  • 限制进程的数量
  • 为进程设置合理的内存

swap in(换入) swap out(换出)swap分区管理

swap分区是操作系统内核会将内存中暂时不活跃的数据(如进程的堆、栈等匿名内存数据)移出至 Swap 空间,从而为当前运行的程序腾出内存;当需要这些数据时,再将其从 Swap 换入内存。

一张图总结: