Linux下的动态内存管理
Posted
技术标签:
【中文标题】Linux下的动态内存管理【英文标题】:Dynamic memory managment under Linux 【发布时间】:2010-03-28 17:25:16 【问题描述】:我知道在windows下有global_alloc()之类的API函数,分配内存,返回句柄,然后可以锁定这个句柄,返回一个指针,然后再次解锁。解锁后,系统可以在空间不足时移动这块内存,优化内存使用。
我的问题是Linux下是否有类似的东西,如果没有,Linux如何优化其内存使用?
【问题讨论】:
【参考方案1】:这些 Windows 功能来自于所有程序在实模式下在相同地址空间中运行的时代。 Linux 和现代版本的 Windows 在单独的地址空间中运行程序,因此它们可以通过在 page tables 中重新映射特定虚拟地址解析到的物理地址来在 RAM 中移动它们。无需让程序员负担如此低级的细节。
即使在 Windows 上,也不再需要使用此类函数,除非与少量旧 API 交互。如果您对更详细的信息感兴趣,我相信 Raymond Chen 的博客和书籍对此主题进行了一些讨论。例如,这是关于 GlobalLock 历史系列的part 4。
【讨论】:
对。出于同样的原因,Mac Systems 5-8 也有类似的安排。谢天谢地,现在已经成为过去。【参考方案2】:不确定 Linux 等效项是什么,但在 ATT UNIX 中,核心操作系统的内存管理器中有“分散收集”内存管理功能。在虚拟内存操作环境中,没有绝对地址,因此应用程序没有等效功能。可执行对象加载器(将可执行文件加载到成为进程的内存中)使用来自内存管理器的内存寻址,该内存管理器在其页表(包含物理内存地址)中维护的虚拟内存块中保持跟踪。底线是您的应用程序的物理内存布局可能绝不是线性的或可直接访问的。
【讨论】:
以上是关于Linux下的动态内存管理的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )
Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )