【问题标题】:Downside of green threads: host kernel thread blocks绿色线程的缺点:宿主内核线程块
【发布时间】:2017-08-26 14:08:14
【问题描述】:

我目前正在学习操作系统,我对Implementing Multi-Threaded Processes的某些部分理解有困难。

具体来说,教科书解释说,我们可以通过Per-Processor Kernel Threads的系统来实现用户级线程。该系统的详细说明如下:

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

但是,接下来,它也提到了这个系统有一些缺点,类似于绿色线程。下面提到了一些缺点

  • 任何时候用户级线程调用内核,它的宿主内核线程都会阻塞。这可以防止线程库同时在该处理器上运行不同的用户级线程。

  • 每当内核对内核线程进行时间切片时,它正在运行的用户级线程也会暂停。在内核线程恢复之前,该库无法恢复该线程。

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

  1. 如果用户级线程调用内核,为什么宿主内核线程会阻塞在这个系统中?
  2. kernel time-slices a kernel thread 是什么意思?
  3. 如果内核对内核线程进行时间切片,为什么用户级线程运行被挂起?

谢谢。

【问题讨论】:

    标签: linux-kernel operating-system kernel green-threads


    【解决方案1】:

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

    我不知道有任何操作系统以这种方式实现线程。 (如果有人知道一些以这种方式进行线程处理的非学术操作系统,请赐教。)这样的系统实施起来会非常复杂。

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

    这句话简直可笑:

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

    a) 你仍然会在下面拥有 [隐式] 不灵活的内核线程。

    b) 如果可以通过这种方式获得更好的用户线程性能,那么操作系统对内核线程的实现将是完全无能为力的。

    这是总的废话:

    任何时候用户级线程调用内核,它的宿主内核线程都会阻塞。这可以防止线程库同时在该处理器上运行不同的用户级线程。

    a) 有非阻塞内核调用。

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

    针对您的具体问题:

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

    见上文。它只发生在一些设计不佳的操作系统中的一些系统调用上。

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

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

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

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

    【讨论】:

    • '可悲的是,大多数操作系统教科书最好使用猫盒衬垫。'那太不真实了。我的猫把书扔了。
    • TBH,大多数“线程简介”网站都出现了同样的垃圾。最糟糕的是使用“量子”来描述既不固定也不不可分割的东西。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2010-09-09
    • 2022-12-01
    相关资源
    最近更新 更多