Linux kernel 绿色线程的缺点:主机内核线程块

Linux kernel 绿色线程的缺点:主机内核线程块,linux-kernel,operating-system,kernel,green-threads,Linux Kernel,Operating System,Kernel,Green Threads,我目前正在学习操作系统,我很难理解有关实现多线程进程的部分内容 具体来说,教科书解释说,我们可以通过称为每个处理器内核线程的系统来实现用户级线程。关于该系统的详细说明如下: 当应用程序启动时,用户级线程库为主机上的每个处理器创建一个内核线程。只要系统上没有其他活动,内核就会为每个线程分配一个处理器。每个内核线程并行执行用户级调度程序:从用户级就绪列表中拉出下一个线程,然后运行它。由于线程调度决策发生在用户级别,因此它们可以灵活且特定于应用程序 然而,接下来,它还提到了这个系统的一些缺点,这与绿色

我目前正在学习操作系统,我很难理解有关实现多线程进程的部分内容

具体来说,教科书解释说,我们可以通过称为每个处理器内核线程的
系统来实现用户级线程。关于该系统的详细说明如下:

当应用程序启动时,用户级线程库为主机上的每个处理器创建一个内核线程。只要系统上没有其他活动,内核就会为每个线程分配一个处理器。每个内核线程并行执行用户级调度程序:从用户级就绪列表中拉出下一个线程,然后运行它。由于线程调度决策发生在用户级别,因此它们可以灵活且特定于应用程序

然而,接下来,它还提到了这个系统的一些缺点,这与绿色线程类似。下文提到了一些不利因素

  • 每当用户级线程调用内核时,其主机内核线程都会阻塞。这将防止线程库同时在该处理器上运行不同的用户级线程

  • 每当内核时间分割内核线程时,它运行的用户级线程也会挂起。在内核线程恢复之前,该库无法恢复该线程

我不能完全理解他们两个。 以下是我的问题

  • 如果用户级线程调用内核,为什么主机内核线程会在这个系统中阻塞
  • 内核线程的
    内核时间片是什么意思
  • 如果内核时间切片一个内核线程,为什么用户级线程运行被挂起

  • 谢谢。

    在教科书中,您所描述的有时被称为多对多模型,并附加了内核线程数量受限于处理器数量的限制

    我不知道有哪个操作系统以这种方式实现线程。(如果有人知道一些非学术性的操作系统会以这种方式线程,请告诉我。)这样一个系统的实现将非常复杂

    用户线程没有任何真正的优势。可悲的是,大多数操作系统教科书最好是作为机箱内衬使用。许多人坚持描述用户线程的理论(但不可行)优势,而这些优势在现实世界中根本不存在。所描述的是在内核线程之上运行用户线程

    这句话真可笑:

    由于线程调度决策发生在用户级别,因此它们可以灵活且特定于应用程序

    a) 您仍然会有[隐式]不灵活的内核线程

    b) 如果能够以这种方式使用用户线程获得更好的性能,那么操作系统的内核线程实现就必须是完全不合适的

    这是总BS:

    每当用户级线程调用内核时,其主机内核线程都会阻塞。这将防止线程库同时在该处理器上运行不同的用户级线程

    a) 存在非阻塞内核调用

    b) 在某些逆行操作系统中调用I/O系统服务会阻塞用户线程。并非所有操作系统都是如此

    对于您的具体问题:

    如果用户级线程调用内核,为什么主机内核线程会在这个系统中阻塞

    见上文。这种情况只发生在一些设计糟糕的操作系统中的一些系统调用中

    内核线程的内核时间片是什么意思

    是的,那是蹩脚的英语。在线程调度中,一个进程可能会得到一个固定的时间量(“时间片”或“量”),在调度器启动之前,它可以执行该时间量,以查看是否应该轮到另一个线程执行。如果有一个线程在不执行I/O的情况下执行长时间计算,则此时间限制可防止该线程占用系统

    我无法理解为什么这是这个线程模型的一个特定缺点。在纯内核线程中也会发生同样的事情。或纯用户线程


    可悲的是,你在这里看到的是一本书,它采用了简单的概念,使它们变得过于复杂。我很同情你。

    “不幸的是,大多数操作系统教科书最好用猫箱衬里。”这是不真实的。我的猫把书扔了。TBH,同样的垃圾充斥着大多数的“线程介绍”网站。最糟糕的是使用“量子”来描述既不固定也不可分割的东西。