Linux进程虚拟内存和物理内存

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

先介绍几个基本概念:

SIZE : 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数.

RSS : "Resident Set Size", 实际驻留"在内存中"的内存数. 不包括已经交换出去的代码. 举一个例子: 如果你有一个程序使用了100K内存, 操作系统交换出40K内存, 那么RSS为60K. RSS还包括了与其它进程共享的内存区域. 这些区域通常用于libc库等.

SHARE : RSS中与其它进程共享的内存部分大小.

VMSIZE : 一个进程占用的总的地址空间大小. 它包括了没有映射到内存中的页面.

Private RSS : 映射到内存中的页面, 这些页面仅由进程单独使用. 这也是我们最关心地方: 进程实际占用的内存数.

如何来查看Private RSS呢? /proc接口中每一个进程目录下的smaps提供了private rss信息. smaps是在2.6.16内核版本引进来的.

私有驻留内存数(Private RSS):
查看/proc/$pid/smaps

下面我以本站使用的Linux AS5为例, 查看进程号1293(vmware-guestd, 本站使用的是一台基于vmware的客户虚拟机,)使用的Private RSS数.

CODE:
# cat /proc/ 1293 /smaps 
00111000 - 00112000  rwxp  00111000   00 : 00   0  
Size: 
4  kB
Rss: 
4  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
4  kB
0050e000-0050f000 rwxp 0050e000 
00 : 00   0  
Size: 
4  kB
Rss: 
0  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
0  kB
0051a000-0051b000 r-xp 0051a000 
00 : 00   0   [ vdso ]
Size: 
4  kB
Rss: 
4  kB
Shared_Clean: 
4  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
0  kB
0051b000-
00534000  r-xp  00000000  fd: 00   194898  /lib/ld- 2 . 4 . so
Size: 
100  kB
Rss: 
0  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
0  kB
00534000 - 00535000  r-xp  00018000  fd: 00   194898  /lib/ld- 2 . 4 . so
Size: 
4  kB
Rss: 
0  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
0  kB
00535000 - 00536000  rwxp  00019000  fd: 00   194898  /lib/ld- 2 . 4 . so
Size: 
4  kB
Rss: 
0  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
0  kB
00538000 - 00665000  r-xp  00000000  fd: 00   194905  /lib/libc- 2 . 4 . so
Size: 
1204  kB
Rss: 
212  kB
Shared_Clean: 
204  kB
Shared_Dirty: 
0  kB
Private_Clean: 
8  kB
Private_Dirty: 
0  kB
00665000 - 00667000  r-xp 0012d000 fd: 00   194905  /lib/libc- 2 . 4 . so
Size: 
8  kB
Rss: 
8  kB
Shared_Clean: 
4  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
4  kB
00667000 - 00668000  rwxp 0012f000 fd: 00   194905  /lib/libc- 2 . 4 . so
Size: 
4  kB
Rss: 
4  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
4  kB
00668000 -0066b000 rwxp  00668000   00 : 00   0  
Size: 
12  kB
Rss: 
8  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
8  kB
08047000 - 08062000  r-xp  00000000  fd: 00   292327  /usr/sbin/vmware-guestd
Size: 
108  kB
Rss: 
64  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
64  kB
Private_Dirty: 
0  kB
08062000 - 08063000  rwxp 0001a000 fd: 00   292327  /usr/sbin/vmware-guestd
Size: 
4  kB
Rss: 
4  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
4  kB
08063000 - 08068000  rwxp  08063000   00 : 00   0  
Size: 
20  kB
Rss: 
12  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
12  kB
08385000 - 08886000  rwxp  08385000   00 : 00   0   [ heap ]
Size: 
5124  kB
Rss: 
5080  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
5080  kB
bfeb2000-bfec7000 rwxp bfeb2000 
00 : 00   0   [ stack ]
Size: 
84  kB
Rss: 
12  kB
Shared_Clean: 
0  kB
Shared_Dirty: 
0  kB
Private_Clean: 
0  kB
Private_Dirty: 
12  kB

上面我们看到从smaps看不太方便, 推荐使用Ben Maurer写的perl脚本:

#!/usr/bin/perl

# Copyright Ben Maurer
# you can distribute this under the MIT/X11 License

use Linux::Smaps;

my $pid=shift @ARGV;
unless ($pid) {
print "./smem.pl <pid>/n";
exit 1;
}
my $map=Linux::Smaps->new($pid);
my @VMAs = $map->vmas;

format STDOUT =
VMSIZE: @######## kb
$map->size
RSS: @######## kb total
$map->rss
@######## kb shared
$map->shared_clean + $map->shared_dirty
@######## kb private clean
$map->private_clean
@######## kb private dirty
$map->private_dirty
.

write;

printPrivateMappings ();
printSharedMappings ();

sub sharedMappings () {
return grep { ($_->shared_clean + $_->shared_dirty) > 0 } @VMAs;
}

