用于在被争夺的互斥锁上被动态限定的自旋线程的方法与系统的制作方法

文档序号:6411728阅读:118来源:国知局
专利名称:用于在被争夺的互斥锁上被动态限定的自旋线程的方法与系统的制作方法
技术领域
本发明涉及一种改进的数据处理系统,更具体地,涉及一种用于多进程协调的方法与装置。再具体地讲,本发明提供了一种用于在任务管理或控制过程中使用互斥锁的进程调度或资源分配的方法与装置。
背景技术
现代操作系统支持多道程序,由此看起来在具有单一的中央处理单元(CPU)或者可能在对称多处理器(SMP)机器中的多个CPU的单一计算设备上有多个程序并发执行。通过同时使用串行化执行来达到并发执行,也被称为“时间分片”设备的操作系统允许多个程序中的一个在某限定时间段(即时间片)内独占地运行,然后跟随着多个程序中另一个不同的程序独占执行所使用的时间段。因为在程序之间的切换发生得很快,所以看起来程序是并发运行的,虽然实际上它们是串行运行的。当完成对于一个程序的时间片时,该程序被置入挂起或“睡眠”状态,并且另一程序“苏醒”并开始运行。
提高单一程序或单一进程的性能的一种方法是将该程序或进程分为指令路径,经常被称为“线程”,这些执行路径看起来是并发执行的。这样的程序或进程一般被称为“多任务”或“多线程”;操作系统为每个线程提供时间片,在该时间片内其具有对CPU的独占使用。操作系统一般提供内置的机制用来在并发程序和/或线程之间以非常迅速与高效的方式进行切换;对于多线程某些类型的CPU提供对操作系统的直接的硬件支持。因为本发明的思路同样适用于并发线程和并发程序,其可能包括单一线程或多个线程,所以所使用的名词“线程”可以指非多线程程序或者在多线程环境下的一个线程。
当线程执行时,它们必然需要访问数据处理系统中的资源,诸如存储器、数据结构、文件、或其他资源。用来被多个线程共享的资源并且以如下方式共享要保护包含在该资源中或通过该资源传递的数据的完整性;作到这一点的一种方式是通过对竞争共享资源的线程的串行化执行。当第一线程已经在使用资源时,需要该资源的第二线程必须等待,直至该资源不再被使用,这一般作为第一线程已经成功完成其对该资源的使用的结果而发生。
操作系统一般提供多种机制来协调多个线程对共享资源的使用。虽然应用程序开发者能够创建其自己的特定机制,以确保对共享资源的串行化访问,但是应用程序开发者一般使用由操作系统提供或者在标准软件库中提供的机制,以将共享资源的控制逻辑嵌入多个线程之中。使用操作系统特有的机制是有利的,这是因为其允许操作系统将有关对于资源的竞争的信息集成到其时间分片功能之中。因此,操作系统根据其需求及其对资源的竞争分配时间片给线程,而不是通过使用严格周期性的时间片。
用来串行化对共享资源的访问的常用机制是互斥锁,其为具有两个状态的简单锁锁定与未锁定。该锁一般以通过软件子例程或例程标准库中的模块而创建、销毁、或修改的数据对象或数据结构来实现。互斥锁可以逻辑地关联于共享资源,从而成功锁定该互斥锁的线程被称为互斥锁的当前所有人;只有占有特定互斥锁的线程进入访问与该特定互斥锁相关联的共享资源,并且只有占有该特定互斥锁的线程解锁该特定互斥锁。因此,访问共享资源的线程内的临界代码部分被经锁定的互斥锁的调用以及解锁该同一互斥锁的调用所包围。如果线程尝试锁定互斥锁并且失败,则在其进入访问该共享资源的临界代码部分之前,必须等待直至其能够锁定该互斥锁。如果互斥锁分配在由协调的进程所共享的存储器之内,则互斥锁可以用来在同一进程内或者跨越多个进程来使多个线程同步。
在不能获取互斥锁之后线程等待互斥锁的方式取决于实现互斥锁机制的方式。广泛使用的锁有三种阻塞锁(blocking lock)、自旋锁(spin lock)、以及阻塞锁与自旋锁的某种组合类型。如果已经获取了互斥锁,并且另一线程请求锁定该互斥锁,则实现为阻塞锁的互斥锁使该等待线程不再是可运行的或者使其挂起,即进入“睡眠”。相反,自旋锁不将等待线程置入睡眠。而是等待中的线程执行循环,由此反复请求该锁,直至其被当前拥有该互斥锁的线程释放;该循环可以包括空的迭代循环,即“忙循环”或“忙等待”,其对一变量进行增量或减量,使得该线程不会马上重新请求该互斥锁,而是等待一段时间,该时间取决于迭代循环的长度。
与阻塞锁或自旋锁不同,互斥锁经常被实现为具有超时退出的自旋锁,其为组合了阻塞锁的特点与自旋锁的特点的锁。具有超时退出的自旋锁自旋(spin)一段有限的时间,同时允许线程尝试再次获得该锁;如果该有限的时间段过期了而没有获得该锁,则该线程阻塞。该超时退出的时间段一般通过在忙等待循环中执行固定数目的迭代来控制。除了锁定例程与解锁例程之外,软件库还经常包含“试锁”子例程,其中如果未获取互斥锁,则控制被返回到请求子例程,即不会强迫请求例程以等待互斥锁变为可用。
阻塞与自旋的动作具有其优缺点。阻塞迅速地挂起等待线程的执行,当时阻塞的动作可能会挂起不久将获得锁的线程,并且挂起线程意味着相对不小的费用,例如,必须保存该线程的执行上下文。在另一方面,自旋锁消耗资源,诸如CPU时间与存储器高速缓存线路,当时如果合理地选择自旋时间段的长度,则等待线程经常会相对较快地获得互斥锁,由此使得自旋操作能够比阻塞操作消耗较少的计算资源。
在自旋与阻塞之间的选择取决于许多因素,尤其是线程在设备上执行的计算环境。因此,以下做法是有利的动态地调整线程在互斥锁的自旋与阻塞之间选择的方式。尤其有利的是为线程提供以下能力当线程在被争夺的互斥锁的自旋与阻塞之间选择时,考虑被争夺的互斥锁的当前特点。

