每种型号的优缺点?
你能举个例子吗?
EDIT:有一件事让我和我引用的多对一模型混淆了:
线程管理是由线程库在用户空间完成的,因此是有效的;但是,如果线程进行阻塞系统调用,则整个进程将被阻塞。此外,由于一次只能访问一个线程,所以多个线程无法在多处理器上并行运行
这是否意味着内核中的所有进程都会被阻塞,因为交换是由应用程序完成的,而不是由操作系统调度程序完成的。(因为在这个模型中,我们以用户模式管理线程)?或者,只有属于发出阻塞系统调用的线程进程的线程才会被阻塞?
提前感谢!
发布于 2016-07-29 10:54:43
我们必须将用户级线程分配给内核级线程,基于此,映射可以是:
在这里,内核级线程的数量通常被设置为小于用户级线程的数量,因为对内核级线程的管理要昂贵得多,因为它涉及到内核级线程管理中的内核干预。
由于这个原因,只有“一对多”(一个用户级线程到多个内核级线程)到一个内核级线程的第四个映射是没有意义的。
“线程管理是由线程库在用户空间中完成的,因此是有效的;但是如果线程进行阻塞系统调用,则整个进程将被阻塞。此外,由于一次只能访问一个线程,所以多个线程无法在多处理器”上并行运行。
这个例子可能有助于理解这一行:

是否意味着内核中的所有进程都将被阻塞,因为交换是由应用程序完成的,而不是由操作系统调度程序完成的。(因为在这个模型中,我们以用户模式管理线程)?或者,只有属于发出阻塞系统调用的线程进程的线程才会被阻塞?。
一个进程的线程独立于其他进程的threads.So,只有属于执行阻塞系统调用的线程的同一个进程的线程才会被阻塞。
我希望这对你有意义..。
发布于 2016-07-29 03:19:23
我能看出你的问题。你有一本可怕的书。
你在问一些相关的问题。首先,有两种实现线程的通用方法。
1)线程在库中使用计时器实现。在调度执行进程的系统中,这是执行线程的唯一方法。在过去的日子里,这是做线程的唯一方法。这个系统通常被称为“用户线程”。用户线程在进程中被复用。该进程对自己的线程进行调度。
与“内核线程”(下面)相比,“用户线程”的神秘优势在于它们更有效率。这就是你引用的文章所指的。“如果线程进行阻塞系统调用,整个进程将被阻塞”的语句仅在某些unix系统上是正确的。
2)线程是在操作系统中实现的。进程由地址空间和一个或多个线程组成。操作系统内核调度线程以供执行,而不是进程。这些是内核线程。
注意,即使系统支持内核线程,进程也可以使用用户线程。两者并不是相互排斥的。但是,不支持内核线程的系统只能使用用户线程。
这是解释不同线程模型的简单方法。
-=-
一对一、多对一、多对多的模式对学生来说是一种不必要的混乱。现在我们必须进入重叠的术语。
让我们改变一下术语。对于#1,我们称它为“内核线程”,而不是将可调度的执行单元称为“进程”。在这个模型中,每个进程只能有一个内核线程。然后进程中的线程是“用户线程”。在/映射到内核线程内执行的任意数量的用户线程。这就是多对一的模式。用户线程=多对一。
如果操作系统创建了线程(内核线程),理论上让我们将正在执行的内容称为“用户线程”。每个用户线程映射到/仅在一个内核线程中执行。这就是一对一的模式。
多对一模型与通常所说的“用户线程模型”相同。
这个术语开始变得毫无意义,因为只有一个线程,但我们称它为映射到内核线程的用户线程。
一对一模型通常称为内核线程模型。
最后,我们讨论了多到多模型。这是理论上的BS。理论上,可以有许多用户线程映射到许多内核线程。换句话说,一个用户线程可以在不同的内核线程中执行。我从未听说过以这种方式实现线程的系统,我无法想象这种系统有什么实际的好处。
-=-
关于最后一个问题,在某些操作系统中,阻塞系统调用块也会阻塞用于实现用户线程的计时器(a/k/a多对一)。如果一个线程发出阻塞调用,它将阻止进程中的所有其他线程执行,直到阻塞调用完成为止。
这种阻塞并不发生在所有的系统中(这是OS教科书应该指出的)。
https://stackoverflow.com/questions/38647621
复制相似问题