关于“纤维”与1)线程的关系以及2)它们被内核看作是什么,我对它有点困惑。
根据我的理解,光纤是由线程创建的线程,由其创建线程(即可能是调度程序?)管理。但是,对于所有密集的目的,我认为它仍然是一个“线程”,并由内核看到。
我从一位同事那里得到的解释是,光纤对内核完全不可见,完全在用户空间中运行,并且绝不是“线程”,根据他的电子邮件:
线程有时在用户空间库中实现,因此被调用 用户线程。内核不知道它们,因此它们是受管理的 在用户空间中安排。一些实现基于其用户线程 在几个内核线程之上,受益于多处理器 机器(M:N型号)。在本文中,术语“线程”(没有 内核或用户限定符)默认为引用内核线程。 由虚拟机实现的用户线程也称为绿色 线程。用户线程通常可以快速创建和管理,但是 不能利用多线程或多处理,并且会 如果所有关联的内核线程都被阻止,则会被阻止 如果有一些用户线程已准备好运行。
光纤是一种更协调的调度单位 预定:运行光纤必须明确“屈服”以允许另一个 光纤运行,这使得它们的实现比内核更容易 或用户线程。光纤可以安排在任何线程中运行 同样的过程。这允许应用程序获得性能 通过自己管理调度来改进,而不是依靠 内核调度程序(可能没有针对应用程序进行调整)。 诸如OpenMP之类的并行编程环境通常实现 通过纤维完成任务。与纤维密切相关的是协同程序, 协同作用是一种语言级别 构造,而纤维是系统级构造。
我希望从光纤的确切含义上得到一些更好的解释(就os /内核而言,它是一个实际的线程,并且只是由它的创建线程管理?)。
我通过谷歌搜索对它进行了广泛的研究,但我在任何地方找到了一个简单的答案,包括:“光纤是由线程创建和管理的线程。”
如果任何人有更多信息,他们可以分享或指向我,我们将不胜感激。我的同事们认为,Golang的Goroutines使用“纤维”,而那些纤维对操作系统是不可见的 - 因此,纤维的“正确”实现。我个人认为Goroutines与协同程序关系更密切,并且根本没有实现光纤/线程场景......