2011-02-13 97 views
8

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

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

每当创建线程时都为每个线程创建一个TCB。现在遇到用户级线程 这个TCB是在用户的地址空间创建的吗?

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

还有多线程模型的概念:

  1. 多对一
  2. 一对一
  3. 多对多。

这些模型是什么?这些模型如何被实际使用?

读了有关这个话题的几篇文章,但仍是一头雾水
想清除的概念..提前

感谢, Tazim

+0

标题'操作系统'并不真正符合你的要求。 – 2011-02-13 16:03:27

回答

5

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

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

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

这非常依赖操作系统。

现在遇到用户级别的线程这个TCB是在用户地址空间创建的吗?

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

这些模型是什么?这些模型如何被实际使用?

Wikipedia看起来很清楚。

+1

“内核线程”通常用于指代“内核预定线程”,而不是内核空间中运行的线程。更重要的是,程序的正常线程在调用内核中的函数时可以通过上下文切换访问内核数据等,从而使得您的答案大多无关紧要。 – MaHuJa 2011-08-09 14:32:19

+0

@MaHuJa请详细说明我的答案中的任何内容是无意义的。 – Jeff 2011-08-11 18:20:53

0

本质上用户线程在用户与合适的特权级例如上下文中运行用户线程肯定无法访问内核级内存/数据结构/例程等。而内核线程在OS内核的上下文中运行,因此给予他们执行代码的权限,这些代码可以访问低级内核例程/内存/数据结构。

1

内核线程表示内核负责调度的线程。这意味着,除其他外,内核能够同时在不同的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的“用户线程对象”。