程序的运行时堆栈存储为虚拟内存的一部分,并且从系统Y的地址X开始(不考虑随机性)。创建具有自己独立堆栈的新线程时,它将存储在哪里? (线程共享其虚拟内存)
[Almosteverythreading libraries可以指定堆栈大小:
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。