为什么我的程序的居民集大小(RSS)比可执行文件大?

梅拉杰·侯赛因

运行一个简单的程序,该程序简单地在while循环中等待,我很好奇知道该进程的内存状态。我正在运行的程序如下

#include<stdio.h>

int main()
{
    while(1)
    {
    }
return 0;
}

编译以上程序时,将生成一个7950字节(约2页)的可执行文件。但是/proc/pid/statm给rss大小为72页吗?有人可以在这里提供一些见解吗?

问候,梅拉杰

增白剂

程序运行时,内存中不仅需要驻留在可执行文件中的代码和数据段,还需要驻留更多的东西。例如,它可能还具有来自堆栈,堆,共享库和文件映射的常驻内存页面。

如果要查看驻留页面的使用方式,可以查看一下/proc/<pid>/smaps-特别是Rss:字段。

/proc/<pid>/maps(否)将使您对流程的映射更具可读性。请注意,例如堆栈(或在有多个线程的情况下为堆栈)和堆也算作映射。

这是一些示例输出cat /proc/self/maps(将输出cat流程本身的映射)。我在右侧添加了箭头(可能需要滚动)以解释一些不同的映射。知道之后,您可以签出cat /proc/<pid>/smaps查看每个映射的驻留大小。

00400000-0040c000 r-xp 00000000 08:01 3409248 / bin / cat <-文本(代码)段
0060b000-0060c000 r--p 0000b000 08:01 3409248 / bin / cat <-只读数据段(例如字符串文字)
0060c000-0060d000 rw-p 0000c000 08:01 3409248 / bin / cat <-读/写数据段
01d6a000-01d8b000 rw-p 00000000 00:00 0 [堆]
7f23d2b5c000-7f23d3328000 r--p 00000000 08:01 8126750 / usr / lib / locale / locale-archive <-内存映射文件(实际上是可执行文件和
                                                                                                共享库也是内存映射文件)
7f23d3328000-7f23d34e2000 r-xp 00000000 08:01 11155466 /lib/x86_64-linux-gnu/libc-2.19.so ^
7f23d34e2000-7f23d36e1000 --- p 001ba000 08:01 11155466 /lib/x86_64-linux-gnu/libc-2.19.so | 的各种映射
7f23d36e1000-7f23d36e5000 r--p 001b9000 08:01 11155466 /lib/x86_64-linux-gnu/libc-2.19.so | glibc
7f23d36e5000-7f23d36e7000 rw-p 001bd000 08:01 11155466 /lib/x86_64-linux-gnu/libc-2.19.so v
7f23d36e7000-7f23d36ec000 rw-p 00000000 00:00 0 <-匿名映射(MAP_ANONYMOUS)
...
7fffbc234000-7fffbc255000 rw-p 00000000 00:00 0 [堆栈]
7fffbc3a1000-7fffbc3a3000 r-xp 00000000 00:00 0 [vdso] ^
7fffbc3a3000-7fffbc3a5000 r--p 00000000 00:00 0 [vvar] | 内部的东西与一些
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] v系统调用已实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

`file`,为什么可执行文件没有报告为可执行文件?

为什么ld需要我的可执行文件依赖的库?

尝试减少Go程序的可执行文件大小

为什么Rust可执行文件如此庞大?

为什么Git Bash无法运行我的可执行文件?

为什么我找不到SonarQubeRunner 5.3的SonarQubeRunner可执行文件?

为什么SmartScreen筛选器会阻止我的所有可执行文件?

为什么汇编的可执行文件大小相同

为什么我不能将此Maven构建为可执行文件

从可执行文件获取程序集

XORing可执行文件时,为什么我的XOR程序不能在Windows上运行

为什么我的64位可执行文件比32位可执行文件大3倍?

在Windows上,为什么不能覆盖正在运行的应用程序的可执行文件?

为什么退出应用程序后,SYSTEM会继续锁定可执行文件句柄?

为什么程序会分解为较小的可执行文件

无法从mkbundle的可执行文件加载程序集

为什么我不能使用gcc生成“ Hello World”可执行文件?

为什么我有多个python可执行文件?

可执行文件包装程序,从PATH的末尾运行原始可执行文件

为什么我不能在Linux上执行Android x86可执行文件

为什么当我尝试运行可执行文件时,该可执行文件会说它不存在?

为什么D程序可执行文件几乎达到9+ MiB大?

为什么当我更改指向const的指针数组时可执行文件的大小会变小?

如果该文件是可执行文件,为什么我需要安装一些依赖项?

为什么我们不能删除正在运行的可执行文件

为什么运行“错误”的可执行文件?

什么叫我的可执行文件* .sh脚本?

为什么我的 shellcode 在从 C 执行时出现段错误,而不是作为独立的可执行文件?

为什么我需要不直接从我的可执行文件调用的 dll 的导入库?