线程调度方法及其装置的制作方法

文档序号:6609744阅读:146来源:国知局
专利名称:线程调度方法及其装置的制作方法
技术领域
本发明涉及计算机领域,尤其涉及一种应用于对称多处理器系统的线程调 度方法及其装置。
背景技术
进程通常被定义为一个正在运行的程序的实例,它是资源分配的单位。进 程可以支持多个线程, 一个进程中的多个线程共享相同的内存地址空间。线程是进程中的实体, 一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全 部资源。线程可以创建和撤消线程,从而实现程序的并发执行。线程一般具有 就绪、阻塞和运行三种基本状态。某一线程的执行有可能依赖于其他线程的执行,或某一线程的开始需要等 待其他线程的结束以获得资源的访问权限。从时间上看,这两个线程在时间上 不能并行执行或很难并行执行。这样的线程被认为是有关联度的线程。目前在对称多处理系统中,所有的处理器都可以平等地访问内存、I/O和 外部中断。系统资源被系统中所有CPU共享,工作负载能够相对均匀地分配 到所有可用处理器之上。在多处理器的系统中,不同线程可以同时在不同的中 央处理器上运行,甚至当它们属于同一个进程时也是如此。例如,当对称多处 理系统处理多线程的任务时,如果线程没有指定在某个处理器上运行,空闲的 处理器会执行调度程序以取得可运行而暂时没有被运行的线程。大多数支持多 处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器 之间的关联度。对称多处理系统在处理有关联的多线程的任务时,需要解决多 个处理器的相互通讯和协调,以及共享数据的同步保护。目前的对称多处理器系统执行应用程序时,大多以线程为调度单位执行。 目前的对称多处理器系统中,有两种线程调用方法。在第一种线程调用方法中,不指定线程在哪个处理器上执行,由对称多处 理器系统的调度程序对线程进行自由调度。相对空闲的处理器会从待执行线程 队列取得线程执行。由对称多处理器系统的调度程序自由调度线程,会出现多个相互关联的线 程同时分别运行于不同的处理器上的情况。由于这些相互关联的线程的资源是 共享的,在这些线程的执行过程中,不可避免地会发生处理器抢夺资源或等待 其他线程释放资源,以执行本处理器上的线程。这样,在一个处理器上本来应 该顺畅执行完的时间片内,增加了因其他处理器的抢夺而被打断的可能,导致 线程切换的机会大大高于正常水平。因此,两个处理器同时处理关联度比较高 的两个线程,由于抢夺、等待资源的开销,系统中如果还有其他任务等待执行, 处理器就不能及时执行却把时间浪费在抢夺、等待资源上,从而降低了系统的 总体效率。为了解决上述问题,现有技术还提供了一种线程调度方法。在该方法中, 通过绑定一组关联度较高的线程到某个固定的处理器上执行,使这些相互关联 的线程从始至终绑定在该固定的处理器上执行。当有多组线程被绑定在相同的 处理器上执行时,就有可能造成该处理器忙于处理这些线程,即使当前有空闲到其它发出调度请求的处理器上执行。由于无法预知处理器的运行与空闲的情况,因此将线程绑定在某个处理器 上运行,容易发生上述被绑定的处理器很忙,而其他处理器却空闲的情况,因 而无法发挥多处理器自由调度和并行处理的优势,会导致压力分布不均衡。综上所述,目前的对称对处理器处理关联度比较高的多线程时,不能充分 体现对称多处理器系统的优势,降低了系统效率。发明内容本发明实施例提供了 一种线程调度方法,以提高对称多处理器系统的运行效率,该方法包括如下步骤接收线程调度请求,选择一个处于就绪状态的待执行线程,获取与所述待 执行线程相关联的线程,并将获取到的线程中处于就绪状态的待执行线程设置 为非就绪状态;将被选择的待执行线程分配给所述发出调度请求的处理器执行,并在所述 被选择的线程执行完成时,将被设置为非就绪状态的与所述被选择的线程相关 联的线程恢复为就绪状态。本发明的另 一个实施例还提供了 一种线程调度方法,该方法包括如下步骤根据线程间的关联关系将所有线程分别绑定于线程集合,所述线程集合中 包含多个彼此关联的线程,或者包含一个与其它线程没有关联关系的独立线程;接收线程调度请求,选择一个处于就绪状态的待执行线程集合,并将所述 线程集合的状态设置为非就绪状态;将被选择的待执行线程集合分配给所述发出调度请求的处理器执行,并在 该线程簇中的线程执行完成时,将所述线程集合的状态设置为就绪状态。本发明的另一个实施例提供了一种线程调度处理装置,该装置包括调度 单元、状态设置单元和状态恢复单元,其中调度单元,用于接收线程调度请求,选择一个处于就绪状态的待执行线程, 向所述状态设置单元发送状态设置指令,并将被选择的待执行线程分配给发出 调度请求的处理器执行;在所述被选择的线程执行完成时,向所述状态恢复单 元发送状态恢复指令;状态设置单元,用于根据所述状态设置指令,获取与所述调度单元选择的 待执行线程相关联的线程,并将获取到的线程中处于就绪状态的待执行线程的就绪状态设置为非就绪状态;状态恢复单元,用于根据所述状态恢复指令,将所述状态设置单元设置为 非就绪状态的与所述被选择的线程相关联的线程恢复为就绪状态。本发明的另一个实施例还提供了一种线程调度装置,该装置包括线程绑 定单元、调度单元、状态设置单元和状态恢复单元,其中线程绑定单元,用于根据线程间的关联关系将所有线程分别绑定于线程集 合,并存储绑定信息;所述线程集合中包含多个彼此关联的线程,或者包含一 个与其它线程没有关联关系的独立线程;调度单元,用于接收线程调度请求,选择一个所述线程绑定单元设置的且 处于就绪状态的线程集合,向所述状态状态设置单元发送状态设置指令,并将 被选择的线程集合分配给发出调度请求的处理器执行;在所述被调度的线程集 合执行完成时,向所述状态恢复单元发送状态恢复指令;状态设置单元,用于根据所述状态设置指令,将所述被选择的线程集合的 状态设置为运行状态;状态恢复单元,用于根据所述状态恢复指令,将所述被选择的线程集合的 状态设置为就绪状态。本发明的上述实施例中,将线程调度到发出调度请求的处理器上执行,并 将与其关联的就绪状态的线程设置为非就绪状态,使该被调度的线程执行过程 中,与该被调度的线程关联的其他线程不会被调度到其他处理器上执行,从而 减少了对称多处理器系统对线程的自由调度所带来的争夺、同步资源开销;并 且,在该线程执行完成之后,将设置为非就绪状态的线程恢复为就绪状态,以 使这些相互关联的线程可以被其他处理器调度执行,从而避免了将相关联的线 程绑定到固定的处理器上执行所造成的系统压力分布不均衡,因此提高了系统 效率。


