一种基于锁的线程管理方法及装置转让专利

申请号 : CN201210104321.7

文献号 : CN102662742B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘仪阳

申请人 : 华为技术有限公司

摘要 :

本发明公开了一种基于锁的线程管理方法及装置,包括:在判断是否需要执行锁行为监控后,若确定需要执行锁行为监控,则获得第一锁竞争程度信息;根据所述第一锁竞争程度信息确定需要进行迁移操作的线程,并将所述线程迁移至确定的目标处理器。由于采用了通过动态判断决定锁行为监控的执行与否的技术手段,因此,可以避免出现因持续执行锁行为监控导致的过量占用系统处理资源的问题,进而可以使得在基于锁的线程管理过程中,系统的处理性能不会受到太大的影响。

权利要求 :

1.一种基于锁的线程管理方法,其特征在于,包括:

在判断是否需要执行锁行为监控后,若确定需要执行锁行为监控,则获得第一锁竞争程度信息;

根据所述第一锁竞争程度信息确定需要进行迁移操作的线程,并将所述线程迁移至确定的目标处理器;

确定所述目标处理器的步骤包括:

确定需要进行迁移操作的线程所处于的调度域,并在该确定的调度域内,选择确定该线程的目标处理器;

所述判断是否需要执行锁行为监控的步骤包括:

获取预定时间段内的锁竞争参数信息,并根据所述锁竞争参数信息获得第二锁竞争程度信息,再根据所述第二锁竞争程度信息判断是否需要执行锁行为监控,若所述第二锁竞争程度信息指示当前锁竞争达到预定程度,则确定需要执行锁行为监控;

或者,

获取预定时间段内的锁竞争参数信息,并根据所述锁竞争参数信息确定锁行为监控的执行时间,再根据所述执行时间及当前时间信息判断是否执行锁行为监控,若当前时间信息与所述执行时间一致,则确定需要执行锁行为监控;

或者,

获取预定时间段内的锁竞争参数信息,并根据所述锁竞争参数信息确定执行锁行为监控需要经过的时间片跳跃轮数,以根据所述时间片跳跃轮数判断是否执行锁行为监控,若当前经过的时间片轮数达到所述执行锁行为监控需要经过的时间片跳跃轮数,则确定需要执行锁行为监控。

2.根据权利要求1所述的方法,其特征在于,

所述锁竞争参数信息包括:开始尝试持有锁的时间和成功获得锁时的时间,和/或,线程被调度到处理器上开始执行的时间和线程所在的处理器被其他线程抢占离开处理器的时间,和/或,获取锁的时间和释放锁的时间;

所述第一锁竞争程度信息包括:锁等待时间,和/或,锁持有时间,和/或,线程在当前时间段内的实际执行时间;

所述第二锁竞争程度信息包括:锁等待时间,和/或,锁持有时间,和/或,线程在当前时间段内的实际执行时间。

3.根据权利要求1所述的方法,其特征在于,该方法还包括:

判断当前线程的锁竞争程度是否超过预定值,若是,则提高该线程对应的负载平衡级别,否则,降低该线程对应的负载平衡级别,其中,不同的负载平衡级别对应着不同的调度域,且所述负载平衡级别越高则线程所处于的调度域包含的处理器越多。

4.一种基于锁的线程管理装置,其特征在于,包括:

监控判断单元,用于判断是否需要执行锁行为监控;

第一锁竞争程度信息获取单元,用于在所述监控判断单元确定需要执行锁行为监控时,获得第一锁竞争程度信息;

线程迁移操作单元,用于根据所述第一锁竞争程度信息获取单元获得的锁竞争程度信息确定需要进行迁移操作的线程,并将所述线程迁移至确定的目标处理器;

该装置还包括:

目标处理器确定单元,用于确定需要进行迁移操作的线程所处于的调度域,并在该确定的调度域内,选择确定该线程的目标处理器;

锁竞争参数信息获取单元,用于获取预定时间段内的锁竞争参数信息;以及第二锁竞争程度信息获取单元,用于根据所述锁竞争参数信息获取单元获取的锁竞争参数信息获得第二锁竞争程度信息,并将所述第二锁竞争程度信息提供给所述监控判断单元,以作为监控判断单元判断是否需要执行锁行为监控的依据,若所述监控判断单元确定第二锁竞争程度信息指示当前锁竞争达到预定程度,则确定需要执行锁行为监控;