发明内容
提供了一种在数据处理系统中管理互斥锁的方法。对于每个互斥锁,保持对于正在自旋同时等待获取互斥锁的线程的数目的自旋线程计数。如果线程尝试获取锁定的互斥锁,则根据限制性条件以及在尝试获取过程中正在自旋的线程的数目,线程进入自旋状态或睡眠状态。另外,在已经在互斥锁上睡眠之后线程在互斥锁上自旋所需的相对时间长度,可以用来调节允许在互斥锁上自旋的线程的数目。


被认为是本发明特性的体现本发明的新颖性的技术特征在权利要求中列出。然而,通过参照附图同时阅读以下对本发明优选实施方式的描述,可以更好地了解本发明自身、以及优选使用模式、进一步的目标及其优点,其中图1A显示数据处理系统的一般网络,每个处理系统都可以实现本发明;图1B显示了可能用于数据处理系统内的一般计算机体系结构,其中可以实现本发明;图2A显示在使用互斥锁的一般多线程应用程序内的组件的逻辑组成的方框图;图2B显示一般数据处理系统上的组件的逻辑组成的方框图,该数据处理系统支持执行使用由操作系统内核支持的互斥锁的多线程应用程序;图3显示自旋锁互斥锁的一般实现;图4显示根据本发明实施方式的、已经被扩展以包括用于支持自适应互斥锁的信息的互斥锁数据结构的方框图;图5A显示根据本发明实施方式的、通过一流程线程能够锁定处于解锁状态的互斥锁同时该线程可能转移到其他处理的过程的流程图;图5B显示运行块的流程图,在该运行块中可在经锁定的互斥锁上自旋的线程的数目由可配置门限值限制;图5C显示其中线程在锁定的互斥锁上自旋或忙等待的运行块的流程图;图5D显示运行块的流程图,其中线程在经锁定的互斥锁上睡眠;图5E显示根据本发明实施方式的运行块的流程图,其中当动态调整对于可以在经锁定的互斥锁上自旋的线程数目的限制值时线程可以获取互斥锁的;图6显示一过程的流程图,其中线程通过该流程来释放自适应互斥锁。
具体实施例方式
一般地,可以包括或涉及本发明的设备包括多种数据处理技术。因此,作为背景,在详细描述本发明之前,将描述分布式数据处理系统之内的硬件与软件组件的一般组成。
现在参照附图,图1A显示数据处理系统的一般网络,其中的每一个都可以实现本发明的一部分。分布式数据处理系统100包含网络101,其为可以用来提供分布式数据处理系统100内连接在一起的各种设备与计算机之间的通信链接的介质。网络101可以包括永久连接,诸如电线或光纤电缆,或者通过电话或无线通信进行的暂时连接。在所示例子中,服务器102与服务器103与存储单元104一起连接到网络101。另外,客户端105-107也连接到网络101。客户端105-107以及服务器102-103可以由各种计算设备代表,诸如大型机、个人计算机、个人数字助理(PDA)等等。分布式数据处理系统100可以包括未显示的其他服务器、客户端、路由器、其他设备、以及对等体系结构。
在所示例子中,分布式数据处理系统100可以包括具有网络101的因特网,代表使用各种协议以相互通信的网络与网关的世界范围集合,诸如轻量目录访问协议(LDAP)、传输控制协议/互连网协议(TCP/IP)、超文本传输协议(HTTP)、无线应用协议(WAP)等等。当然,分布式数据处理系统100也可以包括多个不同类型的网络,诸如(例如)内部网、局域网(LAN)、或广域网(WAN)。例如,服务器102直接支持客户端109与网络110,其包含了无线通信链接。有网络功能的电话111通过无线链接连112接到网络110,并且PDA113通过无线链接114连接到网络110。电话111与PDA113也可以使用适当的技术(诸如“蓝牙”无线技术)直接在其之间通过无线链接115传送数据,以生成所谓的个人区域网络(PAN),或者个人临时网络。以类似的方式,PDA113可以通过无线通信链接116传送数据给PDA107。
本发明可以在多种硬件平台上实现;图1A意为异构计算环境的例子,并不是对于本发明的体系结构上的限制。
现在参照图1B,其中的图显示了数据处理系统(诸如图1A所示)的一般计算机体系结构,其中可以实现本发明。数据处理系统120包含连接到内部系统总线123的一个或更多个中央处理单元(CPU)122,该内部系统总线123互连了随机存取存储器(RAM)124、只读存储器126、以及输入/输出适配器128,输入/输出适配器128支持各种I/O设备,诸如打印机130、磁盘单元132、或其他未显示的设备,诸如音频输出系统等等。系统总线123还连接了通信适配器134,其提供到通信链接136的访问。用户接口适配器148连接各种用户设备,诸如键盘140和鼠标142,或其它未示装置如触摸屏、输入笔、麦克风等等。显示适配器144将系统总线123连接到显示设备146。
本领域技术人员应该理解图1B中的硬件可以根据系统的实现而变化。例如,该系统可以具有一个或更多个处理器,诸如基于IntelPenteium的处理器与数字信号处理器(DSP),以及一种或更多种类型的易失与非易失存储器。除图1B所示的硬件之外,或者替换它们,可以使用其他外围设备。所示的例子并不意味着对本发明的体系结构的限制。
除了能够在各种硬件平台上实现之外,本发明还可以实现于各种软件环境。一般的操作系统可以用来控制在每个数据处理系统中的程序执行。例如,一个设备可以运行Unix操作系统,同时另一设备包含简单的Java运行时环境。代表性的计算机平台可以包括浏览器,其为公知的软件应用程序,用来访问各种格式的超文本文档,诸如图形文件、字处理文件、可扩展标记语言(XML)、超文本标记语言(HTML)、手持设备标记语言(HDML)、无线标记语言(WML)、以及各种其他文件格式与类型。
本发明可以实现在各种硬件与软件平台之上,如上参照图1A与图1B所述,包括对称多处理器(SMP)机器。虽然本发明不需要图1A与1B中所示的所有组件,但是这些部件可以由其中嵌入了本发明的组件使用,例如操作系统、应用程序、或者其他组件。另外,本发明可以实现于其中采用诸如显示设备等各种组件以间接地支持本发明的计算机环境中,例如允许系统管理员配置参数与部件。
然而,更具体地,本发明针对改进的互斥锁,其可以实现于操作系统内、在应用程序内、或者以其他方式实现于数据处理系统内。在更详细地描述该改进互斥锁之前,先描述一般互斥锁的使用。如上所述,应用程序开发者可以创建应用程序特有的互斥锁,如图2A所示,但是应用程序开发者一般采用由操作系统提供或者在标准软件库内提供的机制,如图2B所示。本发明可以各种应用程序特有的或者非应用程序特有的形式实现,而影响本发明的范围。
现在参照图2A,其中的方框图显示了在使用互斥锁的一般多线程应用程序内的组件的逻辑组成。多线程应用程序202包括多个线程,诸如线程204与线程206。与依赖可能由操作系统提供的或者在标准软件库(诸如POSIX的pthread库)内提供的互斥锁函数不同,应用程序可以实现其自己的互斥锁函数208,其由互斥锁数据结构210支持,以针对由组成该应用程序的线程所共享的资源使其自身线程的运行串行化。
现在参照图2B,其中的方框图显示在一般数据处理系统上的组件的逻辑组成,该数据处理系统支持执行使用由操作系统内核支持的互斥锁的多线程应用程序。计算机220支持包含内核级函数222的操作系统,该内核级函数222控制多线程应用程序224与226的运行,多线程应用程序224与226分别包括线程228与230。内核内的线程调度器232使用线程调度器数据结构234确定何时线程运行以及何时挂起线程,线程调度器数据结构234可以包含用来协助管理线程调度任务的数据结构;例如,该数据结构可以包括FIFO(先入先出)队列,诸如与各种线程状态相关联的队列,例如,准备执行队列、睡眠队列、I/O阻塞队列、互斥锁等待队列、或者其他状态。驻留于内核内的互斥锁管理例程236(或者作为以内核级特权运行的内核扩展的例程)提供了以下函数,用来创建、修改、并销毁互斥锁,其在互斥锁数据结构238中得到反映。此后,认为名词“睡眠”等同于任意形式的“挂起”。
现在参照图3,其中显示了自旋锁互斥锁的一般实现。当线程请求获取互斥锁时,开始该过程(步骤302);此后,认为名词“获取”、“保留”、“具有”、“拥有”、或者“锁定”互斥锁是等同的。确定互斥锁是否自由并解锁(步骤304),并且如果否,则检查该线程是否已经通过在该互斥锁上自旋而使用了可配置数量的时间(步骤306)。如果否,则该线程进行忙等待循环(步骤308),即其自旋于循环,同时其等待互斥锁变为可用;如果该线程先前已经通过了步骤302-308,则在该线程通过完成另一忙等待循环来继续进行自旋操作。在自旋一段时间之后,该线程重复步骤302。
如果在步骤304该互斥锁自由,则为该线程锁定该互斥锁(步骤310),并且线程进入访问共享资源(步骤312),而不可能与另一线程冲突并破坏与共享资源相关联的数据的完整性。在线程进行了其对共享资源的操作之后,则该线程就请求释放互斥锁,并且该互斥锁被解锁(步骤314),由此结束该过程。在互斥锁被解锁之后,其他并发执行的线程可以使用该互斥锁。如果如在步骤306所确定的、线程已经通过在互斥锁上自旋而使用了可配置数量的时间,则在该线程在该互斥锁上睡眠(步骤316),例如,通过调用将该进程置入睡眠状态的内核函数。该线程可以睡眠可配置的时间段,或者内核可以具有在互斥锁解锁时唤醒该线程的能力。在任何一种情况下,在线程被唤醒后,该线程再次尝试获取互斥锁。
现在转到本发明,本发明针对用于获取被争夺的互斥锁的过程,其以逐个互斥锁的方式动态适应于当前资源,该当前资源正在被尝试获取被争夺的互斥锁的多个线程消耗。此后余下的附图显示了本发明的各种实施方式。
现在参照图4,其中的方框图显示了根据本发明实施方式的、已经被扩展以包括用于支持自适应互斥锁的信息的互斥锁数据结构。应该注意,在所示互斥锁数据结构中的信息数据项可以以其他数据结构存储,而图4中的互斥锁数据结构只是在逻辑上相关联以支持本发明实施方式的各种信息数据项的逻辑组成的例子;在互斥锁数据结构中可以包括其他信息数据项。
互斥锁数据结构402包含互斥锁404,其为可被反转的数据值反映该互斥锁的锁定与解锁状态。如果互斥锁是锁定的,则锁定线程标识符406表示由操作系统向当前持有该互斥锁的线程分配的线程标识符,即锁定该互斥锁的线程。如果互斥锁是锁定的并且有等待其释放的线程,即在该互斥锁上自旋或睡眠的线程,则等待线程列表408包含正在等待该互斥锁释放的线程的线程标识符。可替换地,等待线程列表408可以包括记录列表,其中每个记录都代表正在该互斥锁上等待的线程,并且每个记录可以包括线程管理信息。
互斥锁数据结构402还包括数据值410,其代表正在该互斥锁上自旋的线程的数目。如果线程在等待互斥锁释放时进入了自旋状态,则增加自旋线程的数目。如果线程获得互斥锁,则线程退出自旋状态,并且减小自旋线程的数目。数据值412表示对于在任意时间可以在等待互斥锁时自旋的线程的数目的门限值。假如达到该限制,则线程不再进入自旋状态同时等待互斥锁,以下将详细描述。在可替换实施方式中,互斥锁数据结构402也可以包括数据值414,其表示后-睡眠互斥锁获取尝试计数门限值;以下参照图5E将详细描述该门限值的使用。
现在参照图5A,其中的流程图显示了根据本发明实施方式的过程,通过该过程线程能够锁定处于解锁状态的互斥锁并且同时可能转移到其他处理。图5A-5E显示可能在线程尝试获取互斥锁时发生的处理的不同部分。图5A中的流程图表示一种初始处理,其可能在线程尝试获取互斥锁时调用例程时发生。从图5A的流程图中,该处理可能转移到在图5B-5E中所示的其他流程图中,但是描绘其他每个流程图使得该处理在图5A中结束。
参照图5A,当进入锁定自适应互斥锁的例程时,开始该过程(步骤502),例如,当从特定线程调用该例程时。在这个例子中,该例程可以被称为“互斥锁管理例程”,其可能作为内核级例程存在,通过特殊的操作系统调用访问该内核级例程,也可能作为只能用特殊特权运行的某种其他类型的例程存在。可替换地,应用程序可能实现本发明的实施方式,在这种情况下,可以将互斥锁管理例程编译到该应用程序的目标代码中。
为了反映线程的最近的状态,例如,出于线程调度器的缘故,设置标志值以指示该线程在互斥锁上等待(步骤504)。也可能初始化各种其他的线程特有的数据值。
然后确定互斥锁是否已经被锁定(步骤506)。如果互斥锁未被锁定,则为该线程锁定该互斥锁(步骤508)。应该注意,步骤508与步骤510应该实现为原子操作,即作为不能被中断的操作;存在各种公知技术来进行针对互斥锁的原子操作。
为了反映线程的当前状态,线程标识符存储在所需要的任意数据结构之中,以指示已经获取该互斥锁的线程的身份(步骤510),然后清除等待标志值以指示该线程不再在该互斥锁上等待(步骤512)。然后,互斥锁管理例程返回执行调用的例程(步骤514),并且结束获取互斥锁的过程。
现在参照图5B,其中的流程图显示了其中可以在经锁定的互斥锁上自旋的线程的数目由可配置门限值限制的运行块。在图5B的流程图中所示的运行块表示可能在图5A的步骤506确定经锁定的互斥锁之后发生的某些处理。
现在参照图5B,在该运行块开始时,确定已经在互斥锁上自旋的线程的数目是否已经达到了最大值(步骤522)。互斥锁管理数据结构可能包含在等待该特定互斥锁时已经进入自旋状态的线程当前总数,并且互斥锁管理数据结构也可以包含互斥锁特有的自旋线程计数门限值,例如,如图4所示。如果已经达到了对于自旋线程的数目的限制,则该过程转移到图5D所示的运行块,使得该线程进入睡眠状态,而不是进入自旋状态。
如果在步骤522确定还没有达到对于自旋线程的数目的限制,则该线程可以进入自旋状态,同时其等待锁定的互斥锁变为可用。然后增加在互斥锁管理数据结构中表示自旋线程的数目的数据值,以反映另一线程已经进入了对于该互斥锁的自旋状态(步骤524)。应该注意,步骤522与步骤524应该实现为原子操作;对于自旋线程计数的检查与更新应该作为单一操作进行,其不能被中断,以防在给定时间两个或更多个线程进行该检查。
然后,确定该互斥锁是否保持锁定(步骤526)。如果是,则该线程在该互斥锁上自旋。该线程可以通过在步骤526进入紧密循环(tight loop)而在互斥锁上自旋;该线程可以反复检查互斥锁是否已被解锁,并且如果否,则该线程立即转移返回步骤526。可替换地,如图5B所示,可以执行更密集的自旋;该线程可以转移到在图5C中所示的运行块,其中该线程执行可配置的忙等待循环。
如果在步骤526确定互斥锁被解锁,这可能在线程已经在互斥锁自旋了一定时间段之后发生,则为该线程锁定互斥锁(步骤528)。再次地,应该注意步骤526与步骤528应该实现为原子操作。在获取互斥锁之后,该线程就不再处于自旋状态。因此,减少在互斥锁管理数据结构中表示自旋线程的数目的数据值(步骤530)。结束该运行块,此后返回图5A中的步骤510。
现在参照图5C,其中的流程图显示了其中线程在锁定的互斥锁上自旋或忙等待的运行块。在图5C中的流程图中所显示的运行块表示可能在图5B的步骤526确定互斥锁被锁定之后发生的某些处理。
现在参照图5C,该运行块开始时设置标志值,以指示该线程在互斥锁上自旋或者忙等待(步骤532),由此反映该线程的最近状态。然后,如果必要,则初始化忙等待循环(步骤534),并且进入、执行、并完成该忙等待循环(步骤536)。例如,该忙等待循环可以包含空迭代循环,其不进行除检查该锁的状态以及可选地尝试获取该锁之外任何实际上有用的工作。因为该线程已经完成了忙等待循环,所以清除表示该线程在互斥锁上自旋或者忙等待的标志值(步骤538),由此反映该线程的最近状态。结束该运行块,此后返回图5B中的步骤526。在可替换实施方式中,图5C中所示的忙等待循环可以包括可配置的忙等待超时退出,其限制线程所进行的忙等待的数量,并且如果该线程达到了这一限制,在该线程进入睡眠状态。
现在参照图5D,其中的流程图显示了其中线程在经锁定的互斥锁上睡眠的运行块。在图5D中的流程图内所显示的运行块表示可能在互斥锁在图5B的步骤522已经确定已经达到自旋线程的最大数目之后所发生的某些处理。
现在参照图5D,该运行块开始时设置标志值,以指示该线程正在互斥锁上睡眠(步骤542),因此反映该线程的最近状态。然后,该线程进入睡眠状态一段时间(步骤544)。该线程可能睡眠一预先设置的时间段,但优选地,该线程睡眠直至被来自另一线程的目标唤醒信号或者以其他方式(例如通过线程调度器的动作)所唤醒。
在某个时间点上,线程退出睡眠状态(步骤546)。因为该线程已经完成了睡眠循环,所以清除表示该线程正在互斥锁上睡眠的标志值(步骤548),由此反映该线程的最近状态。
作为可选的步骤,可以设置后-睡眠(Post-sleep)标志以指示该线程已经在互斥锁上睡眠,同时等待获取该互斥锁(步骤550);当线程开始进入互斥锁管理例程尝试获取互斥锁时(例如在图5A的步骤502),该后-睡眠标志可以已经被初始化。下面针对图5E中所示的本发明的可替换实施方式将更详细地描述该后-睡眠标志的意义。结束该运行块,此后返回图5B中的步骤522。
再次参照图5B,使用本发明,线程根据互斥锁的当前计算环境进行各种动作。更具体地,显然当线程尝试获取互斥锁时,其行为取决于已经正在互斥锁上自旋的线程的当前数目以及对于在任意给定时间允许在互斥锁上自旋的线程的最大数目的限制值或门限值。通过这种方法,本发明保证了足够数目的线程在互斥锁上自旋,以减少获取互斥锁时的延迟,即如果多于一个的线程正在互斥锁上等待,则尽可能快地获取互斥锁。另外,减少了外来的自旋,这是因为只允许有限数目的线程在互斥锁上自旋,而其他线程被置入睡眠。
对于大多数工作负荷来说,自旋线程计数门限可以设置为值一,从而在任意给定时间只有单独一个线程在互斥锁上自旋。然而,可能存在这种情况需要将该门限设置为更大的值,以避免成为瓶颈的串行化唤醒。例如,如果对互斥锁争夺得很激烈,并且该互斥锁被保持了短于线程睡眠与苏醒所需的时间段的一段时间,则线程将进入睡眠,否则此时如果其自旋的话其会迅速获取该互斥锁。在这种场景下,最好有多于一个的自旋线程。
在可替换实施方式中,对于自旋线程数目的门限限制是动态可调整的。当在线程已经在互斥锁上睡眠之后该线程开始在互斥锁上自旋时,在其获取该互斥锁之前,该线程监视其自旋的时间长度。如果在苏醒后该线程相对较快地获取了互斥锁,则可以增加自旋线程计数门限,由此确保足够数目的线程在互斥锁上自旋,从而尽可能快地在互斥锁释放之后获取它。相反,如果在苏醒之后线程自旋过长,则可以减少自旋线程计数门限,然而自旋线程计数门限将具有下限制值一。通过这种方式,该互斥锁在运行时自适应于其环境的计算行为。
现在参照图5E,其中的流程图显示了根据本发明实施方式的运行块,其中当动态调整对于可以在经锁定的互斥锁上自旋的线程数目的限制值时线程可以获取互斥锁。在图5E中的流程图中所显示的该运行块表示在图5A的步骤506互斥锁被确定为锁定之后可能发生的某些处理。图5E与图5B有些类似;图5E中的某些步骤与图5B中的某些步骤相同,并且图5E中的处理可以转移到图5C与图5D中的运行块。然而,图5E表示图5B中所示运行块的可替换实施方式;当在图5A的步骤506处过程转移时,可以执行图5B或图5E中的运行块,但不能两者都执行。
现在参照图5E,当该运行块开始时,确定已经正在互斥锁上自旋的线程的数目是否达到了最大值(步骤552)。如果已经达到了对于自旋线程的数目的限制,则该处理转移到图5D中所示的运行块,从而该线程进入睡眠状态,而不是进入自旋状态。
如果在步骤552处,确定没有达到对自旋线程的数目的限制,则该线程可以进入自旋状态,同时其等待经锁定的互斥锁变为可用。然后,增加在互斥锁管理数据结构中表示自旋线程数目的数据值,以反映另一线程已经进入了该互斥锁上的自旋状态(步骤554)。再次地,应该注意步骤552与步骤554应该实现为原子操作。
在确定互斥锁是否保持锁定之前,即在尝试实际获取互斥锁的操作之前,增加表示线程特有的、互斥锁获取尝试计数的数据值(步骤556)。该互斥锁获取尝试计数为线程特有的数据值;其可以逐线程的方式作为线程执行上下文中的局部变量来被维持。换而言之,该互斥锁获取尝试计数可以不是在互斥锁特有的互斥锁管理数据结构中所保持的线程全局数据值。当线程开始进入互斥锁管理例程以尝试获取互斥锁(例如图5A中的步骤502)时,可以初始化该互斥锁尝试计数;可初始化表示计数的该数据值为值一,以便该值准确地反映在图5A步骤506处对于获取互斥锁的初始尝试。以下将更详细地描述该互斥锁获取尝试计数的使用。
然后确定互斥锁是否保持锁定(步骤558)。如果是,则线程在互斥锁上自旋。线程可以通过在步骤556与558进入紧密循环而在自旋锁上自旋;该线程可以反复检查互斥锁是否已经解锁,并且如果否,则线程立即转移返回步骤556。可替换地,如图5E所示,可以进行更密集的自旋;线程可以转移到图5C所示的运行块,其中线程执行可配置的忙等待循环。
如果在步骤558确定互斥锁为解锁,这可能在线程在互斥锁上自旋了一段时间段之后发生,则为线程锁定互斥锁(步骤560)。再次地,应该注意步骤558与步骤560应该实现为原子操作。在获取互斥锁之后,线程就不再处于自旋状态。因此,减少在互斥锁管理数据结构中表示自旋线程数目的数据值(步骤562)。
此时,图5E与图5B显著地不同,图5E显示以下的实施方式对于自旋线程的数目的限制被实现为动态可调整的值。确定该线程是否已进入睡眠状态同时等待互斥锁(步骤564)。例如,在图5D的步骤550,已经设置后-睡眠标志以表示该线程已经在互斥锁上睡眠同时等待获取互斥锁。如果线程没有进入睡眠状态,则结束该运行块,此后返回图5A中的步骤510。如果线程确实进入了睡眠状态,则通过以下步骤调整对于自旋线程的数目的限制。
确定该线程是否已经以多于限定值尝试获取互斥锁(步骤566)。每次尝试时,在步骤556处积累获取互斥锁的尝试的数目的计数;这是线程特有的或与线程相关的值。后-睡眠互斥锁获取尝试计数门限值为互斥锁特有的值;例如,其可以在互斥锁特有的数据结构中保持,如图4所示。
如果后-睡眠线程的互斥锁获取尝试数目大于后-睡眠互斥锁获取尝试计数门限,则该线程在获取互斥锁之前已经自旋了相对较长的时间,因此减少自旋线程计数门限(步骤568)。如果后-睡眠线程的互斥锁获取尝试数目小于后-睡眠互斥锁获取尝试计数门限,则该线程在获取互斥锁之前已经自旋了相对较短的时间,因此增加自旋线程计数门限(步骤570)。虽然图中未显示,但是对于自旋线程的最大可能数目可以有上限,其中该上限将取决于可用于支持线程的资源。另外,可以以除一以外的量增加或减少自旋线程计数门限,即不以值一来增加或减小。另外,可以根据可用来支持自旋线程的其他资源的值来动态计算用来增加或减少自旋线程计数门限的值。
后-睡眠互斥锁获取尝试计数门限可以是可配置的值,其为互斥锁所特有、应用程序所特有、或者可能为系统所特有,从而其用于在给定系统内所支持的每个互斥锁。另外,后-睡眠互斥锁获取尝试计数门限可以是根据资源可用性而动态可调整的。
在可替换实施方式中,可以用表示下门限值与上门限值的两个门限值来替换后-睡眠互斥锁获取尝试计数门限。对互斥锁获取尝试的数目与后-睡眠互斥锁获取尝试计数下门限值的比较结果将控制何时增加自旋线程计数门限。对互斥锁获取尝试的数目与后-睡眠互斥锁获取尝试计数上门限值的比较结果将控制何时减少自旋线程计数门限。如果互斥锁获取尝试的数目落入这两个门限值之间,则不调整自旋线程计数门限。可以在本发明的各种实施方式中实现用于调整自旋线程计数门限的其他算法。
在图5E中所示的可替换实施方式中,对于自旋线程的数目的门限限制是动态可调整的。在步骤566,对后-睡眠线程的互斥锁获取尝试的数目与后-睡眠互斥锁获取尝试计数门限的比较结果,将确定是否有足够数目的线程在互斥锁上自旋。如上所述,该某些情景下,在任意给定时间由具有多于一个自旋线程可能更好。
当线程在已经在互斥锁上睡眠之后开始在互斥锁上自旋时,该线程监视其在获取互斥锁之前自旋的时间长度;这在步骤556通过保持对于互斥锁获取尝试数目的计数来进行,但是在本发明的其他实施方式下可能保持其他计算费用测度。
相对较小的互斥锁获取尝试的计数值确定线程在苏醒之后相对较快地获取互斥锁;在步骤566处负的结果可说明上述情况。对于这种情况,可以增加自旋线程计数门限,以确保足够数目的线程在互斥锁上自旋;这由步骤570表示。
相反,相对较大的互斥锁获取尝试的计数值确定线程在苏醒之后过度自旋;在步骤566处正的结果可说明上述情况。对于这种情况,可以减少自旋线程计数门限,以确保不会有太多的线程在互斥锁上自旋;这由步骤568给出,然而自旋线程计数门限将具有下限值一。通过这种方式,该互斥锁在运行时自适应于其环境的计算行为。
现在参照图6,其中的流程图显示了线程释放自适应互斥锁的过程。通过显示一线程,该线程释放先前通过使用图5A-5E的过程而获得的互斥锁,图6补充了图5A-5E。当进入解锁互斥锁的例程时,开始该过程(步骤602)。在检查以确保请求解锁互斥锁的线程为先前锁定该互斥锁的线程之后,解锁该互斥锁(步骤604);应该注意步骤604应当实现为原子操作。然后,该例程清除或删除先前存储在数据结构中的所有线程标识符,该线程标识符指示先前锁定该互斥锁的线程的身份(步骤606)。
然后确定是否有任何已经在等待该互斥锁的线程正在该互斥锁上睡眠(步骤608)。如果是,则向正在该互斥锁上睡眠的线程发送唤醒信号(步骤610),例如,对线程的执行进行安排的系统调用。如果多个线程正在该互斥锁上睡眠,则可以使用适当的算法来选择应该尝试锁定该互斥锁的下一个线程。然后,解锁例程返回调用例程(步骤612),由此结束解锁互斥锁的过程。
从以上的详细描述,可以明显地看出本发明的的优点。在现有技术中,当互斥锁被锁定时,线程一般在锁定的互斥锁上进行自旋超时退出操作,这将使该线程在可以在系统级或应用程序级上配置的一段时间之后睡眠。使用本发明,对于线程应当在经锁定的互斥锁上自旋还是睡眠的确定取决于围绕该特定互斥锁的计算环境。本发明调整线程针对特定的经锁定的互斥锁的行为,使得线程进入以如下方式自旋状态或进入睡眠状态该方式取决于其他线程针对该互斥锁的先前的动作。
应该注意,虽然在功能完备的数据处理系统的环境下描述了本发明,但是本领域技术人员应该理解本发明的过程能够以计算机可读介质指令的形式以及各种其他形式分布,而不管实际用来执行该分布的信号承载介质的特定类型。计算机可读介质的例子包括诸如EPROM、ROM、磁带、纸张、软盘、硬盘驱动器、RAM、以及CD-ROM等介质,以及诸如数字与模拟通信链接等传送类型的介质。
对本发明的描述的目的在于说明,而不是穷尽的或限于所公开的实施方式。对于本领域技术人员来说,显然有许多改动与变化。所选择的实施方式是用来解释本发明的原理及其实际应用,并且使本领域技术人员能够理解本发明,从而实现适合于其他所设想的用途的具有各种修改的实施方式。
权利要求
1.一种在数据处理系统中管理互斥锁的方法,该方法包括以下步骤保持对于正在互斥锁上自旋的线程的数目的自旋线程计数值;第一线程尝试获取该互斥锁;以及作为对确定该互斥锁已经被第二线程获取的响应,根据所述自旋线程计数值,确定第一线程进入自旋状态还是睡眠状态。
2.根据权利要求1的方法,还包括以下步骤如果所述自旋线程计数值满足第一条件,则进入自旋状态;以及如果所述自旋线程计数值满足第二条件,则进入睡眠状态。
3.根据权利要求2的方法,其中所述第一条件为所述自旋线程计数值小于自旋线程计数门限值。
4.根据权利要求2的方法,其中所述第二条件为所述自旋线程计数值大于或等于自旋线程计数门限值。
5.根据权利要求2的方法,还包括以下步骤比较所述自旋线程计数值与自旋线程计数门限值,以选择自旋状态或睡眠状态。
6.根据权利要求5的方法,还包括以下步骤根据线程在所述互斥锁上睡眠之后获取所述互斥锁所需的时间量,调整所述自旋线程计数门限值。
7.根据权利要求5的方法,还包括以下步骤根据线程在所述互斥锁上睡眠之后获取所述互斥锁所需的获取尝试次数,调整所述自旋线程计数门限值。
8.根据权利要求5的方法,还包括以下步骤如果在所述互斥锁上睡眠之后线程获取所述互斥锁相对较慢,则减小所述自旋线程计数门限值。
9.根据权利要求5的方法,还包括以下步骤如果在所述互斥锁上睡眠之后线程获取所述互斥锁相对较快,则增加所述自旋线程计数门限值。
10.一种在计算机可读介质上用于在数据处理系统中管理互斥锁的计算机程序产品,该计算机程序产品包括用于保持对于正在互斥锁上自旋的线程的数目的自旋线程计数值的部分;用于第一线程尝试获取该互斥锁的部分;以及用于作为对确定该互斥锁已经被第二线程获取的响应,根据所述自旋线程计数值,确定第一线程进入自旋状态还是睡眠状态的部分。
11.根据权利要求10的计算机程序产品,还包括用于如果所述自旋线程计数值满足第一条件,则进入自旋状态的部分;以及用于如果所述自旋线程计数值满足第二条件,则进入睡眠状态的部分。
12.根据权利要求11的计算机程序产品,其中所述第一条件为所述自旋线程计数值小于自旋线程计数门限值。
13.根据权利要求11的计算机程序产品,其中所述第二条件为所述自旋线程计数值大于或等于自旋线程计数门限值。
14.根据权利要求11的计算机程序产品,还包括用于比较所述自旋线程计数值与自旋线程计数门限值,以选择自旋状态或睡眠状态的部分。
15.根据权利要求14的计算机程序产品,还包括用于根据线程在所述互斥锁上睡眠之后获取所述互斥锁所需的获取尝试次数,调整所述自旋线程计数门限值的部分。
16.根据权利要求14的计算机程序产品,还包括用于如果在所述互斥锁上睡眠之后线程获取所述互斥锁相对较慢,则减小所述自旋线程计数门限值的部分。
17.根据权利要求14的计算机程序产品,还包括用于如果在所述互斥锁上睡眠之后线程获取所述互斥锁相对较快,则增加所述自旋线程计数门限值的部分。
18.一种用于管理互斥锁的装置,包括用于保持对于正在互斥锁上自旋的线程的数目的自旋线程计数值的部分;用于第一线程尝试获取该互斥锁的部分;以及用于作为对确定该互斥锁已经被第二线程获取的响应,根据所述自旋线程计数值,确定第一线程进入自旋状态还是睡眠状态的部分。
19.根据权利要求18的装置,还包括用于如果所述自旋线程计数值小于自旋线程计数门限值,则进入自旋状态的部分;以及用于如果所述自旋线程计数值大于或等于自旋线程计数门限值,则进入睡眠状态的部分。
20.根据权利要求18的装置,还包括用于比较所述自旋线程计数值与自旋线程计数门限值,以选择自旋状态或睡眠状态的部分;以及用于根据线程在所述互斥锁上睡眠之后获取所述互斥锁所需的获取尝试次数,调整所述自旋线程计数门限值的部分。
全文摘要
提供了一种在数据处理系统中管理互斥锁的方法。对于每个互斥锁,保持对于正在自旋同时等待获取互斥锁的线程的数目的自旋线程计数。如果线程尝试获取锁定的互斥锁,则根据限制性条件以及在尝试获取过程中正在自旋的线程的数目,线程进入自旋状态或睡眠状态。另外,在已经在互斥锁上睡眠之后线程在互斥锁上自旋所需的相对时间长度,可以用来调节允许在互斥锁上自旋的线程的数目。
文档编号G06F9/52GK1601478SQ20041005493
公开日2005年3月30日 申请日期2004年7月26日 优先权日2003年9月25日
发明者乔尔·H·肖普 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1