【问题标题】:How Stack or memory is allocated for threads under the same process in LinuxLinux中同一进程下的线程如何分配栈或内存
【发布时间】:2015-04-16 15:13:02
【问题描述】:

对于正常的函数调用,会创建堆栈帧并将其存储在堆栈中。但是
如何为一个进程中的两个线程分配内存以及线程调用其他函数时如何处理堆栈帧。

【问题讨论】:

  • 不错的问题,但你可以通过谷歌搜索得到答案。
  • @pranit Kothari 我试过了,但没有得到满意的答案。就像我们创建一个线程一样,主线程和新线程如何共享相同的堆栈或者它们使用两个不同的堆栈..etc
  • 每个线程都有自己的栈。

标签: c linux memory process stack


【解决方案1】:

Linux 中当前的“线程”概念是NPTL。 NPTL 使用clone(),它包装了sys_clone()。为新的“线程”分配堆栈是在用户空间(即 libc)中处理的,而不是在内核(即 Linux)中。库可以使用选择分配(例如 malloc)分配堆栈,然后调用 clone() 将此地址作为堆栈传递(当然,需要传递分配区域的 top,因为堆栈在大多数平台上向下增长):

与 fork(2) 不同,clone() 允许子进程与调用进程共享其部分执行上下文,例如内存空间、文件描述符表和信号处理程序表。 ...

clone() 的主要用途是实现线程:一个程序中的多个控制线程在共享内存空间中并发运行。

当使用clone()创建子进程时,它会执行函数fn(arg) ...

child_stack 参数指定子进程使用的堆栈的位置...

如果您想了解更多具体细节,请打开您的发行版 pthread_create 实现的源代码并开始阅读。

例如pthread_create.c:

int
__pthread_create_2_1 (newthread, attr, start_routine, arg)
  ...
  struct pthread *pd = NULL;
  int err = ALLOCATE_STACK (iattr, &pd);
  ...

allocatestack.c:

 # define ALLOCATE_STACK(attr, pd) allocate_stack (attr, pd, &stackaddr)

 static int
 allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
    ALLOCATE_STACK_PARMS)
 ...

您会看到堆栈分配有一些花哨的东西,例如缓存和重用堆栈区域,guard pages,但最终只是在用户空间中分配的内存区域。

【讨论】:

  • 好的,无论如何都无法编辑这个答案,它的 NPTL 而不是 NTPL。
【解决方案2】:

正如有人评论的那样,每个线程都有自己的堆栈。当从该线程调用函数时,会在该堆栈中创建新的堆栈帧。

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多