内存分配是系统调用吗?

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

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


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

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

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


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

内存分配是系统调用吗?

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

堆由不同的进程共享并由操作系统管理。 私人堆呢?

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

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


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

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

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

  • 看到这篇文章更多细节
  • 您也可以在此主题中找到更多信息
  • 链接地址: http://www.djcxy.com/p/80225.html

    上一篇: Is memory allocation a system call?

    下一篇: Confused about Pointers to Pointers and Dynamic Memory Allocation