堆和栈的记忆是如何mananged,实施分配[复制](How is heap and stack m

2019-07-31 04:41发布

可能的重复:
如何堆和栈的回忆mananged,实施分配的?
堆栈,静态和堆在C ++中

在C / C ++,我们可以存储变量,函数,成员函数,一个类的实例或者在堆叠或堆。

各是如何实现的? 它是如何管理(高电平)? 确实GCC预先分配用于堆栈和堆存储器的块,然后多尔斯列于请求? 是原装内存RAM中来吗?

可以函数在堆中,而不是堆分配?

             --Clarification--

我真的问的堆和栈内存的实施和管理。 阅读参考的问题后,我没有找到任何解决了......感谢您的链接

Answer 1:

我觉得你的问题可以很容易地至少写的书上的操作系统中的一些章节。 我建议你阅读的Tanenbaum:现代的操作系统。

堆和栈的主要区别,即一个是每个进程条,每线程项另一个。 当程序启动最初,它得到了一些最小堆和一些堆栈段。 堆生长,堆栈(对于每个线程)静态的。 如果你写不终止(无限递归),你会得到堆栈溢出的递归函数;)任何函数调用对堆栈段堆栈帧,当函数离开时,堆栈退绕的帧没有通过使用下一个功能。 堆栈是一个连续的线性结构。 在Linux上,你可以通过环境变量配置进程堆栈段的大小。 的窗口上(至​​少与MS的Visual C ++),则可以通过一个连接子与标志堆栈段的大小。 堆栈溢出,也可以在编译时一些大的阵列分配时产生:

char test[1000000];

堆是一个不同的故事。 当一个进程启动堆大小为一些默认值,并且可以变化形式操作系统OS或配置OS上使用(例如,在Windows上它是2MB默认据我记住它)。 此外,如果你需要更多的堆,分配变量等,它会增加更多的空间。 如果程序不释放堆内存用完它(或堆空间)。 有不同的数据结构的堆实现他们中的一些二叉树衍生品,一些不是如斐波那契堆(树阿甘)。 你可以阅读一些文章等如何编写一个内存分配器。 这些数据结构必须查找堆节点时所分配的组块需要被解除分配,或追加(找到一个空闲块)需要新的堆空间时被优化。

在32位操作系统每个进程具有的虚拟地址空间的4GB。 你可以想像不可能有那么多的RAM,其中有自己的虚拟地址空间配合4GBs所有进程。 操作系统内存中的页面,其中交换到HD不再需要或过期时举办。 这是寻呼来玩。 一切都被映射到网页:与堆栈或堆成长的过程。 由于它动态增长堆的结构,它可以被放置在多个网页上。 这就是为什么堆的访问是非常昂贵的,因为如果该页面不在内存中的页面发生故障和操作系统必须从磁盘加载一个页面(这可以通过幅度较慢)。 正在执行的线程的堆栈帧是在处理器的高速缓存,这是快得多为RAM。

不同的堆型是可能的,有可能是堆这对于其在多线程环境中非常有效的小物件或堆非常快。 描述Alexandrescu的“现代C ++设计”如何开发小对象分配器以及管理小物件堆。 这种实现是在他的洛基C ++库提供。 一些嵌入式系统提供物理上不同的存储区域,其中不同类型的堆可以实现ontop的。 要编写自己的分配器(堆管理器等),如果你想打一个编译器是一个艰苦的工作。

问候,
Ovanes



文章来源: How is heap and stack memories mananged, implemented, allocated [duplicate]