内核线程表示内核负责调度的线程。这意味着,除其他外,内核能够同时在不同的cpu /内核上安排每个线程。
如何使用它们改变了很多的编程语言和线程API,但作为一个简单的例子,
void task_a();
void task_b();
int main() {
new_thread(task_a);
new_thread(task_b);
// possibly do something else in the main thread
// wait for the threads to complete their work
}
在我所熟悉的每一个实现,内核可在任何时间暂停。 (“先发制人”)
用户线程或“用户调度线程”使程序本身负责在它们之间进行切换。有很多方法可以做到这一点,相应地,它们有各种各样的名称。
一方面你有“绿色线索”;基本上和内核线程做同样的事情。因此,您可以通过真正的线程保留编程的所有复杂性。
在另一端,你有“光纤”,这是需要在任何其他光纤运行之前屈服。这意味着
- 纤维按顺序运行。没有平行的性能收益。
- 纤维之间的相互作用是非常明确的。其他代码只在您产生的确切点上运行。其他代码在您处理它们时不会改变变量。
- 大多数低级复杂程序员在多线程中苦苦挣扎,如缓存一致性(查看本网站上的MT问题,大多数人都没有这样做)并不是一个因素。
正如我能想到的纤维最简单的例子:
while(tasks_not_done) {
do_part_of_a();
do_part_of_b();
}
其中每个做了一些工作,那么当这部分完成返回。请注意,这些是在相同的“硬件线程”中顺序完成的,这意味着您不会从并行性中获得性能提升。另一方面,它们之间的相互作用是非常明确的,所以你没有竞争条件。每个功能的实际工作可能会有所不同。它们也可以是来自某个vector/array的“用户线程对象”。
标题'操作系统'并不真正符合你的要求。 – 2011-02-13 16:03:27