为什么这个过程会以4GB的速度被杀?

Piy*_*sal 5 linux 64-bit process

我编写了一个程序,可以处理大量数据.我的CPU和操作系统(Ubuntu)都是64位,我有4GB的RAM.使用"top"(%Mem字段),我看到进程的内存消耗上升到大约87%,即3.4+ GB然后它被杀死了.

然后,我使用"uname -m"检查进程可以访问多少内存,这是"无限制".

现在,由于操作系统和CPU都是64位并且还存在交换分区,操作系统应该使用虚拟内存,即总共[> 3.4GB + yGB来自交换空间],并且只有当进程需要更多内存时才会使用它应该被杀了.

所以,我有以下问题:

  1. 理论上,64位m/c上的进程可以访问多少物理内存.我的回答是2 ^ 48字节.
  2. 如果存在少于2 ^ 48字节的物理内存,那么操作系统应该使用虚拟内存,对吗?
  3. 如果对于上述问题的回答是肯定的,那么操作系统也应该使用SWAP空间,为什么它甚至不使用它就会终止进程.我不认为我们必须使用一些特定的系统调用来编写我们的程序来实现这一点.

请建议.

Bas*_*tch 1

检查fileldd确认您的可执行文件确实是 64 位。

\n\n

另请检查资源限制。在进程内部,您可以使用getrlimit系统调用(并setrlimit在可能的情况下更改它们)。从bashshell 中尝试ulimit -a. 从zshshell 尝试一下limit

\n\n

还要检查您的进程是否确实消耗了您认为它确实消耗的内存。如果它的pid是1234你可以尝试一下pmap 1234。从进程内部,您可以读取/proc/self/maps/proc/1234/maps(您可以从终端读取)。您的...中还有/proc/self/smaps/proc/1234/smaps/proc/self/status/proc/1234/status以及其他文件/proc/self/

\n\n

检查 \xc2\xa0free是否获得了您认为的内存(和交换空间)。您可以添加一些临时交换空间swapon /tmp/someswapfile(并用于mkswap初始化它)。

\n\n

几个月(和几年)前,我通常能够cc1在 Gnu/Linux/Debian/Sid/AMD64 下、在具有 8Gb RAM 的机器上运行 7Gb 进程(一个巨大的编译)。

\n\n

您可以尝试使用一个小型测试程序,该程序分配malloc多个内存块,例如每个 32Mb。不要忘记在里面写入一些字节(至少在每兆字节)。

\n\n

标准 C++ 容器(如std::mapstd::vector据传)消耗的内存比我们通常想象的要多。

\n\n

如果需要,购买更多内存。这几天相当便宜。

\n