Linux中当前的"线程"概念是NPTL概念.NPTL使用clone(),包装sys_clone().为新的"线程"分配堆栈在用户空间(即libc)中处理,而不是在内核(即Linux)中处理.库可以使用选择分配(例如malloc)分配堆栈,然后调用clone()将此地址作为堆栈传递(当然,需要传递分配区域的顶部,因为堆栈在大多数平台上向下增长) :
与fork(2)不同,clone()允许子进程与调用进程共享其执行上下文的一部分,例如内存空间,文件描述符表和信号处理程序表....
clone()的主要用途是实现线程:程序中的多个控制线程,它们在共享内存空间中并发运行.
当使用clone()创建子进程时,它执行函数fn(arg)...
child_stack参数指定子进程使用的堆栈的位置...
如果您想了解更多具体细节,请打开发行版pthread_create实现的来源并阅读.
int
__pthread_create_2_1 (newthread, attr, start_routine, arg)
...
struct pthread *pd = NULL;
int err = ALLOCATE_STACK (iattr, &pd);
...
Run Code Online (Sandbox Code Playgroud)
# 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)
...
Run Code Online (Sandbox Code Playgroud)
你会看到堆栈分配有一些口哨和钟声,比如缓存和重用堆栈区域,保护页面,但最后只是在用户空间中分配的内存区域.