每种型号的优点和缺点?
你能举个例子吗?
EDIT:
有一件事让我对多对一模型感到困惑 我引用了这本书:
“线程管理由用户空间中的线程库完成,所以它 很有效率;但是如果一个线程生成一个,整个过程将会阻塞 阻止系统调用。另外,因为只有一个线程可以访问 内核一次,多个线程无法并行运行 多处理器“
是否意味着内核中的所有进程都将被阻止,因为交换是由应用程序完成的,而不是由OS调度程序完成的。 (因为在这个模型中我们管理用户模式下的线程)? 或者,只有属于阻塞系统调用的线程的同一进程的线程才会被阻塞?
提前致谢!
答案 0 :(得分:6)
我们必须将用户级线程分配给内核级线程,基于此,映射可以是:
一对一(一个用户线程映射到一个内核级线程)
多对一(许多用户级线程映射到一个内核级线程)
多对多(许多用户级线程映射到许多内核级线程)
这里内核级线程的数量通常设置为小于用户级线程的数量,因为内核级线程的管理要昂贵得多,因为它涉及内核级别线程管理中的内核干预。
由于这个原因,只有“one to many”(一个用户级线程到多个内核级别线程)的第四个映射到一个没有意义。
“线程管理由用户空间中的线程库完成,因此效率很高;但是如果线程进行阻塞系统调用,整个进程将阻塞。此外,因为只有一个线程可以访问一次内核,多个线程无法在多处理器上并行运行“
这个例子可能有助于理解这一行:
这是否意味着内核中的所有进程都将被阻止,因为交换是由应用程序完成的,而不是由OS调度程序完成的。 (因为在这个模型中我们管理用户模式下的线程)?或者,只有属于阻塞系统调用的线程的同一进程的线程才会被阻止?
一个进程的线程独立于其他进程的线程。因此,只有属于阻塞系统调用的线程的同一进程的线程才会被阻塞。
我希望这对你有意义......
答案 1 :(得分:2)
我可以看到你的问题。你有一本可怕的书。
您正在询问几个相关问题。首先,有两种通用的方法来实现线程。
1)使用计时器在库中实现线程。在计划执行过程的系统中,这是执行线程的唯一方法。这是在奥尔德时代做线程的唯一方法。这个系统通常被称为用户线程。"用户线程在进程内多路复用。该过程会调度自己的线程。
"用户线程的神话优势" over"内核线程" (下面)是他们更有效率。这就是你引用的段落所指的内容。声明"整个过程将阻止一个线程进行阻塞系统调用"只适用于某些[unix]系统。
2)线程在操作系统中实现。进程由地址空间和一个或多个线程组成。操作系统内核调度THREADS以执行而不是PROCESSES。这些是内核线程。
请注意,即使系统支持内核线程,进程也可以使用用户线程。这两者并不相互排斥。但是,本机不支持内核线程的系统只能使用用户线程。
这是解释不同线程模型的简单方法。
- = - = - = - = - = - = - = - = - = - = - = -
一对一,多对一,多对多模式对学生来说是一种不必要的困惑。现在我们必须重叠术语。
让我们改变术语。对于#1,而不是调用可调度执行单元" process"我们称之为内核线程。"此模型中每个进程只能有一个内核线程。然后,进程中的线程是"用户线程。"在/内执行的任意数量的用户线程都映射到内核线程。这就是多对一模型。用户线程=多对一。
如果我们让操作系统创建线程(内核线程),那么让我们理论上调用正在执行的用户线程。"每个用户线程映射到一个且仅在一个内核线程中执行/执行。这是一对一的模式。
多对一模型与通常称为"用户线程模型相同。"
术语开始变得荒谬,因为只有一个线程,但我们称之为映射到内核线程的用户线程。
一对一模型通常称为内核线程模型。
最后,我们讨论了多对多模型。这是理论学士学位。理论上,可能有许多用户线程映射到许多内核线程。换句话说,单个用户线程可以在不同的内核线程中执行。我从未听说过系统以这种方式实现线程,我无法想象这样一个系统有任何实际的优势。
- = - = - = - = - = - = - = - = - = - = - = - = -
关于你的上一个问题,在某些操作系统中,阻塞系统调用块也会阻塞用于实现用户线程的定时器(a / k / a多对一)。如果一个线程进行阻塞调用,它将阻止PROCESS中的所有其他线程执行,直到阻塞调用完成。
这种阻止不会发生在所有系统中(操作系统教科书应指出的内容)。
答案 2 :(得分:0)