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

Threads have the same virtual memory space, but different stacks? Where are the stacks?

提问人:Edward Garemo 提问时间:1/8/2020 最后编辑:curiousguyEdward Garemo 更新时间:1/23/2020 访问量:375

问:

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

与多线程 语言无关的 虚拟 调用堆栈 内存布局

评论

0赞 Maxim Masiutin 1/9/2020
请编辑您的问题。它没有指定上下文,因此无法提供答案。例如,如果是这种情况,请添加“64 位 Microsoft Windows 进程”。
4赞 Dato 1/9/2020
作为一个通用的答案,新线程的堆栈几乎可以放置在进程地址空间中的任何位置,这将由提供线程实现的库/软件决定(最有可能与操作系统合作)。对于 Linux/pthreads,以下问题的答案包含更多详细信息:stackoverflow.com/questions/44858528

答:

0赞 Jin-oh Kang 1/23/2020 #1

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

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)

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