内核线程和用户线程有什么区别?

时间:2011-02-13 16:00:58

标签: multithreading operating-system kernel

内核线程和用户线程有什么区别?是内核线程是在内核模式下调度和执行的吗?用于创建内核线程的技术是什么?

用户线程是否已在用户模式下调度,执行?是内核不参与执行/调度用户线程吗?在执行用户线程时发生中断然后谁处理它?

每当创建线程时,就会为每个线程创建一个TCB。现在是用户级线程的情况 这个TCB是在用户的地址空间中创建的吗?

如果在处理上下文切换的两个用户级线程之间切换?

有一个多线程模型的概念:

  1. 多对一
  2. 一对一
  3. 多对多。
  4. 这些型号是什么?这些模型实际上是如何使用的?

    已经阅读了很多关于这个主题的文章,但仍然感到困惑 想要清除这个概念..

    提前致谢, 塔齐姆

4 个答案:

答案 0 :(得分:6)

答案 1 :(得分:5)

  

内核线程和用户线程之间有什么区别?

内核线程具有特权,可以访问禁止用户模式线程的内容。在维基百科上查看“Ring (Computer Security)”。在Windows上,用户模式对应于Ring 3,而内核模式对应于Ring 0。

  

用于创建内核线程的技术是什么?

这在很大程度上取决于操作系统。

  

现在在用户级线程的情况下是否在用户的地址空间中创建了这个TCB?

TCB记录有关内核在运行该线程时使用的线程的信息,对吧?因此,如果它是在用户空间中分配的,则用户模式线程可能会修改或损坏它,这似乎不是一个好主意。那么,你不觉得它是在内核空间中创建的吗?

  

这些型号是什么?这些模型实际上是如何使用的?

Wikipedia似乎非常清楚。

答案 2 :(得分:1)

内核线程是指内核负责调度的线程。这意味着内核能够同时在不同的cpus / core上调度每个线程。

如何使用它们与编程语言和线程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();
}

每个人都做了一些工作,然后在完成该部分时返回。请注意,这些是在相同的“硬件线程”中按顺序完成的,这意味着您不会从并行性中获得性能提升。另一方面,它们之间的相互作用非常明确,因此您没有竞争条件。每个功能的实际工作情况可能有所不同。它们也可以是某些矢量/数组的“用户线程对象”。

答案 3 :(得分:0)

本质上,用户线程在具有适当权限级别的用户的上下文中运行,例如用户线程肯定无法访问内核级内存/数据结构/例程等。而内核线程在OS内核的上下文中运行,从而赋予它们执行可访问低级内核例程/内存/的代码的权限数据结构。