内存分配是系统调用吗?

内存分配是系统调用吗? 例如,malloc和new。 堆是由不同进程共享的,并由操作系统pipe理。 什么私人堆? 如果堆中的内存分配由操作系统pipe理,那么这是多么昂贵?

我也想有一些链接到我可以阅读更多关于这个主题的地方。

一般来说, mallocnew在每次调用时都不会执行系统调用。 但是,他们使用较低级别的机制来分配大页面的内存。 在Windows上,较低的机制是VirtualAlloc() 。 我相信POSIX系统,这有点相当于mmap() 。 这两个都执行系统调用来分配内存到操作系统级的进程。 随后的分配将使用这些大页面的较小部分,而不会引起系统调用。

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

如果你想了解更多有关内存分配和与操作系统的关系,你应该看看一本关于操作系统的好书。 我总是推荐Andrew S. Tanenbaum的“ 现代操作系统” ,因为它很容易阅读。

(假设操作系统具有内存保护,例如在embedded式设备中可能不是这种情况)。

内存分配是系统调用吗?

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

堆是由不同进程共享的,并由操作系统pipe理。 什么私人堆?

堆不在进程之间共享。 它是在线程之间共享的。

内核内存分配系统调用的代价是多less,完全取决于操作系统。 由于这是一件非常普遍的事情,所以在正常情况下,你可以期待它的效率。 事情变得复杂,在低RAM情况下。

请参阅Win32中的分层内存pipe理。

在这里输入图像说明

内存分配总是一个系统调用,但分配是作为页面。 如果提交页面中有可用空间,则内存pipe理器将分配所请求的空间而不更改内核模式。 关于HeapAlloc的最好的事情是,它可以精确地控制Virtual Alloc为单个页面分配的分配。 这可能会导致内存过度使用。

基本上,默认堆和私有堆的处理方式是相同的,除了在链接时指定默认堆大小。 默认堆大小是1 MB,并根据需要增长。

  • 看到这篇文章的更多细节
  • 您也可以在此主题中find更多信息

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

一般情况下,内存pipe理根本不涉及操作系统,因为内存是主要的系统资源之一,并且由于操作系统内核的全局内存pipe理而无法实现。 但是由于系统调用相对昂贵,人们试图devise语言和内存分配库来减less系统调用的数量。

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

 add memory page at virtual address X release memory page from virtual address X 

本地内存pipe理系统在确定内存池中没有足够的内存,并且确定堆内存池内存太多时,请求这些内存pipe理系统。 尽pipe内存分配的devise通常是以最小化系统调用的方式来devise的,但是在堆栈上的内存分配方面,它仍然保持更高的成本。 这是因为堆的内存调用\解除分配algorithm比堆栈的复杂和昂贵得多。