Linux系统编程之虚拟内存

发布于:2025-04-14 ⋅ 阅读:(24) ⋅ 点赞:(0)

概述

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

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

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

地址转换

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

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

缺页中断

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

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

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

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

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

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

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

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

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

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

总结

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

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到