【问题标题】:Threads have the same virtual memory space, but different stacks? Where are the stacks?线程具有相同的虚拟内存空间,但不同的堆栈?堆栈在哪里?
【发布时间】:2020-04-25 22:12:00
【问题描述】:

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

【问题讨论】:

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

标签: multithreading language-agnostic virtual-memory callstack memory-layout


【解决方案1】:

Almost every threading 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。

【讨论】:

    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2012-03-30
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2012-03-24
    • 2013-10-26
    相关资源
    最近更新 更多