好吧,如果这感觉像是对旧问题的重复,我很抱歉,我已经在 tanenbaum 的现代操作系统书 Stack Overflow 上回答了几个问题,并且仍然需要清除我对此的疑问。
首先,我将不胜感激任何我应该更详细地阅读以更好地理解这种结构的书籍/资源。我不明白这些是操作系统书籍、编程语言或架构书籍中通常解释的概念。
在我提出问题之前,我将根据有关堆栈/堆的读数列出我的发现
堆
- 仅包含所有实例变量、动态分配(new/malloc)和全局变量
- 不再使用数据结构堆,使用更复杂的结构
- 通过内存位置访问,负责在其上分配的内存的单个进程
- 碎片整理和内存分配由操作系统完成(如果是或否,请回答我关于谁管理堆、操作系统或运行时环境的问题)
- 在进程中可以访问其引用的所有线程之间共享
堆
- 仅包含所有局部变量。(在函数调用时推送)
- 使用实际的堆栈数据结构进行操作
- 由于连续性,访问速度更快
现在,对于我的一些关于相同的问题。
- 全局变量,它们在哪里分配?(我认为它们是在堆上分配的,如果是这样,它们何时被分配,在运行时或编译时,还有一个问题,是否可以清除该内存(如使用删除)?)
- 堆的结构是什么?堆是如何组织的(它是由操作系统管理还是由运行时环境管理(由 C/C++ 编译器设置))。
- 堆栈是否只保存方法及其局部变量?
- 每个应用程序(进程)都有一个单独的堆,但是如果超过堆分配,那么是否意味着操作系统无法分配更多内存?(我假设内存不足会导致操作系统重新分配以避免碎片)
- 进程中的所有线程都可以访问堆(我相信这是真的)。如果是,所有线程都可以访问实例变量、动态分配的变量、全局变量(如果它们有引用)
- 不同的进程,不能互相访问堆(即使传递了地址)
- 堆栈溢出崩溃
- 仅当前线程
- 当前进程
- 所有进程
- 在 C/C++ 中,是否在运行时为函数内的块变量在堆栈上分配内存(例如,如果代码的子块(例如 For 循环)创建了一个新变量,则该变量是在运行时分配的堆栈(或堆)还是预先分配的?)它们何时被删除(块级范围,如何维护)。我对此的看法是,所有对堆栈的添加都是在运行时在块开始之前进行的,每当到达该块的末尾时,所有添加到该点的元素都会被推送。
- CPU 对堆栈寄存器的支持仅限于堆栈指针,该堆栈指针可以通过对内存的正常访问来递增(弹出)和递减(推送)。(这是真的?)
- 最后,OS/Runtime 环境生成的堆栈和堆结构是否都存在于主内存中(作为抽象?)
我知道这很多,而且我似乎一直很困惑,如果你能指出我正确的方向来解决这些问题,我将不胜感激!