【问题标题】:Program with smallest possible memory footprint (on Linux)内存占用最小的程序(在 Linux 上)
【发布时间】:2017-08-12 19:41:21
【问题描述】:

我正在寻找执行以下操作的程序:

  1. 无限期等待,也就是在使用./prog & 调用时不会自行退出
  2. 在运行时具有尽可能小的内存占用,例如通过pmap 工具、程序和[stack] 字段来衡量。

这个问题不是纯粹的学术问题,我正在研究memory scanner,我需要一个最小的例子来处理。

我能想到的最小的(在纯 C 中)是:

#include <unistd.h>

int main(int argc, char **argv)
{
    pause();
    return 0;
}

但我确信这可以与一些汇编/编译器/C 奥术魔法相形见绌,因为​​这个消耗了超过 180 KB 的程序+堆栈。

【问题讨论】:

  • 实际上,您需要链接器魔术,使用自定义链接器脚本尽可能缩小所有内存空间。
  • #include &lt;unistd.h&gt; int main(int argc, char **argv) { return pause(); }略微变小;-)
  • @wildplasser :我真的不认为源大小会影响运行时大小。
  • @PeterJ 使用while(1) 没有区别。如果我可以有一些可在谷歌上搜索的关键字,我会很高兴,因为寻找如何减少堆栈大小只返回 Windows 专用答案。
  • 我投票决定将此问题作为题外话结束,因为代码高尔夫问题在 Stack Overflow 上是题外话。

标签: c linux assembly x86-64


【解决方案1】:

试试这个程序:

#include <sys/syscall.h>

     .text
     .globl _start
     .type _start,@function
_start:
     mov $SYS_pause,%eax
     syscall # pause();
     ud2     # crash if pause() returns (should not happen)

保存在一个名为pause.S(大写S)的文件中,然后像这样组装和链接:

cc -c pause.S
ld -o pause pause.o

这显示为消耗了我机器上的一页内存。这一页可能是堆栈空间的一页,因为文本段是从二进制映射的,因此不消耗 RAM。

【讨论】:

  • 这肯定回答了我所说的问题,谢谢,但现在它对于我的实际目的来说太多了,因为我没有要扫描的区域。有没有一种简单的方法来分配一点?如果需要,我可以再问一个问题。
  • @12345ieee 你能下定决心吗?由于动态链接器使用的内存和 C 运行时的初始化,每个使用动态链接和 libc 的程序的内存使用量都将至少与您提供的一样多。静态链接可能会减少一点(但不多)。如果您编写的程序两者都没有,它将使用与您在程序中使用的内存一样多的内存,这对于我提供的程序来说几乎没有。制作一个比这个消耗更多内存但比 C 程序少得多的程序有点困难。
  • @12345ieee 是否可以接受每秒增加一个计数器(存储在 RAM 中)的程序?
  • Linux 在启动程序之前将各种东西放在堆栈上,例如参数列表(即使是空的),因此您至少使用了一页堆栈。
  • 您意识到(在常见架构上)cpu 执行代码必须在 RAM 中吗?它被“映射”的事实只是意味着操作系统会根据需要从磁盘中获取它,但随后它将在 RAM 中......至于这是否被视为使用内存,则是另一回事。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2013-05-14
相关资源
最近更新 更多