这句话是否正确:“Linux 中的所有线程都是 LWP,但并非所有 LWP 都是线程”。实际上,我试图理解Linux中的线程实现。pthread_create 调用 clone syscall,但在 man clone 中,我没有找到对 LWP 的任何引用。
那么,Linux 有 LWP 吗?
这句话是否正确:“Linux 中的所有线程都是 LWP,但并非所有 LWP 都是线程”。实际上,我试图理解Linux中的线程实现。pthread_create 调用 clone syscall,但在 man clone 中,我没有找到对 LWP 的任何引用。
那么,Linux 有 LWP 吗?
从这个博客你可以找到你的答案http://www.thegeekstuff.com/2013/11/linux-process-and-threads/
Linux 中的线程只不过是进程的执行流程。包含多个执行流的进程称为多线程进程。
对于非多线程进程,只有执行流是主执行流,因此也称为单线程进程。对于 Linux 内核,没有线程的概念。每个线程都被内核视为一个单独的进程,但这些进程与其他正常进程有些不同。我将在以下段落中解释差异。
线程通常与术语轻量级进程或 LWP 混合使用。原因可以追溯到 Linux 仅在用户级别支持线程的时代。这意味着即使是多线程应用程序也仅被内核视为单个进程。这给管理这些用户级线程的库带来了巨大挑战,因为它必须处理线程执行不会阻碍任何其他线程发出阻塞调用的情况。
后来实现发生了变化,进程被附加到每个线程,以便内核可以处理它们。但是,如前所述,Linux 内核并不将它们视为线程,每个线程都被视为内核内部的一个进程。这些过程被称为轻量级过程。
轻量级进程 (LWP) 和普通进程之间的主要区别在于 LWP 共享相同的地址空间和其他资源,如打开的文件等。由于某些资源是共享的,因此与其他普通进程相比,这些进程被认为是轻量级的进程,因此称为轻量级进程。
因此,实际上我们可以说线程和轻量级进程是相同的。只是线程是在用户级别使用的术语,而轻量级进程是在内核级别使用的术语。
从实现的角度来看,线程是使用 Linux 中符合 POSIX 的 pthread 库公开的函数创建的。在内部,clone() 函数用于创建普通和轻量级进程。这意味着要创建一个普通的进程 fork(),它会使用适当的参数进一步调用 clone(),而要创建一个线程或 LWP,pthread 库中的一个函数会使用相关标志调用 clone()。因此,主要区别是通过使用可以传递给 clone() 函数的不同标志生成的。
在各自的手册页上阅读有关 fork() 和 clone() 的更多信息。