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