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