线程具有相同的虚拟内存空间,但堆栈不同?堆栈在哪里?



程序的运行时堆栈存储为虚拟内存的一部分,并从系统 Y 上的地址 X 开始(不考虑随机化(。当创建一个具有自己独立堆栈的新线程时,它存储在哪里?(线程共享其虚拟内存(

几乎每个线程库都允许您指定堆栈大小:

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES   lpThreadAttributes,
SIZE_T                  dwStackSize,
LPTHREAD_START_ROUTINE  lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD                   dwCreationFlags,
LPDWORD                 lpThreadId
);
uintptr_t _beginthread( // NATIVE CODE
void( __cdecl *start_address )( void * ),
unsigned stack_size,
void *arglist
);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

在线程启动之前,操作系统会为新线程分配内存(就像malloc一样(。一些系统还提供间隙("保护页"(,以便堆栈不会相互碰撞。它们的存储位置取决于平台,但通常后续线程的堆栈可能会在与主线程不同的区域中分配。对于 Linux,这由 C 库处理,并使用普通mmap来分配它们 AFAIK。

最新更新