或者,

监控时间获取单元,用于获取预定时间段内的锁竞争参数信息,并根据所述锁竞争参数信息确定锁行为监控的执行时间,再将所述锁行为监控的执行时间提供给所述监控判断单元,以作为监控判断单元判断是否执行锁行为监控的依据,若监控判断单元确定当前时间信息与所述执行时间一致,则确定需要执行锁行为监控;

或者,

监控时间片轮数确定单元,用于获取预定时间段内的锁竞争参数信息,并根据所述锁竞争参数信息确定执行锁行为监控需要经过的时间片跳跃轮数,以作为所述监控判断单元判断是否执行锁行为监控的依据,若所述监控判断单元确定当前经过的时间片轮数达到所述执行锁行为监控需要经过的时间片跳跃轮数,则确定需要执行锁行为监控。

5.根据权利要求4所述的装置,其特征在于,

所述锁竞争参数信息包括:开始尝试持有锁的时间和成功获得锁时的时间,和/或,线程被调度到处理器上开始执行的时间和线程所在的处理器被其他线程抢占离开处理器的时间,和/或,获取锁的时间和释放锁的时间;

所述第一锁竞争程度信息包括:锁等待时间,和/或,锁持有时间,和/或,线程在当前时间段内的实际执行时间;

所述第二锁竞争程度信息包括:锁等待时间,和/或,锁持有时间,和/或,线程在当前时间段内的实际执行时间。

6.根据权利要求4所述的装置,其特征在于,该装置还包括:

锁竞争程度判断单元,用于判断当前线程的锁竞争程度是否超过预定值;

调度域调整单元,用于在所述锁竞争程度判断单元确定当前线程的锁竞争程度超过预定值时,提高该线程对应的负载平衡级别,否则,降低该线程对应的负载平衡级别,其中,不同的负载平衡级别对应着不同的调度域,且所述负载平衡级别越高则线程所处于的调度域包含的处理器越多。

说明书 :

一种基于锁的线程管理方法及装置

技术领域

[0001] 本发明涉及一种计算机技术领域,尤其涉及一种基于锁的线程管理方法及装置。

背景技术

[0002] 随着计算机技术的发展,多核或众核架构已经成为当前计算环境的主流趋势。但是,计算机的性能并不是随着计算机系统核数目的增长而呈现线性增长,甚至有时出现随着核数目的增长,性能却随着下降的现象。这种现象称之为核扩展性问题。
[0003] 其中,锁竞争是限制系统在多核架构上并行扩展性的因素之一。特别时发生锁震荡时,系统的性能损失非常大。相应的锁震荡是指很多线程在同时竞争同一个锁,并且不释放CPU,从而导致等待锁的时间远远大于持有锁的时间。
[0004] 为克服上述问题,目前采用的技术手段是:首先,在多种不同的模拟应用场景下,分别监测获得锁竞争发展趋势和热点锁,以及锁震荡临界点相关信息,以获得各个不同的模拟应用场景下的可能会发生锁竞争问题(如锁震荡)的锁。之后,在实际应用场景中基于可能会发生锁竞争问题的锁实时监测每一个线程,在相应的锁的锁竞争达到一定程度但未发生锁震荡之前,将该线程迁移到一组核中,使得竞争锁严重的线程运行在一组核中,以降低锁竞争带来的性能影响。
[0005] 在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
[0006] 上述现有技术需要通过模拟不同的应用场景,并对模拟的应用场景中的锁应用情况进行监测分析,以提前获知可能出现锁竞争问题的锁,实现过程较为复杂。
[0007] 而且,在实际的各应用场景中,通常是对上述提前获的可能出现锁竞争问题的锁实时进行监控,以便在出现锁竞争问题时可以进行相应的线程迁移处理,这种持续的实时监控过程将会占用大量的处理资源,影响系统的处理性能。

发明内容

