gpt4 book ai didi

c - 内存分配如何在极端情况下工作?

转载 作者:太空狗 更新时间:2023-10-29 11:27:27 24 4
gpt4 key购买 nike

我很困惑内存分配(malloc/calloc)在 linux/c 中是如何工作的。假设,我有一台 16GB RAM 的机器,我以 root 身份运行一个程序。它是 64 位机器,因此所有 16GB 都可以作为一个段进行寻址。我可以通过单个 malloc 调用分配所有这些(当然少了操作系统的数量)吗?有很多 malloc 调用?

它与“堆内存”和“虚拟内存”有什么关系?如果我分配一个小内存块,它恰好在堆内存中,然后我调整(扩大)这个 block 的大小,当我接近堆栈区域时会发生什么?

如果我想(几乎)所有 RAM 都分配给我的单个进程,我是否必须摆弄 setrlimit RLIMIT_AS,即使它以 root 身份运行?

最佳答案

在虚拟内存操作系统(例如 Linux)上,malloc() 不分配内存。它分配地址空间 例如,编译并运行以下片段,并(在另一个终端中)运行top:

#include <stdlib.h>
#include <unistd.h>

int main(void) {
char *cp;
cp = malloc( 16ULL * 1024 *1024 *1024);
if (cp) pause();
return 0;
}

在我的电脑上,TOP 显示:

PID    USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
29026 plasser 20 0 16.0g 324 248 S 0 0.0 0:00.00 a.out

这意味着:a.out 具有 16GB 虚拟大小,并且仅使用 324(字节?KB?)常驻内存(可能只是二进制文件)

发生了什么事?

  • malloc() 调用要求操作系统扩展地址空间,增加 16 GB
  • 操作系统已完成此请求,并为其设置分页表等。
  • 这些页表还没有附加物理内存,可能除了表本身
  • 一旦程序开始引用此地址空间,页面将被附加(操作系统将错误地插入)
  • (这些页面可能是从/dev/zero COW 生成的,但这只是一个细节)
  • 但是,在程序确实引用地址的那一刻,内存必须由操作系统分配并附加到进程。 (它会出现在 RES 字段中,相信我)
  • 在某些时刻,附加内存也可能会被分离,一旦操作系统认为它已经很长时间没有被使用。它将被添加到空闲内存池或/和用于其他目的。在这种情况下,其内容可能会被推送到后备存储(磁盘)

`

关于c - 内存分配如何在极端情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323100/

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