内存分配是系统调用吗?
内存分配是系统调用吗? 例如,malloc和new。 堆由不同的进程共享并由操作系统管理。 私人堆呢? 如果堆中的内存分配由操作系统管理,那么这有多昂贵?
我还想有一些链接到我可以阅读更多关于这个主题的地方。
一般来说, malloc
和new
在每次调用时都不会执行系统调用。 但是,他们使用较低级别的机制来分配大页面的内存。 在Windows上,下层机制是VirtualAlloc()
。 我相信POSIX系统,这有点等同于mmap()
。 这两者都会执行系统调用,以便在操作系统级别为进程分配内存。 随后的分配将使用这些大页面的较小部分,而不会引起系统调用。
堆通常是内部进程,不在进程之间共享。 如果你需要这个,大多数操作系统都有一个用于分配共享内存的API。 Boost.Interprocess库中提供了这些API的可移植包装器。
如果你想了解更多关于内存分配和与操作系统的关系,你应该看看一本关于操作系统的好书。 我总是建议Andrew S. Tanenbaum的现代操作系统,因为它非常易于阅读。
(假设操作系统具有内存保护功能,例如在嵌入式设备中可能不是这种情况。)
内存分配是系统调用吗?
不一定每个分配。 如果它的堆不足以满足所请求的分配,那么进程需要调用内核,但是C库通常会在请求时分配更大的块,目的是减少系统调用的数量。
堆由不同的进程共享并由操作系统管理。 私人堆呢?
堆不在进程之间共享。 它在线程之间共享。
内核内存分配系统调用的代价是多少取决于操作系统。 由于这是一件非常常见的事情,所以在正常情况下,您可以期待它的效率。 在低RAM情况下事情变得复杂。
请参阅Win32中的分层内存管理。
内存分配总是一个系统调用,但分配是以页面形式进行的。 如果提交页面中有可用空间,则内存管理器将分配所请求的空间而不更改内核模式。 关于HeapAlloc的最好的事情是,它可以精确控制Virtual Alloc为单个页面分配的分配情况。 这可能会导致内存使用率过高。
基本上默认堆和私有堆的处理方式是相同的,除了在链接时指定默认堆大小。 默认堆大小为1 MB,并根据需要增长。
上一篇: Is memory allocation a system call?
下一篇: Confused about Pointers to Pointers and Dynamic Memory Allocation