首页 > 解决方案 > linux内核如何分离同一线程组中多个线程的用户空间堆栈?

问题描述

据我了解,一个新的轻量级进程(线程)是通过clone()使用CLONE_VM标志集调用创建的,这意味着mm_struct,因此列表vm_area_struct都是跨线程共享的,甚至页表也是共享的,但是内核如何跟踪每个单独线程的用户堆栈?

对于没有 的正常clone()情况CLONE_VM,页表将被复制,以便在子进程或父进程修改任何共享页面(包括堆栈区域)时启动写入时复制。本质上,COW 只是新进程应该/将拥有完全独立的内存空间这一事实之上的一个技巧,它只是在可能的情况下与其父进程共享页面,原因是多种与效率相关的原因。显然,何时CLONE_VM设置此机制不再适用。

我能想到的唯一方法是基本上每个线程的堆栈空间都有多个vm_area_structmm_struct尽管所有线程都可以“看到”彼此的堆栈,但它们只使用自己的堆栈。但即使这是真的:

  1. 克隆后哪个函数负责分配新的堆栈空间?一些环绕的库函数可以clone()做到这一点吗?
  2. mm_structstart_stack字段要在多个线程中选择一个,如果默认不变,会指向线程组长的栈吗?

不知道我上面的理解是否正确,感谢帮助。

标签: cmultithreadingmemory-managementprocesslinux-kernel

解决方案


推荐阅读