linux 进程的虚拟内存

Linux内核:进程管理——进程虚拟内存管理 在32位linux系统中,每一个进程拥有3GB的虚拟内存空间,所有进程共享1GB的内核空间。对每一个进程来讲,都有一个task_struct结构体,包含该进程的所有信息,其中就包括最为重要的mm_struct,它提供了进程在内存布局中的所有必要信息。1.当前运行代码的二进制代码text2.程序使用的动态库代码3.储存全局变量和动态产生数据的堆4.保存局部变量和实现函数/过程调用的栈5.保存环境变量和命令行参数的段6.将文件内容 映射到虚拟地址空间的内存映射0~3G的用户空间。 阅读详情

当我们创建一个进程时,我们知道进程有以下特点:


1. 每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构
2. 一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录
3. 每个进程已经分配的内存空间,都与对应的磁盘空间映射


那么问题来了:

计算机明明没有那么多内存(n个进程的话就需要n*4G)内存
建立一个进程,就要把磁盘上的程序文件拷贝到进程对应的内存中去,对于一个程序对应的多个进程这种情况,浪费内存!


所以,实际上:

1. 每个进程的4G内存空间只是虚拟内存空间,每次访问内存空间的某个地址,都需要把地址翻译为实际物理内存地址
2. 所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。

进程的虚拟内存地址与实际物理内存映射理解图如下:




3. 进程要知道哪些内存地址上的数据在物理内存上,哪些不在,还有在物理内存上的哪里,需要用页表来记录
4.页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)
5. 当进程访问某个虚拟地址,去看页表,如果发现对应的数据不在物理内存中,则缺页异常
6.缺页异常的处理过程,就是把进程需要的数据从磁盘上拷贝到物理内存中,如果内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需要将此页写回磁盘


页表工作原理及映射关系理解图如下:



可以认为虚拟空间都被映射到了磁盘空间中,并且由页表记录映射位置,当访问到某个地址的时候,通过页表中的有效位,可以得知此数据是否在内存中,如果不是,则通过缺页异常,将磁盘对应的数据拷贝到内存中,如果没有空闲内存,则选择牺牲页面,替换其他页面。


事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。


应用虚拟内存机制有很多优点:

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
2.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存
3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片




Linux进程分析(一) 虚拟内存和物理内存 物理内存面临的问题 问题 1 我们现在常用的电脑有32位和64位,这里以32位为例。32位的系统可用的地址空间有就是2的32次方,即4G,现在的电脑物理内存大多都在4G以上,可以前的电脑内存都达不到4G,我们的程序希望能用4个G,这也就是内存面临的第一个问题:物理内存小于系统位数的要求大小该怎么处理? 问题2 程序直接使用物理内存,会出现没有连续可用空间的情况,也是不能最大利用... 阅读详情

相关推荐

PostGIS 小白入门详细指南

PostGIS 是 PostgreSQL 的一个扩展,它将 PostgreSQL 转变为一个功能强大的空间数据库,使其能够存储、查询和分析地理空间数据。PostGIS 遵循开放地理空间联盟(OGC)的标准,支持各种空间数据类型和操作,如点、线、多边形、缓冲区、空间连接等。存储各种空间数据类型(如几何类型和地理类型)空间索引,提高查询性能丰富的空间函数和操作支持投影和坐标系统转换城市规划与管理环境监测与分析物流与运输优化地图制作与可视化位置服务与导航。

落魄书生的职业学习生涯 1万+

Linux进程内存管理之虚拟内存

引言 文章开始之前,我们先来思考以下两个问题: 问题1.:服务器物理内存只有1个G,我的程序malloc申请超过1个G的内存能否成功,进程能否正常运行? 问题2:物理内存的分配和释放是随机的,那么即使总的空余物理内存充足,连续空余的内存块不一定够大,那么程序malloc出来的连续内存是否受限? 不着急给出结论,先用示例代码跑一下,如下图所示,首先用free –m查看系统剩余内存。剩余的内存是121M。 编写简单代码,malloc 申请1GB的内存,成功则输出内存首地址,失败则输出内存不足。如下

千金散尽还复来 1050

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

底软驱动 | 一文搞定Linux虚拟内存

在概念上来讲,虚拟内存被组织为由存放在磁盘上的N个连续的字节大小的单元组成的数组。每个字节都有唯一的虚拟地址,作为到数组的索引(现在我们知道了虚拟内存虽然叫做内存,但其实它并不在内存中,而是磁盘中的一块空间)。虚拟内存与物理内存之间构成了一个缓存系统。虚拟内存位于较低层,物理内存位于较高层。虚拟内存上的数据可以被缓存到主存中。VM系统将虚拟内存分割为称为虚拟页(Virtual Page)的大小固定的块,每个虚拟页的大小为P=pow(2,p)字节。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1342

[模型部署]-[LLM]昇腾部署Qwen3-Coder-30B-A3B-Instruct

摘要:本文介绍了在Ascend NPU上部署Qwen3-Coder-30B-A3B-Instruct大模型的实践过程。通过vLLM-Ascend框架,详细说明了环境准备(CANN 8.1、PyTorch-NPU 2.5.1等)、模型下载、容器启动及服务部署步骤,包括vLLM服务的启动参数配置和接口测试方法。测试结果显示在当前2卡910B3配置下性能表现仅为8token/s(1并发),并指出流式调用时存在无法输出usage信息的问题。该方案为Ascend平台私有化部署大模型推理服务提供了参考实现。

1668

SRRC型号核准的模块豁免规则解析——如何利用完整型模块简化设备认证流程

本文详细解析了SRRC型号核准中模块豁免规则的应用,重点介绍了完整型模块的技术定义、豁免条件及实际应用场景。通过合理利用完整型模块,企业可显著简化设备认证流程,缩短上市周期并降低成本。文章还提供了模块选型指南和常见问题解决方案,帮助工程师高效应对SRRC认证挑战。

weixin_29306011的博客 933

Linux 配置与管理 SWAP(虚拟内存)

SWAP是Linux系统中的一种虚拟内存,用于扩展物理内存的容量。当系统内存不足时,SWAP会将部分磁盘空间用作虚拟内存,以支持更多的应用程序运行。在云服务器ECS环境中,SWAP的配置同样至关重要,它可以帮助我们提高系统的并发处理能力和稳定性。

q908544703的博客 9681

Ubuntu系统下STM32开发环境搭建:从零配置CubeMX、VSCode与OpenOCD调试实战

本文详细介绍了在Ubuntu系统下搭建STM32开发环境的完整流程,包括CubeMX、VSCode和OpenOCD的安装配置。通过实战教程指导开发者从基础环境准备到工程创建与调试,提供高效的嵌入式开发解决方案,并分享常见问题解决方法。

potato的博客 941

【操作系统】深入理解Linux虚拟内存

深入理解Linux虚拟内存

a20040518的博客 1201

读懂 ABAP CDS 注解的直接、继承与派生

本文系统梳理了ABAP CDS注解的评估逻辑,重点解析直接注解(Direct)、继承注解(Inherited)和派生注解(Derived)的差异及其在CL_DD_DDL_ANNOTATION_SERVICE中的处理方式。通过视图注解@Metadata.ignorePropagatedAnnotations可调控注解传播行为,避免下游语义影响上层视图。文章还提供了基于标准表的完整示例(包含底层视图、消费视图和ABAP报告程序),帮助开发者在实际系统中验证三层注解的叠加效果与阻断机制。关键点包括:派生注解的数据

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 244

GEE高阶应用——如何绘制2000-2022年土地利用变化轨迹时序图

土地利用变化是指在一定时间范围内,土地利用类型和结构发生的变化。时序变化是指这种变化随时间的推移而发生的序列变化。土地利用变化轨迹的时序变化具体介绍如下:首先,土地利用变化轨迹的时序变化体现在土地利用类型的演变上。在过去的几十年里,随着人口的增加、经济的发展和城市化的推进,土地利用类型发生了显著的变化。传统的农田逐渐减少,而城市、工业、交通、居住等用地的面积不断扩大。同时,随着环境保护意识的提高,生态保护用地、森林、湿地等绿色用地的面积也在增加。

此星光明博客 1113

Linux中虚拟内存详解

并且,在进程运行过程中,操作系统会根据进程的运行状态和内存需求,动态地调整虚拟地址空间与物理内存之间的映射关系,比如将暂时不使用的页面置换出来,或者将需要的页面重新映射到物理内存中。上面的图可以看出在常见的基于页式内存管理的操作系统(如 Linux)中,进程的各个内存区域包括栈区、代码区、数据区等,通常是按照固定大小(一般为 4KB,不过不同系统可能有差异,也可能采用其他如 8KB 等页大小)划分成一个个的页,然后通过页表来映射到物理内存中同样大小的一个个页框(也是 4KB 等)。

m0_73495584的博客 1623

撸毛笔记-朴朴超市 v1.01

朴朴超市 v1.01脚本地址:自动签到和组队赚朴分, 朴分可以抵扣50%的金额组队瓜分需要4人成团, 每个号每天只能开团和入队各一次每天跑一两次即可使用扫码或自己想办法捉refreshToken扫码获取token: (先微信进入朴朴超市小程序并登录注册过账号再扫码)把获取的refreshToken和备注(非必须)填到文件pupuCookie.txt里(第一次运行会自动创建), 多账号换行或&或@隔开。

xiaoshun007的专栏 1805

Linux进程虚拟内存空间的管理

在5.3的中,有和vm_flags定义的是页这一级别的访问控制权限,可以直接应用在底层页中,vm_flags则偏向于定义整个虚拟内存区域的访问权限和行为规范,描述的是整体信息。除了可读可写以外,VM_SHARD用于指定这块区域是否可以用于多进程共享,以达到多进程通讯。

xmu_cjs的博客 757

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux进程虚拟内存

