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

Linux中虚拟内存详解

一、虚拟内存的概念

虚拟内存是现代操作系统为了有效管理内存资源、提高内存利用率以及实现多任务处理等目的而引入的一种重要的内存管理机制。它为每个程序(通常对应一个进程)提供了一个看似连续且容量较大的地址空间,而这个地址空间并不一定直接对应着实际的物理内存。

二、虚拟内存的作用

1. 地址空间扩展

在 32 位系统中,通过虚拟内存机制,每个程序可以拥有 4GB 的虚拟地址空间,在 64 位系统中这个虚拟地址空间则更为庞大。这使得程序在编写和运行时无需过于担心物理内存的实际容量限制,仿佛拥有了足够大的内存来存放数据和执行指令。

2. 内存保护

虚拟内存允许操作系统为不同的程序(进程)设置不同的内存访问权限。例如,一个进程的代码区可以被设置为只读权限,防止程序在运行过程中意外修改自身代码;而数据区可以设置为可读可写权限。通过这种权限设置,能够有效保护各个进程的内存区域不被其他进程非法侵入,保障了系统的稳定性和安全性。

3. 内存共享

不同的进程可以通过虚拟内存机制共享某些内存区域。比如,多个进程可能都需要访问同一个动态链接库,那么操作系统可以通过虚拟内存的映射方式,使得这些进程在各自的虚拟地址空间中都能 “看到” 并访问到这个共享的动态链接库所在的内存区域,提高了内存资源的利用率。

4. 便于内存管理

虚拟内存将实际的物理内存和程序使用的内存进行了分离,使得操作系统可以更加灵活地管理内存资源。例如,操作系统可以根据程序的运行需求,动态地将虚拟地址空间中的页面映射到物理内存的不同页框中,或者将暂时不使用的页面从物理内存中置换出来,存储到磁盘等外部存储设备上的交换空间(swap space)中,以腾出物理内存给更需要的程序使用。

三、虚拟内存与进程的关系

1. 进程视角下的虚拟内存

对于每个进程而言,它所看到的就是自己独立的虚拟地址空间,这个空间被划分成不同的区域,如代码区、数据区、栈区、堆区等。进程在运行过程中,通过虚拟内存机制,按照自身的需求对这些区域进行数据存储和指令执行等操作。例如,当一个进程调用一个函数时,会在自己的栈区虚拟地址空间内开辟相应的空间来存储函数调用的相关信息;当进程需要动态分配内存时,会在堆区的虚拟地址空间中进行操作。

2. 操作系统对进程虚拟内存的管理

操作系统负责为每个进程创建和维护其虚拟地址空间。当一个进程启动时,操作系统会根据进程的可执行文件等相关信息,将其虚拟地址空间的各个区域进行初始化,确定每个区域的大小、权限等属性。同时,操作系统还会通过页表等机制,将进程的虚拟地址空间中的页面不断地映射到物理内存的页框中,以保障进程的正常运行。并且,在进程运行过程中,操作系统会根据进程的运行状态和内存需求,动态地调整虚拟地址空间与物理内存之间的映射关系,比如将暂时不使用的页面置换出来,或者将需要的页面重新映射到物理内存中。

四、页表

虚拟内存和物理内存都被划分成固定大小的单元,在 Linux 中通常是 4KB 大小的页(Page)和页框(Page Frame)。虚拟内存以页为单位进行管理,物理内存以页框为单位进行管理。

在这里插入图片描述

在 Linux 操作系统中,task_struct是一个极为重要的结构体,它用于表示一个进程的所有信息,是进程在内核中的抽象表示。上面的图可以看出在常见的基于页式内存管理的操作系统(如 Linux)中,进程的各个内存区域包括栈区、代码区、数据区等,通常是按照固定大小(一般为 4KB,不过不同系统可能有差异,也可能采用其他如 8KB 等页大小)划分成一个个的页,然后通过页表来映射到物理内存中同样大小的一个个页框(也是 4KB 等)。

五、MMU

MMU(Memory Management Unit,内存管理单元)是现代计算机系统中非常重要的一个组件,主要负责处理虚拟内存与物理内存之间的映射关系以及提供内存访问保护等功能。

1、物理内存映射

