C linux内核如何分离同一线程组中多个线程的用户空间堆栈?
据我所知,一个新的轻量级进程(线程)是通过使用C linux内核如何分离同一线程组中多个线程的用户空间堆栈?,c,multithreading,memory-management,process,linux-kernel,C,Multithreading,Memory Management,Process,Linux Kernel,据我所知,一个新的轻量级进程(线程)是通过使用clone\u VM标志集调用clone()创建的,这意味着mm\u struct,因此VM\u area\u struct的列表都是跨线程共享的,甚至页面表也是共享的,但内核如何跟踪每个线程的用户堆栈呢 对于没有clone\u VM的正常clone(),将复制页表,以便在子进程或父进程修改任何共享页(包括堆栈区域)时,即写即复制开始。从本质上讲,COW只是一个技巧,新进程应该/将拥有一个完全独立的内存空间,出于多种与效率相关的原因,它可能只与其父进
clone\u VM
标志集调用clone()
创建的,这意味着mm\u struct
,因此VM\u area\u struct
的列表都是跨线程共享的,甚至页面表也是共享的,但内核如何跟踪每个线程的用户堆栈呢
对于没有clone\u VM
的正常clone()
,将复制页表,以便在子进程或父进程修改任何共享页(包括堆栈区域)时,即写即复制开始。从本质上讲,COW只是一个技巧,新进程应该/将拥有一个完全独立的内存空间,出于多种与效率相关的原因,它可能只与其父进程共享页面。显然,当设置了CLONE\u VM
时,该机制不再适用
我能想到的唯一方法是,在mm\u struct
中有多个vm\u area\u struct
,它们基本上是每个线程的堆栈空间,尽管所有线程都可以“看到”彼此的堆栈,但它们只使用自己的堆栈。但即使这是真的:
clone()
的库函数会这样做吗mm_struct
的start_stack
字段必须从多个线程中选择一个,如果默认情况下该字段保持不变,它将指向线程组领导的堆栈不确定我的上述理解是否正确,敬请帮助。1。
clone(2)
libc包装器接受一个fn
函数和一个child\u堆栈
参数,并在child中切换到它。调用它的人必须分配堆栈。实际的clone()
syscall具有完全不同的签名--请查看clone(2)
手册页的末尾。使用pthread\u create()
时,线程库负责为堆栈分配和管理内存。2.确切地您只需创建两个休眠线程并查看它们的/proc/PID/task/TID/{stat,maps}
,就可以看到这一点。请注意,堆栈的内存是在克隆之前分配的,而不是克隆之后分配的。谢谢。代码确实存在于pthread层。clone(2)
libc包装器接受一个fn
函数和一个child\u堆栈
参数,并在child中切换到它。调用它的人必须分配堆栈。实际的clone()
syscall具有完全不同的签名--请查看clone(2)
手册页的末尾。使用pthread\u create()
时,线程库负责为堆栈分配和管理内存。2.确切地您只需创建两个休眠线程并查看它们的/proc/PID/task/TID/{stat,maps}
,就可以看到这一点。请注意,堆栈的内存是在克隆之前分配的,而不是克隆之后分配的。谢谢。代码确实存在于pthread层。