RAM中的堆栈和堆位置

时间:2015-09-05 23:57:17

标签: memory-management

What happens in the middle? 这个图像和其他类似的图像一直困扰着我一段时间。当我使用malloc时,这应该是动态数据堆的一部分。然而,这似乎是从堆栈的上方限制的,这看起来非常无效。程序无法预测我计划分配多少内存,那么程序如何判断堆栈的放置时间?似乎中间的所有内存都被浪费了,我想知道这对于那些可能来自一个小服务程序的程序是如何工作的,这个程序不使用任何动态内存而不是可能分配巨大的视频游戏记忆部分。

比如说,我打开微软的油漆。如果我将高分辨率图片粘贴到其中,油漆的内存分配就会急剧增加。这个记忆取自哪里?我真正喜欢的是我上面标记的整个RAM棒的快照,以便可视化计算机的许多程序如何将计算机的内存整体划分,但我只能找到这样的图表,用于单个进程和单个部分RAM。

2 个答案:

答案 0 :(得分:7)

您的照片不属于RAM,而是address space中某些processvirtual memorykernelMMU配置为管理虚拟内存,提供流程的virtual address space,并执行一些paging,并管理page cache

顺便说一句,它不是增加堆栈的编译器(所以你的图片是错误的)。编译器正在生成机器代码,可以推送或弹出call stack上的内容。对于malloc allocated堆,C standard library实现包含malloc函数,高于operating system原语或system calls分配pages虚拟内存(例如mmap(2) Linux上的3}}。

在Linux上,进程可以使用mmap(2) - 以及munmapmprotect来更改其地址空间。当程序以execve(2)启动时,内核正在设置其初始地址空间。另请参阅/proc/(请参阅proc(5)并尝试cat /proc/$$/maps ....)

Windows有类似的功能,但我不知道Windows。

另请阅读Operating Systems: Three Easy Pieces

答案 1 :(得分:1)

在现代系统中,一种称为虚拟内存的技术用于为程序提供自己的内存空间。堆和堆栈位置位于虚拟内存中的特定位置。然后内核负责映射物理内存和虚拟内存之间的内存位置。您的程序可能在0x80000000处分配了一块内存,但该内存块可能存储在0x49BA5400位置。实际的RAM棒将是看似随机位置中所有这些部分的混乱。