到现在为止我们仍然在讨论Linux内存,最开始内存是一块荒漠,后来我们把Linux这架星际火箭着陆到这块荒漠,并开始对这块荒漠进行地址编排规划,这个规划粒度是细的,是以比特位为基础的划分,每个比特位都对应一个地址。有了这个基础的地址编排,我们开始做减法,我们已地址为基础进行分段分页,这块荒漠慢慢变得规整了。紧接着我们从功能区为出发点将这块规整过的荒漠划分,并创造了空间,节点,域的概念来描述这些功能区,并与内存页进行了映射,把页和区着两个维度联系在一起了。再后来我们组织了基建队(内存分配系统)来供给政府大楼(

Sherlock的博客 799

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Linux】进程概念 —— 虚拟内存地址空间

Linux进程地址空间,了解并且深入理解虚拟内存地址空间,重新理解fork函数以及父子进程的相关性质

Hello_World_213的博客 1976

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux进程地址空间与虚拟内存

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。   那虚拟内存空间是什么呢,它与实际物理内存空间又是怎样对应的呢,为什么有了虚拟内存技术,我们就能运行比实际物理内存大的应用程序,它是怎么做到的呢?   呵呵,这一切的一切都是个迷呀,下面我们就一步一步

Flyer 4538

Linux进程虚拟内存空间布局/ Linux 下虚拟内存的分布

首先摆上一个内存分布图:

vincent3678的博客 2481

linux进程物理内存虚拟内存,探讨Linux操作系统虚拟内存和物理内存的关系

为了高效、准确测试出该系统下,单个进程能够申请到的最大虚存空间,所以编写了一个Linux的测试程序。因为 64 位真的是个很可怕的数字,所以程序在申请内存空间时,先申请较大的内存块(100G),直到没有这么大的内存块,然后申请上次能申请到的内存块的一半。重复以上步骤,直到内存块变得足够小(小于 100Byte)。然后结束申请内存。代码如下:#include#define SZ_100G (50*2...

weixin_29529047的博客 563

【Linux基础】操作系统下的进程与虚拟内存的关系

这篇文章通过生动比喻和实例,系统性地解释了进程、操作系统内核和虚拟内存三个核心概念在Linux中的协同工作原理。 ✅ 核心逻辑:进程作为执行单元拥有独立的虚拟内存空间,内核通过系统调用、调度器和页表统一管理这些进程和物理资源,而虚拟内存利用页表映射、按需加载和写时复制等机制,为进程提供隔离、安全且看似无限的内存空间。 ✅ 关键比喻:进程是工人,虚拟内存是私人办公室,内核是总指挥,页表是地址簿,调度器是时间管理员,MMU是翻译官。

2301_80127108的博客 893

Linux进程地址空间和虚拟内存

https://blog.youkuaiyun.com/jnu_simba/article/details/8917076 一、虚拟内存 先来看一张图(来自《Linux内核完全剖析》),如下: 分段机制:即分成代码段,数据段,堆栈段。每个内存段都与一个特权级相关联,即0~3,0具有最高特权级(内核),3则是最低特权级(用户),每当程序试图访问(权限又分为可读、可写和可执行)一个段时,当前特权级CPL...

Likes的博客 1170

Linux vmstat --监控虚拟内存,进程,CPU

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat输出结果。

老莫小小朋友 1517

进程地址空间(Linux虚拟内存机制)

Linux进程地址空间

小青菜的博客 1110

Linux 进程虚拟内存的问题

Linux中用户进程线性地址能寻址的范围是0 - 3G,那么是不是需要提前先把这3G虚拟内存的页表都建立好呢?一般情况下,物理内存是远远小于3G的,加上同时有很多进程都在运行,根本无法给每个进程提前建立3G的线性地址页表。Linux利用CPU的一个机制解决了这个问题。进程创建后我们可以给页目录表的表项值都填0,CPU在查找页表时,如果表项的内容为0,则会引发一个缺页异常,进程暂停执行,Linux内

Be a bad guy!的专栏 750

【Linux学习笔记】11. Linux父子进程中变量地址相同——虚拟内存

Linux父子进程地址相同问题——虚拟内存 在进行进程控制编程的时候,使用fork()创建子进程时有这样的一个实例: int main() { int num = 0; pid_t pid = fork(); if( -1 == pid) { perror("fork"); exit(1);} else if( 0 == pid) num ++; //子进程动作 else num ++; //父进程动作 return 0; } 这段代码中,num变量在父子进

Ethan-Code's blog 1868

深入解析Linux进程地址空间与虚拟内存管理

本文深入探讨Linux进程地址空间与虚拟内存管理机制。首先介绍了32位系统下程序地址空间的布局,通过示例代码验证了不同变量的存储区域。重点分析了虚拟地址的本质——进程视角的线性地址,通过父子进程实验揭示了写时拷贝技术(COW)的工作原理及其在进程独立性中的关键作用。文章详细阐述了分页管理机制,包括页表结构、缺页中断处理流程以及虚拟内存管理的核心数据结构(mm_struct和vm_area_struct)。通过对比直接操作物理内存的弊端,论证了虚拟地址空间的三大优势:安全保护、解耦设计和延迟分配机制。

祯的博客 1220
上一篇: 实现简单的printf函数
下一篇: linux线程同步:互斥锁
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值