从malloc()进行的Windows和Linux本机OS/系统调用是什么

What are the Windows and Linux native OS/system calls made from malloc()?

本文关键字:本机 Linux OS 是什么 系统调用 Windows malloc      更新时间:2023-10-16

我最近看到了以下帖子:

内存分配器的级别不低于malloc。(默认值分配器通常直接或间接调用malloc)

分配器只允许您指定不同的分配战略。例如,您可以使用一个分配器来调用malloc一次用于检索大的内存池,然后用于后续分配请求,它只返回这个池的一小部分。

或者,您可以将其用作挂钩,以便执行一些附加操作任务。

至于你的第二个问题,malloc是你可以不用的最低的失去可移植性malloc通常使用操作系统特定的内存分配功能,因此级别较低还但这与你的主要问题无关,因为C++分配器是一个更高级的抽象。

来自:C++:内存分配器

我的问题是,malloc是如何在以下操作系统中实现的?

  • 适用于Windows
  • 适用于Linux

malloc()的操作系统特定函数是什么?

在Windows中,在最新版本的MSVC中,malloc(和C++new,因为它是使用与new的实际内存分配部分相同的基本原理实现的)调用HeapAlloc()。在其他版本中,如g++mingw,C运行时是一个较旧的版本,它不会直接调用HeapAlloc,但在它的基础上,它仍然会调用HeapAlloc-要找到不同的东西,我们需要回到Windows 95之前,它确实有一组GlobalAllocLocalAlloc函数-但我认为现在人们不使用16位编译器-至少不用于Windows编程。

在Linux中,如果您使用glibc,它取决于分配的大小,它是调用sbrk还是mmap-mmap(标志中有MAP_ANONYMOUS)用于更大的分配(超过阈值,我认为在典型实现中是2MB)

我的问题是,malloc是如何在以下操作系统中实现的?

在Linux上有两个著名的malloc实现:

dlmalloc(Doug Lea的malloc)

ptmalloc

在像glibc这样的Linux libc上,eglibc或newlib实现ptmalloc或ptmalloc的变体。

malloc()的操作系统特定函数是什么?

在Unix和Linux系统上,使用sbrkmmap系统调用。有关详细信息,请参见man 2 sbrkman 2 mmap

好吧,我不确定Linux,但当谈到windows时。。。

内存可以分为两类。

1) 堆(处理堆、自定义创建堆)请参阅->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366711(v=vs.85).aspx使用诸如HeapAlloc&HeapFree。当您想在默认进程堆中进行分配时,LocalAlloc和LocalFree可以用作HeapAlloc的"快捷方式"。

2) 虚拟内存(通常仅针对特定进程,因为出于安全考虑,全局虚拟内存中存在访问限制),使用VirtualAlloc、VirtualFree。请参阅->http://msdn.microsoft.com/en-us/library/windows/desktop/aa366916(v=vs.85).aspx

据我所知,malloc将在windows上使用堆分配函数。

我希望这能有所帮助。

malloc()和朋友被认为是编译器附带的运行时系统的一部分。因此,每个编译器都可以而且确实使用不同的操作系统调用来实现malloc。

正如其他人所说,在Linux上,选项是sbrk()和mmap()。

在Windows上,选项为HeapAlloc()和VirtualAlloc(。

在Windows上,malloc实现通常会调用win32堆函数,如HeapCreateHeapDestroyHeapAllocHeapFree。这些函数将调用位于NTDLL.dll中的NTDLL用户模式堆管理器,这些函数将具有RtlxxxHeap名称、RtlAllocateHeapRtlCreateHeap

最终,将调用NtxxxVirtualMemory组内的系统调用,NtAllocateVirtualMemoryNtQueryVirtualMemoryNtFreeVirtualMemory