Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux内核如何分离同一线程组中多个线程的用户空间堆栈?_C_Multithreading_Memory Management_Process_Linux Kernel - Fatal编程技术网

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层。