[0008] 本发明的目的是提供一种基于锁的线程管理方法及装置,以避免持续的锁行为监控导致占用系统中大量的处理资源,从而改善系统的处理性能。
[0009] 本发明的目的是通过以下技术方案实现的:
[0010] 一种基于锁的线程管理方法,包括:
[0011] 在判断是否需要执行锁行为监控后,若确定需要执行锁行为监控,则获得第一锁竞争程度信息;
[0012] 根据所述第一锁竞争程度信息确定需要进行迁移操作的线程,并将所述线程迁移至确定的目标处理器。
[0013] 一种基于锁的线程管理装置,包括:
[0014] 监控判断单元,用于判断是否需要执行锁行为监控;
[0015] 第一锁竞争程度信息获取单元,用于在所述监控判断单元确定需要执行锁行为监控时,获得第一锁竞争程度信息;
[0016] 线程迁移操作单元,用于根据所述第一锁竞争程度信息获取单元获得的锁竞争程度信息确定需要进行迁移操作的线程,并将所述线程迁移至确定的目标处理器。
[0017] 由上述本发明提供的技术方案可以看出,本发明实施例提供的一种基于锁的线程管理方法及装置,具体采用了通过动态判断决定锁行为监控的执行与否的技术手段,以避免出现因持续执行锁行为监控导致的过量占用系统处理资源的问题。从而可以使得在基于锁的线程管理过程中,系统的处理性能不会受到太大的影响。

附图说明

[0018] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
[0019] 图1为本发明实施例提供的方法的处理过程示意图;
[0020] 图2为本发明实施例提供的判断是否执行锁行为监控的实现过程示意图;
[0021] 图3为本发明实施例提供的基于自旋锁的线程处理过程示意图;
[0022] 图4A为本发明实施例提供的线程切换的处理过程示意图;
[0023] 图4B为本发明实施例提供的调度域划分技术的应用环境示意图;
[0024] 图5A为本发明实施例提供的装置的结构示意图一;
[0025] 图5B为本发明实施例提供的装置的结构示意图二;
[0026] 图5C为本发明实施例提供的装置的结构示意图三。

具体实施方式