sub privateMappings () {
return grep { ($_->private_clean + $_->private_dirty) > 0 } @VMAs;
}

sub printPrivateMappings ()
{
$TYPE = "PRIVATE MAPPINGS";
$^ = 'SECTION_HEADER';
$~ = 'SECTION_ITEM';
$- = 0;
$= = 100000000;
foreach $vma (sort {-($a->private_dirty <=> $b->private_dirty)}
privateMappings ()) {
$size = $vma->size;
$dirty = $vma->private_dirty;
$clean = $vma->private_clean;
$file = $vma->file_name;
write;
}
}

sub printSharedMappings ()
{
$TYPE = "SHARED MAPPINGS";
$^ = 'SECTION_HEADER';
$~ = 'SECTION_ITEM';
$- = 0;
$= = 100000000;

foreach $vma (sort {-(($a->shared_clean + $a->shared_dirty)
<=>
($b->shared_clean + $b->shared_dirty))}
sharedMappings ()) {

$size = $vma->size;
$dirty = $vma->shared_dirty;
$clean = $vma->shared_clean;
$file = $vma->file_name;
write;


}
}

format SECTION_HEADER =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$TYPE
@>>>>>>>>>> @>>>>>>>>>> @>>>>>>>>> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
"vmsize" "rss clean" "rss dirty" "file"
.

format SECTION_ITEM =
@####### kb @####### kb @####### kb @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$size $clean $dirty $file
.

下面是由seme.pl脚本解析的smaps数据:

首先安装Linux::Smaps模块:
perl -MCPAN -e 'install Linux::Smaps'//需要网络,如无法上网,则可下载压缩包解压到 /root

然后用seme.pl解析1293进程的Smaps数据:

CODE:
# ./smem. pl   1293
VMSIZE: 
7200  kb
RSS: 
1052  kb total
192  kb shared
100  kb private clean
760  kb private dirty
PRIVATE MAPPINGS
vmsize rss clean rss dirty file
5636  kb  8  kb  724  kb  [ heap ]
84  kb  0  kb  12  kb  [ stack ]
4  kb  0  kb  4  kb
8  kb  0  kb  4  kb /lib/libc- 2 . 4 . so
4  kb  0  kb  4  kb /lib/libc- 2 . 4 . so
12  kb  4  kb  4  kb
4  kb  0  kb  4  kb /usr/sbin/vmware-guestd
20  kb  8  kb  4  kb
1204  kb  16  kb  0  kb /lib/libc- 2 . 4 . so
108  kb  64  kb  0  kb /usr/sbin/vmware-guestd

SHARED MAPPINGS
vmsize rss clean rss dirty file
1204  kb  188  kb  0  kb /lib/libc- 2 . 4 . so
4  kb  4  kb  0  kb  [ vdso ]

从上面看到rss大小被分成了两个部分: private(私有)和shared(共享).
private rss就是我们最关心的进程实际占用的内存数.


http://hi.baidu.com/youngtao/blog/item/70621d83c72933a50cf4d29a.html

物理内存和虚拟内存 1.概念 物理内存:真实的硬件设备(内存条) 虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。(为了满足物理内存的不足而提出的策略) 在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址,取决于CPU的地址线条数,32位平台的话 2^32也就是4G 。且每次开启一个进程都给4G的物理内存。很显然你内存小一点,这很快就分配完了,于... 阅读详情

相关推荐

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9838

linux new 空间大小,linux SWAP大小与内存的关系

Linux SWAP 交换分区大小与内存的关系SWAP (交换分区)【Windows 虚拟内存】我们机房中一台Linux服务器运行缓慢,系统服务出现间歇性停止响应,让我过去处理一下这一问题,登录到服务器之后,发现此服务器的物理内存是16G,而最初装机的时候,系统管理人员却只分配了4G的虚拟内存。查看内存的使用状况,物理内存并没有完全耗尽,但虚拟内存已经耗尽,整个系统CPU负载和磁盘IO都非常高。交...

weixin_36040777的博客 283

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 704

Linux内存测量(基础篇)

这是一篇关于Linux内存measuring的基础教程。除了free之外,我们可以通过/proc得到更多信息。它们是/proc下的maps,smaps 和statm。 以下文章出自: http://elinux.org/Runtime_Memory_Measurement 'free' and /proc 'free' 会显示机器上的内存使用信息。能实时跟踪整个系统内存的使用情

licanhua的专栏 1283

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

中职网络安全2021年国赛Wireshark流量分析题目解析

中职网络安全Wireshark流量分析题目解析

FRANXX_02的博客 6441

进程的哪些内存类型容易引起内存泄漏?

相信你在平时的工作中,应该遇到过下面这些场景:伴随着服务器中的后台任务持续地运行,系统中可用内存越来越少;应用程序正在运行时忽然被 OOM kill 掉了;进程看起来没有消耗多少内存,但是系统内存就是不够用了;……类似问题,很可能就是内存泄漏导致的。我们都知道,内存泄漏指的是内存被分配出去后一直没有被释放,导致这部分内存无法被再次使用,我们平时遇到的内存泄漏可能是应用程序的内存泄漏,也可能是内核(操作系统)的内存泄漏;

