【问题标题】:How memory management happens for process threads in one virtual address space?一个虚拟地址空间中的进程线程如何进行内存管理?
【发布时间】:2016-07-24 18:22:11
【问题描述】:

我知道线程共享代码/全局数据但有不同的堆栈。每个线程都有自己的堆栈。我相信每个进程都有一个虚拟地址空间。这意味着每个线程都使用这个单一的虚拟地址空间。

我想知道在虚拟地址空间中有多个线程的情况下堆栈/堆如何增长?如果一个线程的堆栈空间已满,操作系统如何管理?

【问题讨论】:

  • 在 Windows 上,每个线程为堆栈获取一块地址空间,默认为 1MB。如果线程溢出这个空间,应用程序就会崩溃。
  • 请注意,通常涉及 3 方:操作系统、C 运行时和您自己的代码。操作系统通常不关心您的程序是用 C 编写的,并且 C 运行时通过 malloc/free 管理您的堆,或者 C++ 程序使用 new/delete

标签: c linux windows operating-system


【解决方案1】:

在 linux 中,堆栈大小由 guardsize 确定,如果超过了守卫大小,则会发生堆栈溢出。

处理 stackoverflow 是程序员的责任。默认的guardsize 值等于系统中定义的页面大小。

【讨论】:

    【解决方案2】:

    确实,操作系统的内存管理器会为每个进程创建一个虚拟内存空间(进程具有不同的内存空间;线程在一个进程内共享相同的内存空间)。

    在线程的内存空间中,每个线程都有自己的栈。但是,它们共享相同的堆,并且使用巧妙的内存管理技术来优化堆栈的共享使用(请参阅Memory Allocation/Deallocation Bottleneck? 作为起点)。

    如果一个线程的堆栈空间已满,操作系统如何管理?

    操作系统不管理堆栈。堆栈是编译器创建的静态数据结构。堆栈的内存分配和内存释放由编译器管理,它随时知道堆栈的大小。因此,它可以将内存空间的静态内存区域(即整个“堆栈”)拆分为线程“子堆栈”。

    【讨论】:

    • 至少在 Windows 上,操作系统管理堆栈。它需要编译器的一些帮助,但它完成了大部分繁重的工作。
    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多