我知道线程共享代码/全局数据但具有不同的堆栈。每个线程都有自己的堆栈。我相信每个进程都有一个虚拟地址空间。这意味着每个线程都使用此单个虚拟地址空间。
我想知道如果虚拟地址空间中有多个线程,堆栈/堆是如何增长的?如果一个线程的堆栈空间已满,OS如何管理?
答案 0 :(得分:2)
在linux中,当guardsize超出stackoverflow时,堆栈大小由guardsize确定。
程序员负责处理stackoverflow。默认的guardsize值等于系统中定义的页面大小。
答案 1 :(得分:0)
实际上,操作系统的内存管理器为每个进程创建一个虚拟内存空间(进程具有不同的内存空间;线程在进程内共享相同的内存空间)。
在线程的内存空间中,每个线程都有自己的堆栈。但是,它们共享相同的堆,并且使用了巧妙的内存管理技术来优化堆栈的共享使用(请参阅Memory Allocation/Deallocation Bottleneck?作为起点)。
如果一个线程的堆栈空间已满,OS如何管理?
操作系统不管理堆栈。堆栈是由编译器创建的静态数据结构。堆栈中的内存分配和内存释放由编译器管理,它随时知道堆栈的大小。因此,它可以将存储空间的静态存储区域(即整个"堆栈")分成线程"子堆栈"。