Linux系统编程之虚拟内存

概述

计算机内存是临时存储数据的地方,它比硬盘快得多,但容量有限。现代操作系统通过虚拟内存技术,使得每个进程都感觉自己独占整个地址空间,这不仅提高了安全性,也简化了内存管理。

物理内存:实际安装在计算机上的RAM,它是计算机直接使用的高速存储器,所有正在运行的进程和操作系统内核共享同一块物理内存。相比硬盘等其他存储设备,物理内存提供了极高的读写速度。但受制于硬件限制,物理内存的大小通常是固定的,比如:4GB、8GB或更大。

虚拟内存:是一种抽象层,允许操作系统为每个进程提供独立的、连续的地址空间,即使实际的物理内存可能被分割成不连续的部分。

地址转换

虚拟内存的一个重要特性是:地址转换,即把虚拟地址转换为物理地址。这个过程,是由操作系统和硬件共同完成的。操作系统维护着一个映射表,用于记录虚拟地址和物理地址之间的对应关系。MMU是CPU中的一个硬件组件,负责执行地址转换操作。

当进程试图访问某个虚拟地址时,MMU会查找对应的页表条目,找到相应的物理地址后进行访问。如果所需页面不在物理内存中,则会发生缺页中断(Page Fault)。此时,操作系统会将该页面从磁盘加载到内存中。

缺页中断

缺页中断是一个关键的内存管理机制,发生在当程序试图访问一个尚未加载到物理内存中的虚拟地址时。这种机制使得操作系统能够在内存不足的情况下继续运行多个进程,并有效地管理内存资源。

缺页中断的处理步骤主要有五步,下面详细进行介绍。

1、触发缺页中断。CPU尝试访问一个虚拟地址,但该地址对应的页面不在物理内存中。

2、查找页表。操作系统检查页表,确认该虚拟地址是否已经映射到了某个物理地址。如果没有找到有效的映射,则确定这是一个合法的缺页。如果找到了无效的映射(试图访问未分配或保护的内存),则会产生段错误。

3、页面调度。对于合法的缺页,操作系统需要将所需的页面从磁盘加载到物理内存中。这可能涉及以下几种情况。

(1)页面在交换分区中。操作系统将页面从交换分区加载回物理内存。

(2)页面在文件系统中。对于内存映射文件,操作系统会从文件系统读取数据并加载到内存中。

(3)新分配的页面。如果是首次访问的新分配页面,操作系统会为其分配新的物理内存页。

4、更新页表。一旦页面被加载到物理内存中,操作系统更新页表以反映新的映射关系。

5、恢复执行。操作系统返回控制权给引发缺页中断的进程,使其继续执行原来的指令。

总结

虚拟内存是操作系统提供的一个抽象层,它为每个进程提供了一个独立且连续的地址空间。这种设计带来了以下几个好处。

隔离性。不同进程之间的内存空间是相互隔离的,一个进程无法直接访问另一个进程的内存,从而提高了系统的安全性和稳定性。

灵活性。即使物理内存不足,虚拟内存也可以通过交换分区来扩展,即将部分内存数据暂时存储到硬盘上。

效率提升。虚拟内存管理系统可以优化内存页面的分配和回收,减少内存碎片化问题。

相关推荐
良许Linux9 分钟前
嵌入式算吃青春饭么?
linux
良许Linux20 分钟前
马上要毕业去工作了,做嵌入式软件开发工程师,但是完全不会编程怎么办?
linux
良许Linux25 分钟前
学stm32,有什么学习方法?
linux
良许Linux26 分钟前
为啥有好多人说 Arduino 是玩具?
linux
独行soc37 分钟前
2025年常见渗透测试面试题-红队面试宝典下(题目+回答)
linux·运维·服务器·前端·面试·职场和发展·csrf
mosaicwang41 分钟前
dnf install openssl失败的原因和解决办法
linux·运维·开发语言·python
想躺在地上晒成地瓜干1 小时前
树莓派超全系列教程文档--(24)本地化设置、SSH及配置防火墙
linux·ssh·树莓派·raspberrypi·树莓派教程
小丁爱养花1 小时前
驾驭 Linux 云: JavaWeb 项目安全部署
java·linux·运维·服务器·spring boot·后端·spring
HORSE RUNNING WILD2 小时前
为什么我们需要if __name__ == __main__:
linux·python·bash·学习方法
王闯写bug3 小时前
linux一次启动多个jar包
linux·jar