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

问题描述 投票:1回答:1

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

multithreading language-agnostic virtual-memory callstack memory-layout
1个回答
0
投票

[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。

© www.soinside.com 2019 - 2024. All rights reserved.