MMU 的映射作用:MMU 的核心功能之一就是实现虚拟内存到物理内存的映射。它通过维护页表(Page Table)来完成这种映射关系。当 CPU 要访问一个虚拟地址时,MMU 会根据预先设置好的页表,将该虚拟地址转换为对应的物理地址,然后再去访问实际的物理内存位置。例如,在 Linux 系统中采用多级页表机制,MMU 依据这些页表结构准确地找到虚拟地址对应的物理地址,使得程序能够在虚拟地址空间中正常运行,而无需关心实际物理内存的布局和分配情况。

2、页表管理

页表存储:如前文所述,MMU 依靠页表来实现虚拟地址到物理地址的映射。页表通常存储在物理内存中,并且其结构可以是多级的,比如常见的二级页表或三级页表结构(以不同的计算机架构为准)。MMU 会根据需要从物理内存中读取页表项信息来完成地址转换操作。

页表更新与维护:在系统运行过程中,随着程序的运行和内存的动态分配与再分配,页表可能需要不断更新。例如,当一个程序新申请了一块内存,或者释放了一块已使用的内存,操作系统会相应地修改页表中的相关页表项,MMU 则依据更新后的页表继续准确地进行地址转换。同时,MMU 也可以协助操作系统进行一些页表维护工作,比如检测页表项是否有效等。

3、内存访问保护

保护机制原理:MMU 除了进行地址转换外,还提供了重要的内存访问保护功能。它通过设置不同的权限位来区分不同类型的内存访问,比如可读、可写、可执行等权限。当 CPU 试图访问一个虚拟地址时,MMU 会先检查该虚拟地址对应的页表项中设置的权限,如果访问操作不符合规定的权限,MMU 就会触发一个异常,阻止这种非法访问行为,从而保护了系统的内存资源以及各个程序的运行安全。

应用场景示例:考虑一个多用户系统,不同用户的程序在运行时都有各自的虚拟地址空间。MMU 通过对每个用户程序的虚拟地址空间设置恰当的权限,确保一个用户的程序不能随意访问另一个用户程序的内存区域,同时也防止程序对系统关键内存区域(如内核空间)进行非法访问,保障了系统的稳定性和安全性。、

六、虚拟内存在系统层面的存在形式

虚拟内存不仅仅局限于进程内部。在整个操作系统层面,虚拟内存是一种整体的内存管理策略和机制。操作系统会设置一个总的虚拟地址空间,这个空间包含了所有可能被各个进程所使用的虚拟地址空间部分,以及一些用于操作系统自身运行的虚拟地址空间部分(如内核空间)。同时,操作系统会通过一系列的机制(如页表管理、内存置换算法等)来管理这个总的虚拟地址空间与实际物理内存之间的关系,以确保整个系统的高效运行和内存资源的合理利用。

所以,虚拟内存虽然与进程紧密相关,是每个进程运行所依赖的重要机制,但它也是整个操作系统层面用于内存管理的一种重要手段,在系统层面也有其存在形式和管理方式。


http://www.kler.cn/a/397032.html

相关文章:

  • 微信小程序 === 使用腾讯地图选点
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的解决方案
  • 基于OpenCV的图片人脸检测研究
  • 二分搜索的三种方法
  • HarmonyOS Next星河版笔记--界面开发(5)
  • 0x00基础算法 -- 0x05 排序
  • Java项目实战II基于微信小程序的个人行政复议在线预约系统微信小程序(开发文档+数据库+源码)
  • 报错 No available slot found for the embedding model
  • 中科蓝讯修改蓝牙名字:【图文讲解】
  • 童年的快乐,矫平机为玩具打造安全品质
  • Vue和Vue-Element-Admin(十四):vue3.x与vue2区别分析
  • Linux(CentOS)安装达梦数据库 dm8
  • 期末考核-机器学习-期末考核
  • 将 SQL 数据库连接到云:PostgreSQL、MySQL、SQLite 和云集成说明
  • C++ 多线程std::thread以及条件变量和互斥量的使用
  • LeetCode-215.数组中的第K个最大元素
  • 云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
  • 十九:Spring Boot 依赖(4)-- spring-boot-starter-security依赖详解
  • 【DM系列】详解 DM 字符串大小写敏感
  • ldconfig 和 LD_LIBRARY_PATH 区别
  • 虎扑APP数据采集:JavaScript与AJAX的结合使用
  • QT使用libssh2库实现sftp文件传输
  • C语言和C++的常量概念与区别分析
  • HarmonyOS SDK下的实践与探索
  • 小U的相似字符串 | 模拟
  • 【MYSQL】分库分表