Memory management RAM中的堆栈和堆位置

Memory management RAM中的堆栈和堆位置,memory-management,Memory Management,这张照片和其他类似的照片已经困扰了我一段时间了。当我使用malloc时,这应该是动态数据堆的一部分。但是,这似乎是由堆栈从上方限定的,这似乎非常无效。一个程序无法预测我计划分配多少内存,那么该程序如何判断堆栈的放置距离?似乎中间的所有内存都被浪费了,我想知道它是如何工作的,这些程序可能来自一个小的服务程序,它不使用任何动态存储器,它可以潜在地分配大量的内存。 比如说,我打开了Microsoft paint。如果我将一张高分辨率的图片粘贴到其中,画图的内存分配就会急剧增加。这段记忆是从哪里来的?我

这张照片和其他类似的照片已经困扰了我一段时间了。当我使用
malloc
时,这应该是动态数据堆的一部分。但是,这似乎是由堆栈从上方限定的,这似乎非常无效。一个程序无法预测我计划分配多少内存,那么该程序如何判断堆栈的放置距离?似乎中间的所有内存都被浪费了,我想知道它是如何工作的,这些程序可能来自一个小的服务程序,它不使用任何动态存储器,它可以潜在地分配大量的内存。
比如说,我打开了Microsoft paint。如果我将一张高分辨率的图片粘贴到其中,画图的内存分配就会急剧增加。这段记忆是从哪里来的?我真正想要的是我的整个内存条的快照,上面有标签,以可视化一台计算机的许多程序是如何将计算机的内存作为一个整体进行分区的,但我只能找到这样一个用于单个进程和RAM的单个部分的图。

您的图片不是RAM,而是一些内存的图片。配置以管理虚拟内存、提供进程的名称、执行某些操作以及管理

顺便说一句,不是编译器使堆栈增长(因此您的图片是错误的)。编译器正在生成机器代码,这些代码可能会在计算机上推送或弹出内容。对于堆,实现包含
malloc
函数,这些函数位于原语或虚拟内存分配之上(例如在Linux上)

在上,进程可以请求使用-和
munmap
mprotect
更改其地址空间。当程序启动时,内核正在设置其初始地址空间。另请参见
/proc/
(请参见并尝试
cat/proc/$$/maps
…)。顺便说一句,mmap通常用于实现和-运行时加载,两者都在项目中大量使用(这是一个针对Linux的自由软件人工智能项目)

由于大多数Linux系统都是这样,我建议您通过下载然后查看or的源代码深入了解实现细节:上面的
mmap
dlopen
以及其他

Windows也有类似的功能,但我不知道Windows。请参阅系统的文档

如果你用C语言编写代码,还可以阅读一些好书,比如和一些网站。请务必阅读C编译器的文档(例如)。另见网站


请注意,现代C编译器允许进行广泛的编译。阅读另请参阅报告。

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

有多远?一路走来。将其放在内存的顶部以最大化可用内存(或者更确切地说,是地址空间)——这是许多操作系统所做的。谢谢,在阅读了这些文章之后,我的许多问题都得到了解决,我计划进一步研究虚拟内存空间。事实上,这个图让我对物理地址空间的划分感觉好多了。至于编译器,我相信制作这个图的人指的是编译器创建了管理堆栈的代码,而不是编译器在运行时做了任何事情。从这个角度来看,程序员管理堆的想法也是不正确的,因为程序员并不主动控制堆,而是由可执行指令控制堆(底部的蓝色)"... 对于
malloc
-分配的堆,C标准库实现包含
malloc
函数,位于操作系统原语或分配虚拟内存页的系统调用之上…。堆栈如何?当计算机程序从调用堆栈中推送或弹出堆栈帧时(例如,从子程序调用或返回),程序的编译代码是否引用(分页)虚拟内存地址?如果是这样,我会想象这些页面已经提前分配了,或者情况并非总是如此?@Josh程序以相对方式引用堆栈。例如,它说这个局部变量存储在堆栈指针+2的当前值中。它从来没有说这个局部变量应该存储在virtu的0x00000111中记忆。