内存分配是系统调用吗?

Jim*_*Jim 50 c c++ heap operating-system

内存分配是系统调用吗?例如,mallocnew.堆是由不同进程共享并由操作系统管理的.私有堆怎么样?如果堆中的内存分配由操作系统管理,这有多贵?

我还希望有一些链接到我可以阅读更多关于这个主题的地方.

And*_*ron 50

通常,malloc并且new在每次调用时都不执行系统调用.但是,它们使用较低级别的机制来分配大页面的内存.在Windows上,较低的机制是VirtualAlloc().我相信POSIX系统,这有点相当于mmap().这两个都执行系统调用以在OS级别为进程分配内存.后续分配将使用那些大页面的较小部分,而不会发生系统调用.

堆通常是内部进程,并且不在进程之间共享.如果需要,大多数操作系统都有一个用于分配共享内存的API .Boost.Interprocess库中提供了这些API的可移植包装器.

如果您想了解有关内存分配和与操作系统关系的更多信息,您应该查看一本关于操作系统的好书.我总是建议安德鲁S. Tanenbaum的现代操作系统,因为它很容易阅读.

  • 在Linux系统上,`brk(2)`和`sbrk(2)`与`mmap(2)`一起使用.我还要提到Knuth的AOCP Vol.我也是内存分配的绝佳参考. (11认同)
  • @Suma:"系统调用"未定义为"在kernel32中定义".系统调用(更正确地)被定义为调用`syscall`或`sysenter`指令的东西.这些指令在`ntdll.dll`中,而不是`kernel32.dll`.它们位于函数内部,其名称以"Nt"和"Zw"开头,而不是"Rtl".事实上,`HeapAlloc`调用`RtlAllocateHeap`,它*不一定执行任何系统调用. (5认同)
  • 这取决于运行时.使用Visual Studio 2010发布库malloc并直接免费调用HapAlloc/HeapFree,每次分配都有一个系统调用.然后,Heap函数使用VirtualAlloc. (4认同)
  • @Suma:HeapAlloc不是系统调用,也不一定执行任何系统调用. (3认同)

Mat*_*Mat 24

(假设一个具有内存保护的操作系统.例如在嵌入式设备中可能不是这种情况.)

内存分配是系统调用吗?

不一定每个分配.如果内核的堆不足以满足所请求的分配,则该进程需要调用内核,但C库通常会在执行此操作时请求更大的块,目的是减少系统调用的数量.

堆是由不同进程共享并由操作系统管理的.私有堆怎么样?

堆不在进程之间共享.它虽然在线程之间共享.

内核内存分配系统调用的成本完全取决于操作系统.由于这是一个非常普遍的事情,你可以期望它在正常情况下是有效的.在低RAM情况下,事情变得复杂.


sar*_*rat 19

请参阅Win32中的分层内存管理.

在此输入图像描述

内存分配始终是系统调用,但分配是作为页面进行的.如果提交的页面中有可用空间,则内存管理器将分配所请求的空间而不更改内核模式.关于HeapAlloc的最好的事情是,它提供了对Virtual Alloc为单个页面分配的分配的精细控制.这可能会导致内存使用过多.

基本上,默认堆和私有堆被视为相同,除了在链接时指定默认堆大小.默认堆大小为1 MB,并根据需要增长.

  • `"内存分配总是系统调用"`这意味着每次调用`malloc()`都会导致系统调用(转换到内核模式),这是100%不正确的. (4认同)

Zar*_*trA 6

内存分配函数和语言语句如 malloc/free 和 new/delete 不是系统调用。Malloc\free 是 C\C++ 库的一部分,new\delete 是 C++ 运行时系统的一部分。两者的调用偶尔会导致系统调用。在其他语言中,内存分配以类似的方式实现。

一般来说,内存管理根本就不能不涉及操作系统来实现,因为内存是主要的系统资源之一,并且由于操作系统内核进行了全局内存管理。但是由于系统调用的成本相对较高,人们试图以最小化系统调用量的方式设计语言和内存分配库。

据我所知,堆是一个进程内实体。这意味着所有内存分配/释放请求完全由进程本身管理。操作系统只知道堆的位置和大小,并为来自进程内内存管理系统的两种类型的请求提供服务:

add memory page at virtual address X
release memory page from virtual address X
Run Code Online (Sandbox Code Playgroud)

本地内存管理系统在确定堆内存池中没有足够的内存以及当它确定堆内存池中有太多内存时,会请求这些服务。尽管内存分配通常以最小化系统调用量的方式设计,但它仍然保持比堆栈上内存分配更昂贵的顺序。这是因为堆的内存分配/释放算法比堆栈更复杂和昂贵。