weixin_42136255的博客 833

保姆级教程:用达芬奇Configurator配置CAN总线(从DBC导入到Controller设置)

本文详细介绍了使用达芬奇Configurator工具从DBC文件导入到CAN总线控制器设置的全流程配置方法。通过环境准备、CAN控制器模式选择、硬件参数配置、通信参数优化及通信栈集成等关键步骤,帮助开发者高效完成AUTOSAR架构下的CAN总线开发,特别适合汽车电子领域的工程师参考。

weixin_30529023的博客 441

如何在 Linux 上使用 pmap 命令

找出一个 Linux 进程使用了​​多少 RAM 并不是一件简单的事情——尤其是在需要考虑共享内存的时候。值得庆幸的是,该pmap 命令可以帮助您理解这一切。 内存映射 在现代操作系统上,每个进程都存在于自己分配的内存区域或分配空间中。分配区域的边界不直接映射到物理硬件地址。操作系统为每个进程创建一个虚拟内存空间,并充当将虚拟内存映射到物理内存的抽象层。 内核为每个进程维护一个转换表,并由CPU访问。当内核更改在特定CPU 内核上运行的进程时,它会更新将进程和 CPU 内核联系在一起的转换表。 抽象的好处.

学海无涯苦作舟的博客 3343

【QT+PCL】串口读取单线激光雷达数据并在QVtkWidget组件中实时刷新(一)

(本文主要记录开发过程以及遇到的困难及解决方式)

2301_76329543的博客 3067

TPS563201DDCR电路翻车实录:从原理图到PCB,我踩过的5个坑及补救方法

本文详细记录了使用TPS563201DDCR电源芯片设计电路时遇到的5个常见问题及解决方案,包括EN引脚配置、BST电容选型、反馈网络设计、PCB布局优化以及散热处理。通过实际案例和数据分析,帮助工程师避免类似错误,提升电源模块的可靠性和效率。

weixin_42532938的博客 528

进程的虚拟内存,物理内存,共享内存

转自:https://blog.youkuaiyun.com/rebirthme/article/details/50402082想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表...

枯藤闲画云 1万+

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1391

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

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

weixin_29529047的博客 563

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux内核篇-内存管理(虚拟内存和物理内存、进程虚拟内存布局、内存映射)

找到的是原来堆顶所在的vm_area_struct的下一个vm_area_struct,看当前的堆顶和下一个vm_area_struct之间还能不能分配一个完整的页(其实也就是堆和内存映射区之间还有多少剩余空间)如果不能,没办法只好直接退出返回,内存空间都被占满了。另外,内核也有内核栈的空间,前面说了,当系统调用进入内核态就需要内核栈,内核栈的特色就是thread_info是为了存储体系结构相关的信息(task_struct通用的),以及还有一块内存存放用户态的CPU上下文信息用于恢复现场的。

weixin_53344209的博客 3147

WINCC7.3破解文件

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

linux下如何获取某一进程占用的物理内存和虚拟内存

首先,ps -A查看你所查看进程的进程号 ps -A 加入进程号为pid 那么使用如下脚本,可以打印该进程使用的虚拟内存和物理内存: root@Storage:/mnt/mtd# cat rss.sh#!/bin/shwhile truedocat /proc/pid/stat | awk -F" " '{print "virt:"$23}'c...

weixin_34390996的博客 377

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux进程物理内存虚拟内存,Linux进程虚拟内存和物理内存

文件:htop-0.8.1.tar.gz大小:405KB下载:文件:嵌入式linux性能分析.pdf大小:2056KB下载:文件:exmap-0.9.tar.gz大小:111KB下载:先介绍几个基本概念:SIZE: 进程使用的地址空间, 如果进程映射了100M的内存, 进程的地址空间将报告为100M内存. 事实上, 这个大小不是一个程序实际使用的内存数.RSS: "Resident Set Siz...

weixin_39992660的博客 210

Linux进程虚拟内存大 性能,Linux进程分析(一) 虚拟内存和物理内存

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?https://charon-cheung.github.io/物理内存面临的问题问题 1我们现在常用的电脑有32位和64位,这里以32位为例。32位的系统可用的地址空间有就是2的32次方,即4G,现在的电脑物理内存大多都在4G以上,可以前的电脑内存都达不到4G,我们的程序希望能用4个G,这也就是内存面临的第一个问题:物...

weixin_32462499的博客 598

Linux 虚拟内存和物理内存的理解

Linux 虚拟内存和物理内存理解

u012514113的专栏 335
上一篇: Memory: VSS/RSS/PSS/USS
下一篇: linux spi驱动分析
CodeJoker
博客等级 码龄18年 50粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值