从malloc()进行的Windows和Linux本机OS/系统调用是什么
What are the Windows and Linux native OS/system calls made from malloc()?
我最近看到了以下帖子:
内存分配器的级别不低于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之前,它确实有一组GlobalAlloc
和LocalAlloc
函数-但我认为现在人们不使用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系统上,使用sbrk
和mmap
系统调用。有关详细信息,请参见man 2 sbrk
和man 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堆函数,如HeapCreate
、HeapDestroy
、HeapAlloc
、HeapFree
。这些函数将调用位于NTDLL.dll中的NTDLL用户模式堆管理器,这些函数将具有RtlxxxHeap
名称、RtlAllocateHeap
、RtlCreateHeap
等
最终,将调用NtxxxVirtualMemory
组内的系统调用,NtAllocateVirtualMemory
、NtQueryVirtualMemory
、NtFreeVirtualMemory
。
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- VC++本机单元测试,找不到调试符号
- 在这种情况下,java对象是否可以调用本机函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 无法将标准库导入本机 android 项目中的头文件
- 使用本机 C++ 应用程序中的 C# 代码
- 在nodejs中使用本机代码的最佳方法是什么?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- MS 本机单元测试 - 断言::线程失败不起作用
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- C++/CLI 混合托管/本机 DLL 不起作用
- 子系统中的异常处理:本机
- 如何在 Linux 上调试本机代码时自动附加到多个子进程
- 如何使本机Unix/Linux守护进程在Android上工作
- 从malloc()进行的Windows和Linux本机OS/系统调用是什么