如何在Linux中的相同进程下为线程分配堆栈或内存

时间:2015-02-16 06:42:59

标签: c linux memory process stack

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

2 个答案:

答案 0 :(得分:5)

当前的线索' 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,但最后只是在用户空间中分配的内存区域。

答案 1 :(得分:1)

有人评论说每个帖子都有自己的堆栈。当从该线程调用函数时,在该堆栈中创建新的堆栈帧。