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

技术编号:2864551 阅读:223 留言:0更新日期:2012-04-11 18:40
提供了一种在数据处理系统中管理互斥锁的方法。对于每个互斥锁,保持对于正在自旋同时等待获取互斥锁的线程的数目的自旋线程计数。如果线程尝试获取锁定的互斥锁,则根据限制性条件以及在尝试获取过程中正在自旋的线程的数目,线程进入自旋状态或睡眠状态。另外,在已经在互斥锁上睡眠之后线程在互斥锁上自旋所需的相对时间长度,可以用来调节允许在互斥锁上自旋的线程的数目。

【技术实现步骤摘要】

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

【技术保护点】
一种在数据处理系统中管理互斥锁的方法,该方法包括以下步骤:保持对于正在互斥锁上自旋的线程的数目的自旋线程计数值;第一线程尝试获取该互斥锁;以及作为对确定该互斥锁已经被第二线程获取的响应,根据所述自旋线程计数值,确定第一线程进入自旋状态还是睡眠状态。

【技术特征摘要】
US 2003-9-25 10/671,122中列出。然而,通过参照附图同时阅读以下对本发明优选实施方式的描述,可以更好地了解本发明自身、以及优选使用模式、进一步的目标及其优点,其中图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,并且PDA 113通过无线链接114连接到网络110。电话111与PDA 113也可以使用适当的技术(诸如“蓝牙”无线技术)直接在其之间通过无线链接115传送数据,以生成所谓的个人区域网络(PAN),或者个人临时网络。以类似的方式,PDA 113可以通过无线通信链接116传送数据给PDA 107。 本发明可以在多种硬件平台上实现;图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应该实现为原子操作。在...

【专利技术属性】
技术研发人员:乔尔H肖普
申请(专利权)人:国际商业机器公司
类型:发明
国别省市:US[美国]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1