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 程序直接使用物理内存,会出现没有连续可用空间的情况,也是不能最大利用... 阅读详情

相关推荐

ESP32连接PDM麦克风操作指南:新手入门必看

手把手教你如何将ESP32与PDM麦克风连接,采集音频数据并用于音频分类应用。内容涵盖硬件接线、代码配置及实际调试技巧,适合初学者快速上手esp32在声音识别场景中的使用。

weixin_42590539的博客 1329

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

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

千金散尽还复来 1050

STM32中断实战:用ITR9606红外传感器DIY转速计数器(附完整代码)

本文详细介绍了如何使用STM32中断机制和ITR9606红外传感器DIY高精度转速计数器。从传感器选型、中断配置到抗干扰设计,提供完整的实战指南和优化代码,特别适合嵌入式开发者和硬件工程师快速实现工业级转速检测系统。

weixin_29159613的博客 288

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

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

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

手把手教你搭建基于Springboot+Vue的酒店管理系统

友友们,又是好久没更新了,马上元旦了,要迈入2025蛇年了,提前祝大家蛇年快乐,学有所成,本文博主将带领大家使用Springboot和Vue搭建一个酒店管理系统,受限于本文篇幅内容,本文罗列仅有部分简单示例内容,主要包括前后端示例源码。通过本文,你将大致掌握如何快速搭建一个现代化的Web应用。如果您想学习完整开发方案,包括项目源码+数据库文件+全套环境资源+代码部署视频教程+开发文档】获取学习资源,支持远程安装调试:一、项目背景随着互联网技术的不断发展,酒店行业对信息化的需求越来越高。

暴力码农的博客 1322

Pytorch的一小步,昇腾芯片的一大步

相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片!

机器学习-深度学习-图像处理-opencv-段子 5240

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

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

q908544703的博客 9681

别再乱选保护板了!手把手教你用ABLIC S-8254A为3/4串锂电池组DIY安全保护电路

本文详细介绍了如何使用ABLIC S-8254A保护集成电路为3/4串锂电池组DIY安全保护电路。从选型策略、电路搭建到功能验证,手把手教你实现可靠的充放电保护系统,适用于无人机、电动工具等场景,确保锂电池组的安全使用。

weixin_42525264的博客 187

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

深入理解Linux虚拟内存

a20040518的博客 1201

为什么idea已经改了UTF-8还是乱码,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1576

华为面试手撕真题【判断是ipv4还是ipv6地址】

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

MISAYAONE的博客 1万+

Linux中虚拟内存详解

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

m0_73495584的博客 1623

​​​​手把手教你玩转RT-Thread操作系统专栏--​​​​第5章 设备驱动开发:RT-Thread的设备框架​​​​5.4 I2C/SPI驱动:如何驱动外部传感器(以MPU6050为例)​

通过本节学习,掌握了基于RT-Thread设备模型的I2C/SPI驱动开发流程,包括硬件初始化、寄存器读写、设备注册及应用程序调用。I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)是嵌入式系统中最常用的两种串行总线协议,广泛用于连接传感器、存储器等外设。函数通过I2C协议读取外设寄存器的数据(如MPU6050的加速度寄存器)。SPI读取需先拉低片选(CS),发送寄存器地址,再读取数据,最后拉高CS。查找I2C设备,并调用。

xiaoheshang_123的博客 123

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

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

xmu_cjs的博客 757

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux进程虚拟内存

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

Sherlock的博客 799

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

Hello_World_213的博客 1976

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、付费专栏及课程。

余额充值