内存分配是系统调用吗?

新手上路,请多包涵

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

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

原文由 Jim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 450
2 个回答

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

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

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

原文由 André Caron 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

内存分配是系统调用吗?

不一定每次都分配。如果进程的堆已经不足以满足请求的分配,则该进程需要调用内核,但 C 库通常会在这样做时请求更大的块,以减少系统调用的数量。

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

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

内核内存分配系统调用的昂贵程度完全取决于操作系统。由于这是很常见的事情,您可以期望它在正常情况下是有效的。在低 RAM 情况下,事情会变得复杂。

原文由 Mat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题