📜  线程调度

📅  最后修改于: 2021-08-27 18:03:22             🧑  作者: Mango

线程调度涉及两个边界调度,

  • 应用程序开发人员通过轻量级进程(LWP)将用户级线程(ULT)调度到内核级线程(KLT)。
  • 由系统调度程序对内核级线程进行调度,以执行不同的独特os功能。

轻量级过程(LWP):
轻量级进程是用户空间中的线程,这些线程充当ULT访问物理CPU资源的接口。线程库计划在哪个LWP上运行进程的哪个线程以及运行多长时间。线程库创建的LWP的数量取决于应用程序的类型。对于受I / O约束的应用程序,LWP的数量取决于用户级线程的数量。这是因为当在I / O操作上阻止LWP时,为了调用另一个ULT,线程库需要创建和调度另一个LWP。因此,在I / O绑定的应用程序中,LWP的数量等于ULT的数量。对于受CPU限制的应用程序,它仅取决于应用程序。每个LWP都附加到一个单独的内核级线程。

实时地,线程调度的第一个边界超出了指定调度策略和优先级的范围。它需要为用户级别线程指定两个控件:争用范围和分配域。这些解释如下。

1.竞争范围:
这里的竞争一词指的是用户级别线程之间在访问内核资源方面的竞争或斗争。因此,此控件定义了竞争发生的程度。它是由应用程序开发人员使用线程库定义的。根据争用的程度,它分为过程争用范围系统争用范围

  1. 流程竞争范围(PCS)–
    争用发生在同一进程中的线程之间。线程库计划高优先级的PCS线程通过可用的LWP(在线程创建期间由应用程序开发人员指定的优先级)访问资源。
  2. 系统竞争范围(SCS)–
    竞争发生在系统中的所有线程之间。在这种情况下,每个SCS线程都通过线程库与每个LWP关联,并由系统调度程序调度以访问内核资源。

    在LINUX和UNIX操作系统中,POSIX Pthread库提供了一个函数Pthread_attr_setscope来定义线程在其创建期间的争用范围的类型。

    int Pthread_attr_setscope(pthread_attr_t *attr, int scope) 

    第一个参数表示将范围定义到进程中的哪个线程。
    第二个参数定义指向的线程的争用范围。它有两个值。

    PTHREAD_SCOPE_SYSTEM
    PTHREAD_SCOPE_PROCESS 

    如果系统不支持指定的范围值,则该函数返回ENOTSUP

2.分配域:
分配域是线程正在竞争的一组一个或多个资源。在多核系统中,可能有一个或多个分配域,其中每个分配域都由一个或多个核组成。一个ULT可以是一个或多个分配域的一部分。由于处理硬件和软件体系结构接口的复杂性很高,因此未指定此控件。但是默认情况下,多核系统将具有一个接口,该接口会影响线程的分配域。

考虑一个场景,该操作系统具有三个进程P1,P2,P3和10个用户级线程(T1至T10),并且具有单个分配域。将在所有三个进程之间分配100%的CPU资源。分配给每个进程和每个线程的CPU资源的数量取决于应用程序开发人员使用线程库定义的每个线程的竞争范围,调度策略和优先级,还取决于系统调度程序。这些用户级别线程的争用范围不同。

在这种情况下,分配域的竞争发生如下,

  1. 流程P1:
    进程P1的所有PCS线程T1,T2,T3将相互竞争。同一进程的PCS线程可以共享一个或多个LWP。 T1和T2共享一个LWP,T3分配给一个单独的LWP。在T1和T2之间,通过LWP分配内核资源是基于线程库的抢先优先级调度。高优先级的线程将抢占低优先级的线程。然而,即使T1的优先级大于T3的优先级,进程p1的线程T1也不能抢占进程p3的线程T3。如果优先级相等,则将ULT分配给可用的LWP是基于系统调度程序(而不是线程库,在这种情况下)基于线程的调度策略。
  2. 流程P2:
    进程P2的SCS线程T4和T5都将与进程P1整体竞争,并与进程P3的SCS线程T8,T9,T10竞争。系统调度程序将在进程P3的P1,T4,T5,T8,T9,T10和PCS线程(T6,T7)之间调度内核资源,并将每个内核资源视为一个单独的进程。在这里,线程库无法控制将ULT调度到内核资源。
  3. 流程P3:
    PCS和SCS线程的组合。考虑一下,如果系统调度程序将50%的CPU资源分配给进程P3,那么25%的资源用于进程范围的线程,其余25%的资源用于系统范围的线程。 PCS线程T6和T7将根据线程库的优先级分配为访问25%的资源。 SCS线程T8,T9,T10将在它们之间分配25%的资源,并通过单独的LWP和KLT访问内核资源。 SCS调度是由系统调度程序进行的。

笔记:
对于访问内核资源的每个系统调用,都会创建一个内核级线程,并由系统调度程序将其关联到单独的LWP。

Number of Kernel Level Threads = Total Number of LWP 
Total Number of LWP = Number of LWP for SCS + Number of LWP for PCS
Number of LWP for SCS = Number of SCS threads
Number of LWP for PCS = Depends on application developer 

这里,

Number of SCS threads = 5 
Number of LWP for PCS = 3 
Number of SCS threads = 5 
Number of LWP for SCS = 5 
Total Number of LWP   = 8 (=5+3)
Number of Kernel Level Threads = 8 

PCS相对于SCS的优势:

  • 如果所有线程都是PCS,则上下文切换,同步,调度一切都在用户空间内进行。这样可以减少系统调用并获得更好的性能。
  • PCS比SCS便宜。
  • PCS线程共享一个或多个可用的LWP。对于每个SCS线程,一个单独的LWP被关联。对于每个系统调用,一个单独的KLT被创建。
  • 创建的KLT和LWP的数量很大程度上取决于创建的SCS线程的数量。这增加了处理调度和同步的内核复杂性。因此,导致对SCS线程创建的限制,指出SCS线程的数量要小于PCS线程的数量。
  • 如果系统具有多个分配域,则资源的调度和同步将变得更加乏味。当SCS线程是一个以上分配域的一部分时,就会出现问题,系统必须处理n个接口。

线程调度的第二个边界涉及系统调度程序进行的CPU调度。调度程序将每个内核级线程视为一个单独的进程,并提供对内核资源的访问。