曲径通幽论坛

标题: 三种线程模型 [打印本页]

作者: beyes    时间: 2011-8-21 14:55
标题: 三种线程模型
线程的并发执行是由多处理器或操作系统调度来实现的,Windows 和 Linux 都在内核里提供线程的支持。

用户实际使用的线程并不是内核线程,而是存在于用户态的用户线程。用户态线程不一定在操作系统内核里有对应等同数量的内核线程。

用户态多线程库的实现方式有 3 种模型:

1. 一对一模型
对于直接支持线程的系统,一对一模型是最为简单的模型。该模型表现为一个用户使用的线程唯一对应一个内核使用的线程,反之则不然。该模型如下图所示:

用户线程和内核线程一致的优点表现在线程之间的并发是真正的并发,一个线程因为某原因阻塞,不会因此而影响到其他线程。此外,该模型可以让多线程程序在多处理器的系统上有更好的表现。

一般使用 API 或者系统调用创建的线程均为一对一的线程,如 Linux 里的 clone() 系统调用函数,Windows 里的 CreateThread() API 都可以创建一对一的线程。

一对一线程有两个缺点:




2. 多对一模型
多对一模型是将多个用户线程映射到一个内核线程上,线程之间的切换由用户态的代码来进行,相对于一对一模型,多对一模型的进程切换要快速很多。该模型如下图所示:

多对一模型的最大问题时,如果其中一个用户线程阻塞,那么所有的线程都无法继续执行,因为此时内核里的线程也随之阻塞了。另外,在多处理器系统上,处理器的增多对多对一模型的线程性能也不会有明显的帮助。

多对一模型的优点是高效的上下文切换和几乎无限制的线程数量。

3. 多对多模型
多对多模型结合了一对一模型和多对一模型的特点,它讲多个用户线程映射到少数但不止一个内核线程上。该模型如下图所示:

在该模型中,一个用户线程阻塞并不会使得所有的用户线程阻塞,因为此时还有别的线程可以被调度来执行。此外,多对多模型对用户线程的数量也没什么限制。在多个处理器系统上,多对多模型的线程性能也能得到一定的性能提升,不过提升幅度不如一对一模型高。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2