[0027] 下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
[0028] 本发明实施例,可以实现动态决定是否启动锁行为监控,并在监控过程中根据锁竞争程度信息动态地判断是否进行线程迁移,从而克服了现有技术存在的问题。
[0029] 下面将结合附图对本发明实施例作进一步地详细描述。
[0030] 本发明实施例提供的一种基于锁的线程管理方法,如图1所示,具体可以包括:
[0031] 步骤11,判断是否需要执行锁行为监控,如果需要,执行步骤12,以执行相应的锁行为监控操作,否则,执行步骤13;
[0032] 相应的判断是否需要执行锁行为监控的步骤可以包括以下任一种方式:
[0033] 方式一:获取预定时间段内的锁竞争参数信息,并根据该锁竞争参数信息获得第二锁竞争程度信息,再根据所述第二锁竞争程度信息判断是否需要执行锁行为监控,若该第二锁竞争程度信息指示当前锁竞争达到预定程度,则确定需要执行锁行为监控;这种方式可以设定为预定时间间隔重复执行或指定的时间点重复执行,即以预定时间间隔重复采用该方式一或者在指定的时间点重复执行该方式一,以执行相应的判断是否需要执行锁行为监控的步骤;
[0034] 方式二:获取预定时间段内的锁竞争参数信息,并根据锁竞争参数信息确定锁行为监控的执行时间,再根据该执行时间及当前时间信息判断是否执行锁行为监控,若当前时间信息与所述执行时间一致,则确定需要执行锁行为监控;这种方式可以设定为预定时间间隔重复执行或指定的时间点重复执行,或者,也可以在首次确定了锁行为监控的执行时间后,在每次到达下一次锁行为监控的执行时间时重复执行该方式二,以执行相应的判断是否需要执行锁行为监控的步骤;
[0035] 方式三:获取预定时间段内的锁竞争参数信息,并根据锁竞争参数信息确定执行锁行为监控需要经过的时间片跳跃轮数,以根据相应的时间片跳跃轮数判断是否执行锁行为监控,若当前经过的时间片轮数达到所述执行锁行为监控需要经过的时间片跳跃轮数,则确定需要执行锁行为监控;这种方式可以设定为预定时间间隔重复执行行或指定的时间点重复执行,或者,也可以在首次确定了需要执行锁行为监控的时间片后,在每次到达下一次需要执行锁行为监控的时间片时重复执行该方式三,以执行相应的判断是否需要执行锁行为监控的步骤;
[0036] 在上述三种方式中,相应的指定的时间点重复执行具体可以但不限于包括:在本次执行判断是否需要执行锁行为监控的步骤时指定下一次重复执行的时间点,例如,根据获取的锁竞争参数信息指定下一次重复执行的时间点,即确定相应的指定的时间点。
[0037] 其中,上述处理过程中的锁竞争参数信息可以但不限于包括:开始尝试持有锁的时间和成功获得锁时的时间,线程被调度到处理器上开始执行的时间和线程所在的处理器被其他线程抢占离开处理器的时间,以及获取锁的时间和释放锁的时间中的至少一项。
[0038] 其中,相应的第二锁竞争程度信息可以包括但不限于:锁等待时间、锁持有时间和线程在当前时间段内的实际执行时间中的至少一项;相应的锁等待时间是根据开始尝试持有锁时的时间和成功获得锁时的时间确定,锁持有时间是根据获取锁的时间和释放锁的时间确定,相应的线程在当前时间段内的实际执行时间是指线程被调度到处理器上开始执行的时间与线程所在的处理器被其他线程抢占离开处理器的时间之间的时间间隔。
[0039] 步骤12,若根据步骤11的判断确定需要执行锁行为监控,则记录第一锁竞争程度信息,并执行步骤14;
[0040] 其中,相应的第一锁竞争程度信息可以包括但不限于:锁等待时间、锁持有时间和线程在当前时间段内的实际执行时间中的至少一项;且该第一锁竞争程度信息与上述第二锁竞争程度信息可以为相同的信息,也可以为不同的信息,例如,第一锁竞争程度信息可以采用锁等待时间,而第二锁竞争程度信息可以采用线程在当前时间段内的实际执行时间,或者,第一锁竞争程度信息和第二锁竞争程度信息均采用锁等待时间;
[0041] 步骤13,若判断确定不需要执行锁行为监控,则本次操作过程结束;
[0042] 需要说明的是,若在该步骤之前相应的锁行为监控操作一直处于执行状态,则该步骤中还包括停止锁行为监控操作的处理。
[0043] 步骤14,根据记录的第一锁竞争程度信息确定需要进行迁移操作的线程;
[0044] 步骤15,将需要进行迁移操作的线程迁移至确定的目标处理器;
[0045] 在该步骤中,相应的目标处理器可以通过下述步骤确定:
[0046] 确定需要进行迁移操作的线程所处于的调度域,并在该确定的调度域内,选择确定该线程对应的目标处理器,即在迁移过程中基于调度域选择将迁往的处理器,从而可以避免竞争同一类锁的处于不同调度域的线程被迁移到同一组CPU或逻辑CPU上,导致在负载平衡的过程中,影响系统的性能。
[0047] 本发明实施例中,为保证在调度域内能够满足线程处理操作,可以根据当前线程的锁竞争程度调整当前线程所在的调度域,具体的调整方式可以包括:
[0048] 判断当前线程的锁竞争程度是否超过预定值,若是,则提高该线程对应的负载平衡级别,否则,降低该线程对应的负载平衡级别,其中,不同的负载平衡级别对应着不同的调度域,且负载平衡级别越高则线程所处于的调度域包含的处理器越多。从而使得在迁移的过程中,能够基于调度域感知能力实现负载平衡,以提高系统的处理性能。
[0049] 通过上述处理过程,可以在多核平台上,可以基于锁对线程进行合理地管理,从而保证系统的的扩展性,使得随着核数的增加,系统的性能仍然能够得到保证,并可以避免产生锁震荡,即避免占用CPU较长时间。
[0050] 下面将以上述步骤11中的方式三提供的判断是否需要执行锁行为监控的实现方式为例,对步骤11的具体实现过程进行描述,如图2所示,相应的判断否需要执行锁行为监控的步骤具体可以包括:
[0051] 步骤21,在当前轮时间片内,当前线程判断上一轮时间片内是否执行了锁行为监控,若是,则实行步骤22,否则执行步骤26。
[0052] 步骤22,计算确定上一轮时间片的锁竞争程度信息,并判断锁竞争程度信息指示的锁竞争程度是否大于预设的阈值,若是,则执行步骤23,否则执行步骤24。
[0053] 步骤23,确定上一轮时间片的锁竞争程度大于预设的阈值,设置锁行为监控时间片跳跃轮数为0,然后执行步骤25;
[0054] 其中,相应的锁行为监控执行时间片跳跃轮数,用于记录从下一个时间片开始计算,需要跳过多少轮时间片,才执行锁行为监控,初始值为0。
[0055] 步骤24,确定上一轮锁竞争程度不大于预设的阈值,则调整相应的锁行为监控时间片跳跃轮数;
[0056] 具体地,判断锁行为监控时间片跳跃轮数是否为0,若为0,则设置锁行为监控时间片跳跃轮数为1;若锁行为监控时间片跳跃轮数大于0且小于128(该值是可变的,用户可以根据时间情况设定,可以为2的幂次方),则设置锁行为监控时间片跳跃轮数为原来的2倍;若锁行为监控时间片跳跃轮数不小于128,则设置锁行为监控时间片跳跃轮数为128,之后执行步骤21。
[0057] 步骤25,设置锁行为监控标志位,根据该标志位,在本轮时间片内将执行锁行为监控,在完成锁行为监控后,清除锁行为监控标志位,并在下轮时间片重复执行步骤21;
[0058] 在该步骤中,还需要,还设置时间片轮数变量为零,以便于重新统计经过的时间片轮数,作为后续是否执行锁行为监控的判断依据;相应的时间片轮数变量,用于记录自从上次锁行为检测后,已经运行了多少轮时间片,初始值为0。
[0059] 步骤26:判断时间片轮数变量记录的值与相应的锁行为监控执行时间片跳跃轮数是否一致,如果是,则设置锁行为监控时间片跳跃轮数为0,并执行步骤25,否则,将时间片轮数变量加1,即在本轮时间片不执行锁行为监控,而在下轮时间片重复执行步骤21。
[0060] 需要说明的是,在应用本发明实施例的系统中,默认在线程启动时,均需要执行相应的锁行为监控操作,之后,在后续的时间片便可以执行上述步骤21及后续过程对是否执行锁行为监控进行判断处理。
[0061] 通过上述处理过程,可以合理地启动相应的锁行为监控操作过程,从而可以避免因在系统中持续执行锁行为监控导致影响系统性能的问题。
[0062] 下面将以线程需要获取某自旋锁为例,对相应的基于锁的线程管理过程进行说明。具体地,如图3所示,相应的处理过程可以包括:
[0063] 步骤31,判断线程的迁移标志是否置位,如果置位,则表示需要对该线程进行迁移操作,执行步骤32,否则执行步骤33;
[0064] 在该步骤中,相应的线程的迁移标志是由之前执行的锁行为监控过程决定是否置位的,即若之前执行的锁行为监控过程根据锁竞争程度信息确定该线程需要进行迁移操作,则将该线程的迁移标志置位。
[0065] 步骤32,将该线程迁往已经确定的ID(标识)号为to_cpu(目标CPU)的CPU(处理器),并执行步骤33;
[0066] 步骤33,当前线程判断是否需要执行锁行为监控,如果需要,则执行步骤34,否则,执行步骤35;
[0067] 在该步骤中,具体可以采用以下任一方式实现:
[0068] (1)获取预定时间段内的锁竞争参数信息,并根据该锁竞争参数信息确定第二锁竞争程度参数信息,再根据该第二锁竞争程度参数信息判断是否需要执行锁行为监控,若该第二锁竞争程度信息指示当前锁竞争达到预定程度,则确定需要执行锁行为监控;例如,相应的预定时间段内的锁竞争参数信息可以为过去几个时间片的锁竞争参数信息;
[0069] (2)若之前确定了锁行为监控的执行时间,则在当前时间信息与锁行为监控的执行时间一致,则确定需要执行锁行为监控;该锁行为监控的执行时间可以根据预定时间段内获取的锁竞争参数信息确定,例如,若该锁竞争参数信息指示当前锁竞争程度较高,则可以将锁行为监控的执行时间与当前时间之间的间隔时间设置的小一些,否则,可以将相应的间隔时间设置的大一些;执行锁行为监控需要经过的时间片跳跃轮数,以根据相应的时间片跳跃轮数判断是否执行锁行为监控,若当前经过的时间片轮数达到所述执行锁行为监控需要经过的时间片跳跃轮数,
[0070] (3)若之前确定执行锁行为监控需要经过的时间片跳跃轮数,则当前经过的时间片轮数达到所述执行锁行为监控需要经过的时间片跳跃轮数,便确定需要执行锁行为监控;该执行锁行为监控需要经过的时间片跳跃轮数具体可以根据预定时间段内获取的锁竞争参数信息确定;
[0071] 通过上述三种方式中的任一种方式可以决定是否启动锁行为监控操作,或者,也可以在执行锁行为监控操作的过程中决定是否停止锁行为监控操作;
[0072] 具体地,在该步骤中,可以采用以上任一方式判断是否需要执行锁行为监控,或者,也可以在采用以上任一方式判断是否需要执行锁行为监控后设置相应的锁行为监控标志位,以便于在该步骤中可以直接根据相应的锁行为监控标志位判断是否需要执行锁行为监控;
[0073] 步骤34,记录当前时间作为第一时间,并执行步骤35;
[0074] 步骤35,获取自旋锁,并执行步骤36;
[0075] 步骤36,判断是否执行锁行为监控,如果是,则执行步骤37,否则,执行步骤38;
[0076] 步骤37,获取当前时间作为第二时间,将该第二时间与步骤34记录获得的第一时间比较,计算锁等待时间,并执行步骤38;
[0077] 在该步骤中,对于计算获得的锁等待时间决定是否该锁的信息记录到数组lock_info中,数组lock_info用于记录当前线程执行过程中锁等待时间最长的若干锁信息;
[0078] 步骤38,执行临界区操作,即获取自旋锁的当前线程执行该自旋锁对应的操作,之后执行步骤39;
[0079] 步骤39,释放自旋锁,并执行步骤310;
[0080] 步骤310,判断是否需要执行锁行为监控(如判断锁行为监控标志位是否置位),如果是,则确定需要执行锁行为监控,即执行步骤311,否则执行步骤312;
[0081] 在该步骤中,可以直接利用33的判断结果,或者,也可以通过相应的锁行为监控标志位确定是否需要执行锁行为监控。
[0082] 步骤311,获取当前时间,与步骤37获得的第二时间比较,计算锁持有时间,并决定是否该锁的信息记录到数组lock_info中,之后执行步骤312;
[0083] 其中,数组lock_info用于记录当前线程执行过程中锁持有时间最长的若干锁信息。
[0084] 步骤312,判断线程的迁回标志是否置位,如果置位,则执行步骤313,否则,锁行为监控和线程迁移流程结束;
[0085] 步骤313,将线程迁回原来的CPU(即ID为from_cpu的CPU),锁行为监控和线程迁移流程结束。
[0086] 基于上述处理过程可以在线程获取自旋锁的过程中,根据针对是否需要执行锁行为监控的判断结果决定是否执行相应的锁行为监控,而不是持续地对相应的自旋锁进行监控,从而可以避免监控过程大量地占用系统的处理资源,使得系统的处理性能不会因锁行为监控的执行而受到较大影响。
[0087] 下面将以在线程进行上下文切换的过程中实现基于锁的线程管理的实现过程为例进行说明。假设需要从线程A切换至线程B,则将由线程A对是否继续执行锁行监控,以及负载平衡的级别是否满足需求进行决策,如图4A所示,具体可以包括:
[0088] 步骤41,当前线程,即线程A记录当前时间片的结束时间,即线程A所在的处理器被其他线程抢占离开处理器的时间,并计算当前时间片的实际长度,即根据之间记录的线程A被调度到处理器上开始执行的时间,以及该线程A所在的处理器被其他线程抢占离开处理器的时间确定线程A在当前时间段内的实际执行时间,之后执行步骤42;
[0089] 步骤42,确定是否启动锁行为监控,如果需要启动锁行为监控,则启动锁行为监控,通过锁行为监控获取锁竞争参数信息,进而可以根据相应的锁竞争参数信息确定用于判断是否进行线程迁移的锁竞争程度信息(如之前描述的第二锁竞争程度信息),否则不启动锁行为监控,之后执行步骤43;
[0090] 步骤43,判断当前线程的第一锁竞争程度信息确定的锁竞争程度是否大于竞争程度阈值,如果是,则设置迁移位,在下一个时间片内进行线程迁移操作,之后执行步骤44,否则,执行步骤47;
[0091] 其中,在该步骤中,相应的第一锁竞争程度信息可以利用数组lock_info中记录的锁等待时间总和或平均或加权平均计算获得,或者,利用数组lock_info中记录的锁持有时间的总和或平均或加权平均计算获得;
[0092] 步骤44,判断当前线程的锁竞争程度是否大于负载平衡调整阈值,如果是,则执行步骤45,否则,执行步骤46。
[0093] 步骤45,提高负载平衡级别,即将负载平衡级别设置为原来负载平衡级别对应调度域的上层调度域,以扩大该线程可以运行的核的数目(即线程可以运行的CPU或逻辑CPU的数目),并执行步骤47;
[0094] 步骤46,降低负载平衡级别,即将负载平衡级别设置为原来负载平衡级别对应调度域的低一级的调度域,以降低该线程可以运行的CPU或逻辑CPU的数目,如果当前为基本调度域,则不再调整,之后执行步骤47;
[0095] 步骤47,执行线程切换操作,即将线程A换出,线程B换入,以实现线程的上下有切换处理,之后执行步骤48;
[0096] 步骤48,为线程B记录时间片的起始值,即线程B被调度到处理器上开始执行的时间,用于计算当前时间片的实际执行时间,该处理流程结束。
[0097] 为便于对上述步骤45和步骤46中提及的负载平衡级别的理解,下面将对负载平衡级别的概念进行举例说明。具体地,以4节点,且每节点包括两个物里CPU,每个物理CPU上包含4个逻辑CPU的NUMA(Non-Uniform Memory Access,非均匀存储器访问)架构为例,则相应的负载平衡级别的可以但不限于划分为:基本调度域、一级调度域和二级调度域,各个调度域的概念如下:
[0098] 基本调度域,可以为属于一个物理CPU的所有逻辑CPU,对应于最低负载平衡级别,例如,每一个物理CPU均可以称为一个基本调度域;
[0099] 一级调度域,可以为属于一个NUMA上的所有逻辑CPU,对应的负载平衡级别(对应地可以称为一级负载平衡等级)比最低负载平衡级别高一级,例如,每一个节点可以成为一个一级调度域;
[0100] 二级调度域,可以为与当前线程所运行的节点距离为1跳的所有节点上的逻辑CPU,对应的负载平衡级别为二级负载平衡等级,例如,如图4B所示,节点node1和与之有1跳的节点node 0及node 2是可以组成一个二级调度域,同理节点node 1,2,3、节点node 2,3,0、节点node 0,1,3也可以组成一个二级调度域;
[0101] 还可以按照与NUMA架构包含的节点距离的远近组成不同等级的调度域,如三级调度域、四级调度域等等;
[0102] 最高级调度域,可以包括当前系统的所有的逻辑CPU。
[0103] 需要说明的是,上述负载平衡级别的划分只是一个示例,并不构成对本发明实施例的唯一限定。本领域技术人员知晓本发明实施例中采用其他负载平衡级别的划分方式同样可以满足相应的基于调度域的负载平衡需求。而且,上述说明中仅以NUMA架构为例,显然,本发明实施例也可以应用于其他有类似需求的架构中。
[0104] 通过上述实施例的实现可以看出,由于采用了动态决定是否锁行为监控的手段,从而可以降低系统的性能开销。而且,在锁感知线程迁移中,通过调度域感知的负载平衡策略,有效降低了线程在不同NUMA节点间迁移的性能开销。
[0105] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
[0106] 本发明实施例还提供了一种基于锁的线程管理装置,其具体实现结构如图5A所示,可以包括以下处理单元:
[0107] 监控判断单元51,用于判断是否需要执行锁行为监控,即用于根据当前的锁竞争情况动态判断是否执行锁行为监控;
[0108] 锁竞争程度信息记录单元52,用于在监控判断单元51确定需要执行锁行为监控时,记录锁竞争程度信息;
[0109] 线程迁移操作单元53,用于根据锁竞争程度信息记录单元52记录的锁竞争程度信息确定需要进行迁移操作的线程,并将所述线程迁移至确定的目标处理器。
[0110] 可选地,如图5B所示,根据监控判断单元51判断是否需要执行锁行为监控所采用的技术手段的不同,该装置还可以包括以下处理单元:
[0111] 锁竞争参数信息获取单元54,用于获取预定时间段内的锁竞争参数信息;以及第二锁竞争程度信息获取单元55,用于根据锁竞争参数信息获取单元54获取的锁竞争参数信息获得第二锁竞争程度信息,并将第二锁竞争程度信息提供给监控判断单元51,以作为监控判断单元51判断是否需要执行锁行为监控的依据,若监控判断单元51确定相应的第二锁竞争程度信息指示当前锁竞争达到预定程度,则确定需要执行锁行为监控,否则,不需要执行锁行为监控;
[0112] 或者,
[0113] 监控时间获取单元56,用于获取预定时间段内的锁竞争参数信息,并根据该锁竞争参数信息确定锁行为监控的执行时间,再将锁行为监控的执行时间提供给上述监控判断单元51,以作为监控判断单元51判断是否执行锁行为监控的依据,若监控判断单元确定当前时间信息与该锁行为监控的执行时间一致,则确定需要执行锁行为监控,否则,不需要执行锁行为监控;
[0114] 或者,
[0115] 监控时间片轮数确定单元57,用于获取预定时间段内的锁竞争参数信息,并根据该锁竞争参数信息确定执行锁行为监控需要经过的时间片跳跃轮数,以作为监控判断单元51判断是否执行锁行为监控的依据,若监控判断单元51确定当前经过的时间片轮数达到执行锁行为监控需要经过的时间片跳跃轮数,则确定需要执行锁行为监控,否则,不需要执行锁行为监控。
[0116] 需要说明的是,上述锁竞争参数信息可以但不限于包括:开始尝试持有锁的时间和成功获得锁时的时间,线程被调度到处理器上开始执行的时间和线程所在的处理器被其他线程抢占离开处理器的时间,以及获取锁的时间和释放锁的时间中的至少一项;其中,根据开始尝试持有锁的时间和成功获得锁时的时间可以确定相应的锁等待时间,根据线程被调度到处理器上开始执行的时间和线程所在的处理器被其他线程抢占离开处理器的时间可以确定线程在当前时间段内的实际执行时间,根据获取锁的时间和释放锁的时间可以确定相应的锁持有时间;
[0117] 上述第一锁竞争程度信息可以但不限于包括:锁等待时间、锁持有时间和线程在当前时间段内的实际执行时间中的至少一项;相应的第二锁竞争程度信息可以但不限于包括:锁等待时间、锁持有时间和线程在当前时间段内的实际执行时间中的至少一项;而且,相应的第一锁竞争程度信息和第二锁竞争程度信息可以相同,也可以不同。
[0118] 可选地,该装置还可以包括目标处理器确定单元58,用于确定需要进行迁移操作的线程所处于的调度域,并在该确定的调度域内,选择确定该线程的目标处理器(如CPU或逻辑CPU等),以便于线程迁移操作单元53将相应的线程迁移至在确定的调度域内所确定的目标处理器。
[0119] 优选地,为便于上述目标处理器确定单元58为当前线程选择确定合理的目标处理器,则该装置还可以包括:
[0120] 锁竞争程度判断单元59,用于判断当前线程的锁竞争程度是否超过预定值;
[0121] 调度域调整单元510,用于在上述锁竞争程度判断单元59确定当前线程的锁竞争程度超过预定值时,提高该线程对应的负载平衡级别,否则,降低该线程对应的负载平衡级别,其中,不同的负载平衡级别对应着不同的调度域,且负载平衡级别越高则线程所处于的调度域包含的处理器越多;
[0122] 通过对该线程对应的负载平衡级别的调整,可以使得上述目标处理器确定单元58可以在合理的调度域内为需要迁移的线程确定相应的目标处理器。
[0123] 需要说明的是,上述装置实施例中各个处理单元所实现的功能的具体实现方式在之前的实施例中已经描述,且本领域技术人员知晓之前实施例中描述的各功能的具体实现方式也适用于该装置中,故在此不再重复描述。
[0124] 通过上述装置实施例的实现可以看出,由于该装置采用了动态决定是否锁行为监控的技术手段,从而可以降低系统的性能开销,改善系统的性能。而且,在锁感知线程迁移中,该装置还可以通过调度域感知的负载平衡策略,来效降低线程在不同处理器节点间迁移的性能开销。
[0125] 以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。