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 通过对每个用户程序的虚拟地址空间设置恰当的权限,确保一个用户的程序不能随意访问另一个用户程序的内存区域,同时也防止程序对系统关键内存区域(如内核空间)进行非法访问,保障了系统的稳定性和安全性。、

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt、C++实现五子棋人机对战与本地双人对战(高难度AI,极少代码)

介绍 本项目基于 Qt C 实现了一个完整的五子棋游戏,支持 人机对战 和 人人对战 模式,并提供了三种难度选择(简单、中等、困难)。界面美观,逻辑清晰,是一个综合性很强的 Qt 小项目 标题项目核心功能 棋盘…

Vue非单文件组件

目录 Vue非单文件组件 几个注意点 组件的嵌套 关于VueComponent 重要的内置关系 Vue非单文件组件 Vue中使用组件的三大步骤: 一、定义组件(创建组件) 二、注册组件 三、使用组件(写组件标签) 一、…

关于C++地址交换的实现

关于地址的交换实现&#xff0c;我们要使用指针引用的方式进行&#xff0c;例如&#xff1a; #include <iostream>// 定义函数交换两个整型指针的地址 void swapIntPtrAddresses(int* &ptr1, int* &ptr2) {int *temp ptr1;ptr1 ptr2;ptr2 temp; }int main() …

Windows 软件之 FFmpeg

文章目录 前言1 FFmpeg 视频处理1.1 编解码1.2 其它视频编辑命令1.3 视频抽帧 2 FFmpeg 音频处理3 FFmpeg 图片处理3.1 编解码3.2 拼接图片3.3 图片合成视频 附录1&#xff1a;mediainfo.ps1 前言 FFmpeg 是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的…

Android okhttp 网络链接各阶段监控

步骤 1: 添加依赖 在项目的 build.gradle 文件中&#xff0c;添加 OkHttp 依赖&#xff1a; implementation com.squareup.okhttp3:okhttp:4.11.0 步骤 2: 创建自定义的 EventListener 创建一个自定义的 EventListener 类&#xff1a; import android.util.Log import okht…

【Java】字节码文件

字节码文件组成部分 1、基本信息 1.1 Magic 魔数 文件是无法通过文件扩展名来确定文件类型的&#xff0c;文件扩展名可以随意修改&#xff0c;不影响文件的内容。软件使用文件的头几个字节&#xff08;文件头&#xff09;去校验文件的类型&#xff0c;如果软件不支持该种类型就…

Easyexcel(3-文件导出)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09; 响应头设置 通过设置文件导出的响应头&#xff0c;可以自定义文件导出的名字信息等 //编码格式为UTF-8 response.setC…

【机器学习】朴素贝叶斯算法

目录 什么是朴素贝叶斯算法&#xff1f; 算法引入 贝叶斯定理 朴素贝叶斯分类器 工作原理 优缺点 应用场景 实现示例 基本步骤&#xff1a; 在机器学习的世界里&#xff0c;朴素贝叶斯算法以其简单性和高效性而著称。尽管它的名字听起来有点复杂&#xff0c;但实际上…

机器翻译基础与模型 之二: 基于CNN的模型

一、CNN网络 相比于全连接网络&#xff0c;卷积神经网络最大的特点在于具有局部连接&#xff08;Locally Connected&#xff09;和权值共享&#xff08;Weight Sharing&#xff09;的特性。 1.1 卷积核与卷积操作 1.2 步长与填充 1.3 池化 以上关于CNN的基础概念和技术就不…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发&#xff0c;可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握&#xff0c;如果快速上手数据库开发&#xff0c;可以先按照本文介绍的方式使用JdbcTemplat…

C总结测评

测评代码&#xff1a;month_11/test_19/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 第一题&#xff1a;该程序输出的是多少&#xff1f; #include <stdio.h> int main() {unsigned char i 7;//0~255int j 0;for (; i > 0; i - 3){j;}printf("%d\n",…

神经网络中常用的激活函数(公式 + 函数图像)

激活函数是人工神经网络中的一个关键组件&#xff0c;负责引入非线性&#xff0c;从而使神经网络能够学习和表示复杂的非线性关系。没有激活函数&#xff0c;神经网络中的所有计算都是线性变换&#xff0c;而线性模型的表达能力有限&#xff0c;无法处理复杂的任务。 激活函数…

在CentOS中,通过nginx访问php

其实是nginx反向代理到php-fpm&#xff0c;就像nginx反向代理到tomcat。 1、安装PHP-FPM 1.1 安装 yum install php yum install php-fpm php-common 这里只安装了php-fpm&#xff0c;根据需要安装php模块&#xff0c;比如需要访问mysql则添加安装 php-mysqlnd。 1.2 启动…

前端—Cursor编辑器

在当今快速发展的软件开发领域&#xff0c;效率和质量是衡量一个工具是否优秀的两个关键指标。今天&#xff0c;我要向大家推荐一款革命性的代码编辑器——Cursor&#xff0c;它集成了强大的AI功能&#xff0c;旨在提高开发者的编程效率。以下是Cursor编辑器的详细介绍和推荐理…

windows远程桌面打开rdp显卡调用

前情提要 服务器在公网环境&#xff0c;带宽只有30M。 远程桌面多开图形业务调试&#xff0c;设置RDP服务端使用GPU。 压缩传输带宽避免造成卡顿。 如果是内网&#xff0c;也可以用&#xff0c;还可以提供一个注册表键值&#xff0c;修改后提高fps帧率&#xff08;公网不推…

使用C++和QT开发应用程序入门以及开发实例分享

目录 1、搭建开发环境(VS2010和QT4.8.2) 2、创建一个QT窗口 3、在QT窗口中添加子窗口 4、QT界面布局 5、QT信号(SIGNAL)和槽(SLOT) 6、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/…

Spark SQL大数据分析快速上手-完全分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 完全分布模式也叫集群模式。将Spark目…

php:使用socket函数创建WebSocket服务

一、前言 闲来无事&#xff0c;最近捣鼓了下websocket&#xff0c;但是不希望安装第三方类库&#xff0c;所以打算用socket基础函数创建个服务。 二、构建websocket服务端 <?phpclass SocketService {// 默认的监听地址和端口private $address 0.0.0.0;private $port 8…

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…

(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器

目录 1.业务逻辑实现 1.1 登录校验技术——会话 1.1.1Cookie 1.1.2session 1.1.3JWT令牌技术 2.参数配置化 3.yml格式配置文件 4.过滤器Filter 5.拦截器Interceptor 1.业务逻辑实现 Day10-02. 案例-部门管理-查询_哔哩哔哩_bilibili //Controller层/*** 新增部门*/Pos…