图1为本发明实施例一的线程调度流程示意图;图2为本发明实施例的线程调度处理装置的结构示意图之一;图3为本发明实施例的线程调度处理装置的结构示意图之二。
具体实施方式
下面结合附图对本发明实施例进行详细描述。 实施例一本实施例描述了以线程为调度单位,并将相互关联的线程绑定于线程娱 (也可称为线程集合,以下同),进行线程调度的流程。参见图1,为本发明实施例一的线程调度流程示意图,具体步骤包括步骤IOI、当某个处理器因当前空闲而发出调度请求时,线程调度程序接 收该处理器发出的调度请求,并根据线程调度规则,从待执行线程队列中选择 一个线程。待执行线程队列中排列有处于就绪状态的线程。线程的调度规则, 可以是根据调度方式或线程优先级进行调度。例如,线程调度程序从待执行线 程队列中选择一个优先级最高的线程。步骤102、调度程序获取与被选择的线程有关联关系的线程的信息。可以 事先将彼此有关联关系的线程进行标识,如将彼此有关联关系的线程绑定为线 程簇,并保存线程与线程簇的绑定关系。当调度程序选择一个线程进行调度时, 调度程序查询线程与线程簇的绑定关系,获取该线程所在的线程簇,并从该线 程簇中获取除该线程以外的其它线程的线程标识,如线程名称。步骤103、调度程序将待执行线程队列中的线程名称与步骤102中获取到 的线程名称进行比较,查找线程队列中是否具有相同名称的线程,如果有,则 将查找到的线程的状态设置为非就绪状态,使该线程从待执行线程队列中被移 除。步骤104、处理器获得调度程序分配的线程后执行该线程,在该线程执行 完毕时,调度程序将步骤103中被设置为非就绪状态的线程恢复为就绪状态,这些被恢复为就绪状态的线程又回到待执行线程队列中。线程簇(thread bundle)是一个或多个线程的集合, 一个线程簇由一个或 多个有一定关联的线程组成。 一个线程从属于一个线程簇。可根据需要创建一 个或多个线程簇。线程簇中的每个线程仍然保持自己的优先级等属性。线程簇可通过应用函数接口实现,例如创建一个线程簇bundlel,其中包含2个线程threadl和thread2,其实现过 程为int ret;bundle一t bundle 1; thread一t threadl, thread2; ret = bundle—create(bundlel); assert(O ret);printf("Create bundle success.");ret = bundle_append(bundlel, threadl);if (0 == ret) printf("threadl add to bundlel.");ret = bundle—append(bundlel, thread2);if (0 == ret) printf("thread2 add to bundle2.");当移出bundlel中的线程threadl时,执行bundle一remove(bundle 1 , thread 1); 当删除bundlel时,执行bundle—destroy (bundle 1); 删除线程簇只是解除对该线程蔟中所包含的线程的绑定,因此当删除线程簇时,即使该线程簇中有线程,也不会因此而删除这些线程。创建线程簇的目的是对相互关联的线程之间的关联关系进行标识,从而使调度程序能够通过查询线程与线程簇的绑定关系,获取与其中某个被调度的线程相关联的线程。以下是对称多处理器系统调度线程的 一个实例本实例中创建了 1个线程簇bundlel, bundlel中包含3个相互关联的线程 threadl 、 thread2和thread3,系统保存线程蔟bundlel的信息,以及bundlel与 threadl 、 thread2和thread3的对应关系。对称多处理器系统有2个处理器CPU1 和CPU2。当前待执行线程队列中有thread 1、 thread2、 thread3,以及其他线程 待执行。CPU1当前空闲,请求调度程序执行调度;调度程序从待执行线程队列中选择线程threadl,分配给CPU1 (可以根据 优先级或调度方式选择待执行线程,此为现有技术,在此不详述),此时,threadl 的状态从就绪状态转为运行状态,并被从待执行线程队列中移除。同时,调度 程序从保存的线程簇与线程的对应关系中,获取到threadl所属的线程簇是 bundlel ,从bundlel中获取到与threadl关联的线程有thread2和thread3,并查 询当前的待执行线程队列,查找到thread2和thread3 ,于是调度程序将待执行 队列中的thread2和thread3的状态设置为阻塞状态,使thread2和thread3从待 执行队列中被移除,例如将被移除的线程保存到被移除线程队列中。CPU1得 到thread 1后执行该线程。在CUPl执行threadl的过程中,CUP2空闲,请求调度程序执行调度;执行期间内,与threadl关联的线程thread2和thread3已经被设置为阻塞状态 而从待执行线程队列中移除,因此,在CPU2请求调度时,不可能将不在待执 行线程队列中的thread2或thread3调度到CPU2上执行,因此避免了与threadl 相关联的线程在同一时刻被不同的CPU执行。threadl执行完毕后从运行状态转为就绪状态,进入到待执行线程队列,同 时,调度程序将被设置为阻塞状态的thread2和thread3转为就绪状态,例如将 被移除线程队列中的thread2和thread3的状态设置为就绪,使thread2和thread3 重新进入到待执行线程队列。当任何一个CUP2请求调度时,可从待执行线程 队列中获得threadl或thread2或thread3执行,至于选择哪个线程调度到CPU2,需要依据调度策略,此为现有技术,在此不详述。由此可以看出,调度程序将与被调度的线程相关联的线程从待执行线程队 列中移除,使某个处理器在执行该被调度的线程的时间段内,使其它处理器不 可能得到与该被调度的线程相关联的线程执行,从而避免了处理器之间为了执 行相互关联的线程而抢夺资源,减少了在执行线程过程中被打断的几率。并且, 由于本实施例中并没有将线程簇绑定到固定的处理器上,因此, 一旦被调度的 线程调度完成后回到待执行线程队列,以及与该线程相关联的线程被恢复为就 绪状态回到待执行线程队列中时,这些线程可被自由调度,而不会象现有技术中 一样只能由固定的处理器执行,因而使系统压力分布均衡,提高了系统效率。 本实施例是通过将相互关联的多个线程绑定于线程簇实现线程调度,也可 通过将相互关联的多个线程绑定于进程实现线程调度。将相互关联的线程绑定 于进程,可通过应用函数接口实现,如通过应用函数接口实现在进程中创建或删除线程。当调度线程时,可通过与上述流程类似的方式,保证CPU执行该 进程中的某个线程的过程中,其他CPU不会得到该进程中的任何线程执行,在该被调度的线程执行完毕后,该进程中的处于就绪状态的线程可以被自由调度。实施例二本实施例描述了将相互关联的线程绑定于线程簇,并以线程簇为调度单位 进行线程调度的流程。首先,以与实施例一相同的方式创建并设置线程簇,当线程之间不存在关 联时,可将这些独立的线程分别独自设置为线程簇,以使所有线程都绑定在相 应的线程簇中。线程簇中的线程保持各自的属性。线程簇也具有属性,如优先级。线程簇的属性为该线程簇中处于就绪状态 的最高优先级的线程的属性。调度程序可根据线程簇的优先级等属性调度线程 簇,例如,优先级高的线程簇被优先调度,这样可保证优先级高的线程优先被 执行。线程簇也具有就绪、阻塞和运行等状态,并可在各状态之间进行转换。处 于就绪状态的线程簇可排列在待执行线程簇队列中以等待调度程序的调度;处 于运行状态或阻塞状态的线程簇不会出现在待执行线程簇队列中。当线程蔟中的某个线程被执行的时间段内,该线程簇处于运行状态;当线程蔟中的线程执 行完毕后,该线程簇恢复到就绪状态。以线程簇为调度单位进行调度的机制,与以线程为调度单位进行调度的机 制相似。以下为 一个以线程簇为调度单位实现线程调度的实例。例如,当前待执行线程簇队列中有两个待执行的线程簇bundlel和 bundle2,系统中有两个处理器CPU1和CPU2。当CPU1空闲时发出调度请求, 调度程序接收到调度请求后,从待执行线程簇队列中选择一个线程簇,例如, 选择优先级高的bundlel,并分配给CPU1执行。此时,bundlel当前为运行 状态,从待执行线程簇队列中移除。在CPUl执行线程簇bundle 1的过程中, CPU2空闲,并请求调度,调度程序从待执行线程簇队列中选择一个线程簇, 例如,选择当前优先级高的bundle2,分配给CPU2执行。CPU在得到线程簇执行时,可依据该线程簇中的线程状态和执行方式,执 行其中的线程,例如根据就绪状态线程的优先级,先执行优先级高的线程。在 根据优先级或线程执行方式执行完该线程簇中的全部或部分就绪状态线程后, 该线程簇的状态变为就绪状态,重新回到待执行线程簇队列中。通过本实例可以看出,由于本实例中没有将线程簇与处理器进行绑定,因 而空闲的处理器有可能获得任何一个处于就绪状态的线程簇执行,从而解决了问题。本发明实施例还提供了线程调度处理装置。参见图2,为本发明实施例提供的线程调度处理装置的结构示意图,该线 程调度处理装置适用于实施例一所述的流程。该装置包括线程绑定单元、调度单元、状态设置单元和状态恢复单元。线程绑定单元用于将相互关联的线程绑定于线程簇,并存储绑定信息,如线程及其所属的线程簇的隶属关系等信息;调度单元用于根据处理器发出的调度请求,从待执行线程队列中选择一个 线程,如选择一个优先级最高的线程,并向状态设置单元发送状态设置指令, 状态设置指令中可以携带被选择的线程的信息,如线程名称;状态设置单元用于根据调度单元发出的状态设置指令,从线程绑定单元获 取被选择的线程所属的线程簇,并获取该线程簇内除该被选择的线程以外的线 程,然后,查询待执行线程队列中是否有与获取到的线程相同的线程,并将查 询到的相同的线程设置为阻塞状态,使这些线程被移除待执行线程队列;状态恢复单元用于将状态设置单元设置为非就绪状态的与被选择的线程 相关联的线程恢复为就绪状态,使这些线程又回到待执行线程队列。参见图3,为本发明实施例提供的线程调度处理装置的结构示意图,该线 程调度处理装置适用于实施例二所述的流程。该装置包括线程绑定单元、调度 单元、状态设置单元和状态恢复单元。线程绑定单元用于将相互关联的线程绑定于线程簇,并存储绑定信息。线 程绑定单元还为线程簇设置属性,将线程簇中处于就绪状态的优先级最高的线 程的属性设置为该线程集合的属性,如将优先级最高的线程的优先级作为所属 线程簇的优先级。对于与其它线程没有关联关系的独立线程,线程绑定单元将 其分别独自绑定于线程簇,这样使所有线程都绑定于相应的线程簇中。调度单元调度用于根椐处理器发出的调度请求,从待执行线程簇队列中选 择一个待执行线程蔟,并向状态设置单元发送状态设置指令,指令中可以携带线程簇的信息。调度单元调度线程簇时,可根据线程簇的属性进行调度,如优 先调度优先级高的线程簇执行。待执行线程簇队列中存储有处于就绪状态的线 程簇,如果一个线程簇中具有处于就绪状态的线程,则该线程簇处于就绪状态。 状态设置单元用于根据调度单元发出的状态设置指令,将被调度的线程簇态,该线程簇被从待执行线程队列中移除;状态恢复单元用于获取线程簇的执行状态,并在获知被调度的线程簇中的 线程执行完成时,将该线程簇的状态设置为就绪,使该线程蔟又回到待执行线程簇队列。处理器在得到线程簇执行时,可依据该线程簇中的线程状态和执行方式, 执行其中的线程,例如根据就绪状态线程的优先级,先执行优先级高的线程。 在根据优先级或线程执行方式执行完该线程簇中的全部或部分就绪状态线程 后,该线程簇的状态变为就绪状态,重新回到待执行线程簇队列中。综上所述,本发明实施例通过将相互关联的线程绑定于线程蔟,使同一线 程簇内的线程同 一时刻只在一个处理器上运行,可以避免对称多处理器系统对线程的自由调度所带来的争夺、同步资源开销;同时,调度线程或线程簇时, 仍采用自由调度的机制,即不将线程或线程集合绑定在指定的处理器上执行, 避免由此带来的被绑定的处理器很忙,而其他处理器却空闲的请求发生,从而 在处理相互关联的线程时,可发挥对称多处理器的优势,提高了系统运行效率。 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发 明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及 其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1、一种线程调度方法,其特征在于,包括如下步骤接收线程调度请求,选择一个处于就绪状态的待执行线程,获取与所述待执行线程相关联的线程,并将获取到的线程中处于就绪状态的待执行线程设置为非就绪状态;将被选择的待执行线程分配给所述发出调度请求的处理器执行,并在所述被选择的线程执行完成时,将被设置为非就绪状态的与所述被选择的线程相关联的线程恢复为就绪状态。
2、 如权利要求1所述的方法,其特征在于,所述被选择的待执行线程和 与其关联的线程绑定于线程集合;所述获取与所述待执行线程相关联的线程具 体包括获取所述被选择的待执行线程所属的线程集合,获取绑定于所述线程集合 的线程中,除所述被选择的待执行线程以外的其它线程。
3、 如权利要求1所述的方法,其特征在于,将获取到的线程中处于就绪 状态的待执行线程设置为非就绪状态具体包括在待执行线程队列中查询与所述获取到的线程相同的线程,并将查询到的 线程的就绪状态设置为非就绪状态。
4、 如权利要求l所述的方法,其特征在于,所述非就绪状态为阻塞状态。
5、 一种线程调度方法,其特征在于,包括如下步骤根据线程间的关联关系将所有线程分别绑定于线程集合,所述线程集合中 包含多个彼此关联的线程,或者包含一个与其它线程没有关联关系的独立线程;接收线程调度请求,选择一个处于就绪状态的待执行线程集合,并将所述 线程集合的状态设置为非就绪状态;将被选择的待执行线程集合分配给所述发出调度请求的处理器执行,并在 该线程簇中的线程执行完成时,将所述线程集合的状态设置为就绪状态。
6、 如权利要求5所述的方法,其特征在于,所述处于就绪状态的线程集 合为具有就绪状态线程的线程集合,所述线程集合的优先级为所述线程集合中处于就绪状态的最高优先级线程的优先级;所述选择一个处于就绪状态的待执 行线程集合具体包括根据所述处于就绪状态的线程集合的优先级选择线程集合。
7、 如权利要求5所述的方法,其特征在于,所述非就绪状态为运行状态。
8、 一种线程调度处理装置,其特征在于,包括调度单元、状态设置单元 和状态恢复单元,其中调度单元,用于接收线程调度请求,选择一个处于就绪状态的待执行线程, 向所述状态设置单元发送状态设置指令,并将被选择的待执行线程分配给发出 调度请求的处理器执行;在所述被选择的线程执行完成时,向所述状态恢复单 元发送状态恢复指令;状态设置单元,用于根据所述状态设置指令,获取与所述调度单元选择的 待执行线程相关联的线程,并将获取到的线程中处于就绪状态的待执行线程的 就绪状态设置为非就绪状态;状态恢复单元,用于根据所述状态恢复指令,将所述状态设置单元设置为 非就绪状态的与所述被选择的线程相关联的线程恢复为就绪状态。
9、 如权利要求8所述的线程调度处理装置,其特征在于,还包括线程 绑定单元,用于将相互关联的线程绑定于线程集合,并存储绑定信息;所述状态设置单元从所述线程绑定单元获取所述被选择的线程所属的线 程集合,获取绑定于所述线程集合的线程中除所述被选择的线程以外的其它线 程,并将其中处于就绪状态的待执行线程设置为阻塞状态;所述状态恢复单元将所述线程集合中被所述状态设置单元设置为阻塞状 态的线程设置为就绪状态。
10、 一种线程调度处理装置,其特征在于,包括线程绑定单元、调度单 元、状态设置单元和状态恢复单元,其中线程绑定单元,用于根据线程间的关联关系将所有线程分别绑定于线程集 合,并存储绑定信息;所述线程集合中包含多个彼此关联的线程,或者包含一 个与其它线程没有关联关系的独立线程;调度单元,用于接收线程调度请求,选择一个所述线程绑定单元设置的且 处于就绪状态的线程集合,向所述状态状态设置单元发送状态设置指令,并将被选择的线程集合分配给发出调度请求的处理器执行;在所述被调度的线程集 合执行完成时,向所述状态恢复单元发送状态恢复指令;状态设置单元,用于根据所述状态设置指令,将所述被选择的线程集合的 状态设置为运行状态;状态恢复单元,用于根据所述状态恢复指令,将所述被选择的线程集合的 状态设置为就绪状态。
全文摘要
本发明公开了一种应用于对称多处理器系统的线程调度方法及其装置。本发明方法包括以下步骤接收线程调度请求,选择一个处于就绪状态的待执行线程,获取与所述待执行线程相关联的线程,并将获取到的线程中处于就绪状态的待执行线程设置为非就绪状态;将被选择的待执行线程分配给所述发出调度请求的处理器执行,并在所述被选择的线程执行完成时,将被设置为非就绪状态的与所述被选择的线程相关联的线程恢复为就绪状态。采用本发明,可减小对称多处理器系统对线程的自由调度所带来的争夺、同步资源开销,并且还可避免将线程指定到固定处理器上执行所造成的系统效率低,提高了系统运行效率。
文档编号G06F9/46GK101324851SQ200710110988
公开日2008年12月17日 申请日期2007年6月12日 优先权日2007年6月12日
发明者李国柱 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1