gpt4 book ai didi

c - 用户空间程序如何在 free() 之后将内存传回给内核?

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:58 24 4
gpt4 key购买 nike

我已经阅读了很多关于 memory allocation on the heap 的内容以及某些堆管理分配器是如何做到的。

假设我有以下程序:

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

int main(int argc, char *argv[]) {
// allocate 4 gigabytes of RAM
void *much_mems = malloc(4294967296);
// sleep for 10 minutes
sleep(600);
// free teh ram
free(*much_mems);
// sleep some moar
sleep(600);

return 0;
}

假设我的编译器没有优化上面的任何东西,我实际上可以分配 4GiB 的 RAM,malloc() 调用返回一个实际的指针而不是 NULL,在我给定的平台上,size_t 可以容纳一个与 4294967296 一样大的整数,由 malloc 实现的分配器调用实际上确实在堆中分配了该数量的 RAM。假设上面的代码完全按照它看起来的样子去做。

在调用 free 执行后,内核如何知道这 4 GiB RAM 现在可以用于其他进程和内核本身?我不假设内核是 Linux,但那将是一个很好的例子。在调用 free 之前,此进程的堆大小至少为 4GiB,之后,它是否仍然具有该堆大小?

现代操作系统如何允许用户空间程序将内存返回给内核空间? free 实现是否对内核(或许多系统调用)执行系统调用以告诉它哪些内存区域现在​​可用?我的 4 GiB 分配有可能不连续吗?

最佳答案

Do free implementations execute a syscall to the kernel (or many syscalls) to tell it which areas of memory are now available?

是的。

malloc 在 Linux 上的现代实现将调用 mmap分配大量内存。内核将找到一个未使用的虚拟地址,将其标记为已分配并返回。 (如果没有足够的可用内存,内核也可能会返回错误)

free 然后会调用 munmap释放内存,传递分配的地址和大小。

在 Windows 上,malloc 将调用 VirtualAlloc free 将调用 VirtualFree .

关于c - 用户空间程序如何在 free() 之后将内存传回给内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36323389/

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