【技术实现步骤摘要】
本专利技术涉及一种改进的数据处理系统,更具体地,涉及一种用于多进程协调的方法与装置。再具体地讲,本专利技术提供了一种用于在任务管理或控制过程中使用互斥锁的进程调度或资源分配的方法与装置。
技术介绍
现代操作系统支持多道程序,由此看起来在具有单一的中央处理单元(CPU)或者可能在对称多处理器(SMP)机器中的多个CPU的单一计算设备上有多个程序并发执行。通过同时使用串行化执行来达到并发执行,也被称为“时间分片”设备的操作系统允许多个程序中的一个在某限定时间段(即时间片)内独占地运行,然后跟随着多个程序中另一个不同的程序独占执行所使用的时间段。因为在程序之间的切换发生得很快,所以看起来程序是并发运行的,虽然实际上它们是串行运行的。当完成对于一个程序的时间片时,该程序被置入挂起或“睡眠”状态,并且另一程序“苏醒”并开始运行。 提高单一程序或单一进程的性能的一种方法是将该程序或进程分为指令路径,经常被称为“线程”,这些执行路径看起来是并发执行的。这样的程序或进程一般被称为“多任务”或“多线程”;操作系统为每个线程提供时间片,在该时间片内其具有对CPU的独占使用。操作系统一般提供内置的机制用来在并发程序和/或线程之间以非常迅速与高效的方式进行切换;对于多线程某些类型的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中的硬件可以根据系统的实现而变化。例如,该系统可以具有一个或更多个处理器,诸如基于IntelPenteium的处理器与数字信号处理器(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应该实现为原子操作。在...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。