堆叠和堆肥是什么?它们实际上位于计算机的内存中在哪里?它们在多大程度上被操作时间或语言控制?它们的范围是什么?它们的大小是什么?它们大小是什么?一个的大小是什么使一个更快?


当前回答

其他人直接回答了您的问题, 但是当试图理解堆叠和堆积时, 我认为考虑传统的 unix 进程( 没有线条和基于 mmap () 的缩放符) 的内存布局( 没有线条和 mmap () 的缩放符 ) 。 内存管理词汇表网页有一张内存布局图 。

堆叠和堆肥传统上位于进程虚拟地址空间的对面。 堆叠在存取时自动增长, 以内核设定的大小( 内核可以使用设置限制( rlimit_ stack,...) 调整) 。 当内存分配器引用 brk () 或 sbrk () 系统调用时, 堆叠会增长, 将更多页的物理内存映入进程的虚拟地址空间 。

在没有虚拟内存的系统中,例如一些嵌入系统,通常适用同样的基本布局,但堆叠和堆积大小固定。然而,在其他嵌入系统中(例如基于微芯片的微控制器),程序堆叠是一个单独的内存块,无法通过数据移动指示处理,只能通过程序流指示(调用、返回等)进行间接修改或阅读。

其他回答

它们(在真实的计算机记忆中)在哪里和什么?

回答:两者都是在山上。

暂不考虑 :

公牛就像一张书桌, hdds/sds(永久存储)就像一张书架。 要阅读任何东西, 您必须在桌子上打开一本书, 您只能在桌子上打开尽可能多的书。 要拿到一本书, 您可以从书架上拉出来, 并在桌子上打开。 返回一本书, 您关闭桌子上的书架, 然后把它还给书架 。

堆叠和堆肥是我们给两种方式的汇编者提供的名称,它们将不同种类的数据储存在同一地点(即用大号堆放)。

它们的范围是什么?它们各自的大小由什么决定?一个的大小由什么决定?一个的大小由什么决定?

答复:

堆栈是静态(固定大小) a. 编译器读取您代码中使用的变量类型。i. 它为这些变量分配了固定的内存量。 ii. 此内存的大小无法增长。 b. 内存是毗连的( 单块) , 因此存取有时比堆叠的更快。 放在堆叠上的一个物体在堆叠大小超过其大小的运行时会增加内存, 导致堆叠溢出错误, 堆积是动态( 变化大小) 数据 a. amoun 。

暂不考虑 :

堆叠和堆肥主要不是为了提高速度而引入的;它们被引入是为了处理内存溢出。 有关堆叠与堆积之间的第一个问题应该是:是否会出现内存溢出。 如果一个物体的大小打算增长到一个未知的数量(如链接的清单或其成员可以持有任意数量数据的对象),则将其放入堆肥。 尽可能使用 c++ 标准库(stl) 容器矢量、 地图和列表,因为它们是内存和列表。

在运行您的代码后, 如果您发现代码运行速度慢得令人无法接受, 然后回去重新构思您的代码, 并检查它是否能够更高效地编程。 它可能会发现问题与堆叠或堆积完全无关( 比如使用迭代算法而不是循环算法, 看看 i/ o / vs. cpu- imbound 任务, 也许添加多读或多处理 ) 。

因为程序的速度可能与堆叠或堆叠上分配的物品无关。

在多大程度上它们受国家或语言的运行时间控制?

答复:

堆叠大小由编译者在编译时确定。 堆积大小在运行时会变化。 (堆积在运行时与 os 一起工作,以分配内存 。)

暂不考虑 :

下面是控制和编译时间相对于运行时间操作的多一点。

每台计算机都有独特的指令集结构(isa),这是其硬件命令(例如“移动”、“跳”、“跳”、“添加”等)。

a os 只不过是一个资源管理者(控制如何/时间/和何处使用内存、处理器、装置和信息)。 os 的状态被称为光机,其余的命令被称为扩展机。 内核是扩展机的第一层。 它控制着诸如确定什么任务可以使用处理器(调度器)、多少内存或有多少硬件登记册可以分配给任务(调度器),以及任务的顺序。

堆栈是作为执行线条的抓抓空间预留的内存。当函数被调用时,在堆栈顶部为本地变量和一些簿记数据预留一个区块。当该函数返回时,块就会被未使用,下次调用函数时就可以使用。堆栈总是保留在利弗(最先出)顺序中;最近保留的区块总是下一个要解开的区块。这样就可以很容易地跟踪堆叠; fr 。

堆积是用于动态分配的内存。 与堆叠不同, 堆积区块的分配和分配没有强制模式; 您可以随时分配块块, 并随时释放它。 这使得跟踪堆积中哪些部分在任何特定时间分配或免费更为复杂; 许多定制的堆积分配器可用于调和不同使用模式的堆积性能 。

每一串线索都有堆叠, 而通常应用程序只有一堆(尽管对于不同种类的分配来说, 多堆堆并不罕见) 。

直接回答你的问题:

在多大程度上它们受国家或语言运行时间控制?

当线索创建时, os 分配每个系统级线索的堆叠。 通常, os 被语言运行时间调用来分配应用程序的堆叠 。

其范围是什么?

堆栈附在线条上,因此当线条退出时,堆栈被回收。堆积通常在运行时在应用程序启动时分配,在应用程序(技术处理)退出时再回收。

是什么决定了每个孩子的大小?

当创建线索时,会设定堆栈的大小。 程序启动时会设定堆积的大小, 但随着空间需要, 可能会增长( 分配器需要操作系统的更多内存 ) 。

是什么让一个更快?

堆叠速度更快, 因为访问模式使得从堆叠中分配和处理内存( 指针/ 内插器只是递增或衰减) 变得微不足道, 而堆叠在分配或交易位置上有复杂得多的簿记。 另外, 堆叠中的每个字节往往会非常频繁地被再利用, 这意味着它往往被映射到处理器的缓存处, 从而非常快。 堆积的另一个性能冲击是堆积, 主要是全球资源, 通常是 h 。

清晰的演示:图像来源: vikashazrati.wordpress.com

a couple of cents: 我认为, 绘制内存图形比较简单, 将会是件好事 :

箭头 - 显示生长堆叠和堆肥的位置, 进程堆叠大小有限制, 以 os 定义, 以线状线条参数为线状堆叠大小限制通常创建 api 。 通常以进程最大虚拟内存大小为限制, 例如32 位 2-4 gb 。

如此简单的方式:过程堆积对于过程和内部所有线条来说都是一般的, 用于记忆分配, 常见的情况是像 malloc () 。

堆栈是用于存储常见函数返回指针和变量的快速存储存储存储的快速内存, 被处理为函数调用中的参数, 本地函数变量 。

虚拟内存中的每个过程的堆叠、堆积和数据 :

当在加载代码和数据设置后创建进程时, 在数据结束和基于架构的地址空间顶端堆叠后, 启动一个进程, 然后在装入代码和数据设置后启动堆放

当需要更多堆积时, os 将会动态分配, 而堆积块总是几乎毗连

请见 brk ()、 sbrk () 和 ALloca () 系统在 Linux 中调用