gpt4 book ai didi

c - 为什么堆溢出 "allowed"会卡死系统?

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:52 25 4
gpt4 key购买 nike

此代码将一个数字作为命令行的输入并多次调用 heapOverflow() 函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void heapOverflow()
{
unsigned *some_array = malloc(50000);
}

int main(int argc, char *argv[])
{
unsigned num_calls = atoi(argv[1]);

while (num_calls > 0)
{
heapOverflow();
num_calls--;
}

return 0;
}

在 Linux Mint 17.1 上,以足够大的输入(例如在我的例子中为 10000000)运行它会使系统卡住几分钟,然后 bash 返回“Killed”,然后系统会再慢几分钟。

为什么OS会允许一个进程如此霸占内存?调度程序和内存管理器不应该一起工作来杀死一个进程,当它变得清楚它会请求太多堆内存时吗?或者是否存在将所有这些内存分配给一个进程可能有用的情况(即即使系统的其余部分或至少 X GUI 系统被卡住,该进程实际上是否可以做有用的工作?)

最佳答案

Why does the OS allow a process to take over memory to such a degree?

因为它被配置为这样做。

除其他功能外,Linux 内核还支持 POSIX.1-2008 中标准化的每进程资源限制。 ;参见例如prlimit用于命令行访问这些,和getrlimit()/setrlimit()用于 C 库接口(interface)。

在大多数 Linux 发行版中,这些限制由 limits.conf 中的可插入身份验证模块 pam_limits 设置。 .

问题是,这些限制是非常特定于任务的。它们因系统而异,甚至因用户而异:有些人不喜欢他们的系统开始分页(像 OP 描述的那样变慢)并且宁愿进程失败;其他人更愿意等待一段时间,因为他们实际上需要资源匮乏过程的结果。设置限制是系统管理员的责任。

我想可以很容易地编写一个程序来检查当前配置(特别是 /proc/meminfo),并为单用户台式机/笔记本电脑设置资源限制。但是,您也可以创建一个辅助脚本,比如 /usr/local/bin/run-limited,

#!/bin/sh
exec prlimit --as=1073741824 --rss=262144 "$@"

因此您可以在地址空间限制为 1 GB 且常驻集大小(实际使用的 RAM 量)为 256k 页的情况下运行任何程序。

关于c - 为什么堆溢出 "allowed"会卡死系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40963319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com