CN102541661B - 实现等待地址同步接口的方法和设备 - Google Patents
实现等待地址同步接口的方法和设备 Download PDFInfo
- Publication number
- CN102541661B CN102541661B CN201110395062.3A CN201110395062A CN102541661B CN 102541661 B CN102541661 B CN 102541661B CN 201110395062 A CN201110395062 A CN 201110395062A CN 102541661 B CN102541661 B CN 102541661B
- Authority
- CN
- China
- Prior art keywords
- thread
- destination address
- value
- api
- currency
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 52
- 230000008569 process Effects 0.000 claims abstract description 33
- 230000007958 sleep Effects 0.000 claims abstract description 32
- 230000004044 response Effects 0.000 claims abstract description 14
- 230000008878 coupling Effects 0.000 claims description 4
- 238000010168 coupling process Methods 0.000 claims description 4
- 238000005859 coupling reaction Methods 0.000 claims description 4
- 230000015654 memory Effects 0.000 description 38
- 230000009471 action Effects 0.000 description 34
- 230000002618 waking effect Effects 0.000 description 27
- 239000002609 medium Substances 0.000 description 16
- 238000010586 diagram Methods 0.000 description 12
- 230000006870 function Effects 0.000 description 9
- 238000005516 engineering process Methods 0.000 description 7
- 238000007689 inspection Methods 0.000 description 6
- 230000008859 change Effects 0.000 description 4
- 238000004891 communication Methods 0.000 description 4
- 230000000712 assembly Effects 0.000 description 3
- 238000000429 assembly Methods 0.000 description 3
- 230000033001 locomotion Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 239000012120 mounting media Substances 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 239000002002 slurry Substances 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/541—Interprogram communication via adapters, e.g. between incompatible applications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
<b>本发明提供一种用于实现等待地址同步接口的方法。在进程的第一线程中,做出以下确定:目标地址处的当前值不是期望值。响应于该确定,第一应用编程接口(</b><b>API</b><b>)被调用以指示第一线程要睡眠并且在第二线程修改目标地址处的值时被唤醒。当第二线程修改目标地址处的值时,第二线程调用第二</b><b>API</b><b>以指示目标地址处的值已被修改。响应于第二</b><b>API</b><b>被调用,第一线程被唤醒。</b>
Description
背景技术
计算机软件应用时常作为包括多个不同线程的进程而运行,其中每个线程执行特定任务或实施该应用的特定功能。这些多个线程典型地被调度(schedule)成在处理器上在不同时间运行。一个线程在它未被调度运行时睡眠,并且然后当它被调度运行时被唤醒。尽管运行具有不同线程的程序可能具有性能改进,但是它不是没有它的问题。一个这样的问题是,可能出现一个线程正在等待特定变量具有特定值并且直到该特定变量具有该特定值时才继续的情形。这可能导致线程被重复唤醒以运行,仅因为该特定变量尚未具有该特定值而使该线程返回到睡眠。这样的结果致使线程的低效调度(schedule)并且降低运行所述应用的计算机的性能。
发明内容
本发明内容被提供以通过简化形式引入在下面的具体实施方式中进一步描述的概念的选择。本发明内容不旨在确定要求保护的主题的关键或必要特征,也不旨在用于限制要求保护的主题的范围。
根据一个或多个方面,揭示了第一应用编程接口,其在被进程的第一线程调用(invoke)时从第一线程接收目标地址和由第一线程在目标地址处观测的当前值。第一线程和目标地址二者的记录被维护,从而在目标地址处的值随后被修改的情况下,允许第一线程被识别(identified)。此外,第一线程响应于第一应用编程接口正被调用而睡眠。
根据一个或多个方面,在进程的第一线程中,作出以下确定:目标地址处的当前值不是期望值。响应于目标地址处的当前值不是期望值,第一应用编程接口被调用以指示第一线程即将睡眠并且在第二线程修改目标地址处的值时被唤醒。调用第一应用编程接口包括将目标地址和所述当前值标识为第一应用编程接口的参数。
附图说明
遍及附图,相同的数字用于指代相似的特征。
图1是图示根据一个或多个实施例实现等待地址同步接口的示例计算设备的框图。
图2是图示根据一个或多个实施例实现等待地址同步接口的示例系统的框图。
图3是图示根据一个或多个实施例的用于使用等待地址同步接口的示例过程的流程图。
图4是图示根据一个或多个实施例的用于实现等待地址同步接口的示例过程的流程图。
图5图示了根据一个或多个实施例的可被配置成实现等待地址同步接口的示例计算设备。
具体实施方式
在此讨论一种等待地址同步接口。等待同步模块将两个应用编程接口(API)揭示给运行在计算设备上的进程:等待地址API和唤醒地址API。该等待地址API由进程的线程调用,该线程识别目标地址和由该线程在目标地址处观测的值。该等待地址API允许线程指示它正放弃(relinquishing)对处理器的控制(例如将要睡眠),直到目标地址处的值发生变化。该等待同步模块验证了目标地址仍然具有由该线程识别的值。如果目标地址不再具有由该线程识别的值,则不使线程睡眠并且向线程返回目标地址处的值已经变化的指示。然而,如果目标地址仍然具有由该线程识别的值,则使该线程睡眠。该等待同步模块维护线程的记录以指示该线程正在等待目标地址处的值发生变化。该记录包括线程和目标地址(其是线程正在等待的地址)二者的指示。
当线程修改目标地址处的值时,该修改线程调用唤醒地址API,从而指定被修改的地址。该等待同步模块检查它的记录以确定是否有任何线程正等待所述目标地址,并且如果一个或多个线程正在等待该目标地址,则该等待同步模块唤醒那些一个或多个线程中的至少一个。
在此讨论使线程睡眠和唤醒线程。尽管使线程睡眠和唤醒线程的概念对本领域技术人员而言是已知的,但是为了方便读者起见,这里包含了使线程睡眠和唤醒线程的简要讨论。一般地,操作系统包括模块或组件,比如线程调度模块,其调度进程的不同线程以便由处理器或处理器内核在不同时间执行。典型地,该线程被调度一定时间量(例如,被称为时间片),在该时间量期间它可以执行。在该时间量流逝之后,该线程调度模块调度另一个线程来执行。当使线程睡眠时,该线程调度模块不调度用于执行的该线程,并且该线程不执行,而是该线程在睡眠。当线程被唤醒时,该线程调度模块重新开始调度用于执行的线程并且该线程执行。
图1是图示根据一个或多个实施例实现等待地址同步接口的示例计算设备100的框图。计算设备100可以是多种不同类型的设备。例如,计算设备100可以是台式计算机、上网本或膝上型计算机、记事本或平板计算机、移动站、娱乐设备、通信地耦合于显示设备的机顶盒、电视机、蜂窝或其它无线电话、游戏控制台、汽车计算机等等。因此,计算设备100的范围可以从具有大量存储器和处理器资源的全资源设备(例如,个人计算机、游戏控制台)到具有有限存储器和/或处理资源的低资源设备(例如,传统的机顶盒、手持式游戏控制台)。
计算设备100包括硬件102、包括等待同步模块106的操作系统104、以及一个或多个(x个)进程108(1)、…、108(x)。进程108中的每一个可以包括一个或多个线程,并且不同的进程108可以包括不同数量的线程。例如,进程108(1)被图示为包括一个或多个(m个)线程110(1)、…、110(m),并且进程108(x)被图示为包括一个或多个(n个)线程112(1)、…、112(n)。
硬件102包括计算设备的各种硬件组件。例如,硬件102可以包括一个或多个处理器、存储器组件(例如,随机存取存储器(RAM)、只读存储器(ROM)等)、诸如键盘或运动传感器之类的输入组件、诸如扬声器或显示屏之类的输出组件等等。硬件102支持操作系统104的执行,该操作系统典型地在软件和/或固件中实现。
操作系统104管理计算设备100上被称为进程108的应用的执行。操作系统104可以是多种不同操作系统中的任意一种。操作系统104包括等待同步模块106,其实现了本文所讨论的等待地址同步接口,从而将该等待地址同步接口揭示给各种进程108。尽管等待同步模块106被图示为在操作系统104中实现,但是可替代地等待同步模块106可以在硬件102中实现。
图2是图示根据一个或多个实施例实现等待地址同步接口的示例系统200的框图。系统200在诸如图1的计算设备100之类的计算设备中实现。系统200包括等待同步模块202,其可以是图1的等待同步模块106。系统200还包括线程204和线程206,其中每一个线程可以是图1的线程110或112。线程204和206可以是同一个进程(例如图1的同一个进程108)的一部分,或者可替代地是不同进程(例如图1的不同进程108)的一部分。
尽管参照线程204和206讨论系统200,但是应当理解,各种其他线程可以等待(可选地与线程204和/或线程206同时)相同或不同存储器位置的值被改变,并且各种其他线程可以改变这些特定存储器位置处的值。应当注意,包括线程204或206的一个或多个进程的开发者被预期当心以避免死锁状况,在该状况下,两个线程中的每一个均在等待另一个改变存储器位置的值。
等待同步模块202包括模块202揭示给线程204和206的等待地址API212和唤醒地址API214。等待同步模块202还包括等待控制模块216、唤醒控制模块218和线程标识仓库220。等待同步模块202使不同的线程(例如线程204和206)同步,从而允许正在等待存储器位置处的值被改变的一个线程进入睡眠并且随后当所述存储器位置处的值被另一个线程改变时被唤醒。
在执行时,线程204或206可以期望存储在特定存储器位置处的值(典型地由该存储器位置的地址识别)具有特定值或值范围。该线程204或206读取该特定存储器位置处的值并且检查存储在该特定存储器位置处的值是否具有期望值或在期望值范围内,并且如果是,则继续进行它的操作。然而,如果线程204或206确定该特定存储器处存储的值不是所期望的值或不在期望值范围内,则线程204或206通知等待同步模块202线程204或206期望等待该存储器位置,并且当在该存储器位置处的值被改变或修改时被通知。等待当在存储器位置处的值变化或被修改时被等待同步模块202通知的线程也被称为等待线程。
所述等待线程通过调用等待地址API212来通知等待同步模块202它期望等待所述存储器位置。作为调用等待地址API212的一部分,等待线程将目标地址和当前值标识为等待地址API212的一个或多个参数。实际的目标地址和/或当前值可以作为等待地址API212的参数而被包括,或者可替代地针对目标地址和/或当前值的指针或引用可以作为等待地址API212的参数而被包括。该目标地址是所述等待线程正在等待的存储器位置的地址,并且该当前值是由等待线程观测到的存储在目标地址处的值(其是由所述线程从目标地址读取的值)。
等待地址API212将所接收的参数提供给等待控制模块216。响应于等待地址API212被调用,等待控制模块216将等待线程的记录存储在线程标识仓库220中。等待线程的记录包括等待线程的标识和目标地址的指示。等待线程的标识是在等待地址API212被调用时从等待线程接收的。关于等待线程的附加信息或在等待地址API212被调用时接收的参数也可以包括在该记录中。
线程标识仓库220可以以多种不同的方式来维护。在一个或多个实施例中,线程标识仓库220被实现为哈希表和相应的哈希桶(hashbucket)。等待控制模块216通过将哈希函数应用于目标地址生成用于等待线程的哈希值。等待控制模块216可以使用多种不同的常规哈希函数。等待线程的记录和正在等待哈希运算(通过应用哈希函数)到该相同的哈希值的目标地址的任何其他等待线程一起被存储在对应于哈希值的哈希桶中。哈希桶是指存储对应于哈希值的记录的多种不同的数据结构中的任意一种,例如记录的链表。
可替代地,线程标识仓库220可以使用多种不同的数据结构以不同方式来维护。例如,线程标识仓库220可以是记录的有序列表,每个记录包括等待线程和目标地址二者的标识。该列表可以通过目标地址(例如从最低地址到最高地址、从最高地址到最低地址,等等)、通过等待线程标识符等等来排序。
等待控制模块216还读取目标地址处的当前值,并且确定目标地址处的当前值是否与由等待线程观测的(由等待线程在调用等待地址API212时提供的)当前值相同。如果目标地址处的当前值与由等待线程观测的当前值不同,则等待控制模块216认为在等待线程最后一次访问该存储器位置之后另一个线程已经改变了该目标地址处的值。相应地,该目标地址处的当前值可以是等待线程所期望的值或在所期望的值的范围内。因此,等待控制模块216从线程标识仓库220移除等待线程的记录并且向该等待线程返回重新检查目标地址处的值的指示。该等待线程重新检查线程的指示可以以不同方式提供,比如通过等待地址API212返回到等待线程的结果代码(例如,返回“错误”或“失败”的结果代码)。
在一个或多个实施例中,等待控制模块216检查目标地址处的当前值是否与由等待线程观测的当前值相同,并且如果不同,则作为原子操作(atomicoperation)从线程标识仓库220移除等待线程的记录。将这些作为原子操作执行确保了在等待控制模块216检查目标地址处的当前值是否与由等待线程观测的当前值相同的时间与等待控制模块216对线程标识仓库220移除等待线程的记录的时间之间另一个线程不能改变或修改该目标地址处的值。
应当注意,通过检查目标地址处的当前值是否与由等待线程观测的当前值相同,等待控制模块216解决了潜在竞争状态,而无需等待线程获得关于该存储器位置的任何类型的锁。如果目标地址处的当前值与由等待线程观测的当前值不同,则等待控制模块216返回重新检查所述线程的指示,因此如果另一个应用已经修改了存储器位置处的值,由于等待线程检查了该值,因此等待线程不等待已经发生的对存储器位置的修改。
然而,如果目标地址处的当前值与由等待线程观测的当前值相同,则等待控制模块216保持线程标识仓库220中的等待线程的记录。此外,如果目标地址处的当前值与由等待线程观测的当前值相同,则使等待线程睡眠。在一个或多个实施例中,等待控制模块216向操作系统(例如图1的操作系统104)的线程调度模块发送使等待线程睡眠的请求或消息。可替代地,在调用等待地址API之后,等待线程本身可以向线程调度模块发送让等待线程睡眠的请求或消息。一旦等待线程请求让其睡眠或一旦等待控制模块216将等待线程的记录添加到线程标识仓库220,则可以让等待线程睡眠,或者可替代地可以在等待线程请求让其睡眠之后或在等待控制模块216将等待线程的记录添加到线程标识仓库220之后特定时间量(例如特定数量的毫秒)让等待线程睡眠。等待该特定时间量允许例如直到等待控制模块216已经检查目标地址处的当前值是否与由等待线程观测的当前值相同之后才让等待线程睡眠。
在可替代实施例中,不是将等待线程的记录添加到线程标识仓库220然后检查目标地址是否与由等待线程观测的当前值相同,而是等待控制模块216可以在将等待线程的记录添加到线程标识仓库220之前检查目标地址是否与由等待线程观测的当前值相同。如果目标地址处的当前值与由等待线程观测的当前值相同,则将等待线程的记录添加到线程标识仓库220;否则不将该记录添加到线程标识仓库220并且向等待线程返回重新检查目标地址处的值的指示。在这样的可替代实施例中,等待控制模块216可以检查目标地址处的当前值是否与由等待线程观测的当前值相同,并且作为原子操作将等待线程的记录添加到线程标识仓库220。
在上文的讨论中,等待地址API212被讨论为将目标地址和当前值作为参数。在其他实施例中,除了当前值之外,或可替代地取代当前值,等待线程可以提供期望的值参数。等待线程经由期望的值参数线程指示等待线程期望在目标地址处的值或值的范围。在这样的实施例中,等待控制模块216检查目标地址处的当前值是否满足等待线程所期望的值或值的范围(例如,相同或在值的范围内)。如果目标地址处的当前值的确满足等待线程所期望的值或值的范围,则等待控制模块216向等待线程返回重新检查目标地址处的值的指示。然而,如果目标地址处的当前值不满足等待线程所期望的值或值的范围,则等待控制模块216保持线程标识仓库220中的等待线程的记录。该记录包括等待线程所期望的值或值的范围的指示。
当线程206修改线程正在等待(或可能正在等待)的目标地址处的值时,线程206调用唤醒地址API214。调用唤醒地址API214的线程也被称为唤醒线程。线程206典型地不能访问线程标识仓库220,并且因此不知道线程实际上是否正在等待特定目标地址。然而,线程204和206的开发者典型地知道线程可等待的不同地址,因此设计线程204和206当这种地址处的值被修改时调用唤醒地址API214(不管在唤醒地址API214被调用时线程实际上是否正在等待该地址)。
作为调用唤醒地址API214的一部分,唤醒线程将地址标识为唤醒地址API214的一个或多个参数。实际的地址值可以作为唤醒地址API214的参数而被包括,或者可替代地针对地址的指针或引用可以作为唤醒地址API214的参数而被包括。该地址是唤醒线程修改的存储器位置的地址。
唤醒地址API214向唤醒控制模块218提供所接收的一个或多个参数。响应于唤醒地址API214被调用,唤醒控制模块218检查线程标识仓库220以确定是否有任何线程正在等待被修改的地址(该地址被标识为唤醒地址API214的参数)。唤醒控制模块218检查线程标识仓库220以确定是否有任何线程正在等待被修改的地址的方式可以基于实现线程标识仓库220的方式而变化。
在线程标识仓库220被实现为如上文所讨论的哈希表和对应的哈希桶的一个或多个实施例中,唤醒控制模块218通过将哈希函数应用到被修改的地址来生成哈希值。唤醒控制模块218使用与等待控制模块216所使用的哈希函数相同的哈希函数(或提供相同结果的哈希函数)。唤醒控制模块218检查对应于哈希值的哈希桶以确定是否有等待线程的任何记录对应于所述哈希值。如果没有等待线程的记录对应于该哈希值,则当前没有线程正在等待被修改的地址,并且唤醒控制模块218不需要唤醒线程。
然而,如果等待线程的一个或多个记录对应于所述哈希值,则唤醒控制模块218检查那些一个或多个记录以确定是否有任何等待线程正在等待被修改的地址。由于多个不同的地址可能(且典型地的确)对应于相同哈希值,唤醒控制模块218检查是否有任何等待线程正在等待被修改的特定地址。如果一个或多个线程正在等待被修改的地址,则这些线程中至少一个被唤醒控制模块218选择并且被唤醒。
在一个或多个实施例中,唤醒控制模块218向操作系统(例如,图1的操作系统104)的线程调度模块发送唤醒正在睡眠的特定线程的请求或消息。要被唤醒的等待线程的标识可以包括在针对该等待线程的、在线程标识仓库220中维护的记录中。该线程调度模块继续唤醒所述特定线程,其然后可以重新检查该线程正在等待的地址处的值。当唤醒线程时,唤醒控制模块218还从线程标识仓库220移除模块218正在唤醒的等待线程的记录。
在多个线程正在等待被修改的地址的状况中,唤醒控制模块218可以唤醒等待该地址的所有多个线程或可替代地所述多个线程中选定的一个或多个。例如,可以通过唤醒线程来识别唤醒控制模块218是要唤醒等待该地址的所有多个线程还是要唤醒所述多个线程中选定的一个或多个。例如,不同的唤醒地址API214可被揭示,比如唤醒所有API和唤醒单个API。如果唤醒所有API被唤醒线程调用,则唤醒控制模块218唤醒等待该地址的所有多个线程。如果唤醒单个API被唤醒线程调用,则唤醒控制模块218唤醒等待该地址的多个线程的其中之一。可替代地,可以通过其他方式(比如在唤醒控制模块218中被预配置、被唤醒线程标识为唤醒地址API的参数,等等)来识别唤醒控制模块218是要唤醒等待该地址的所有多个线程还是要唤醒所述多个线程中选定的一个或多个。
如果唤醒控制模块218要唤醒比等待该地址的所有多个线程更少的线程,则唤醒控制模块218要唤醒的特定的一个或多个线程可以用各种不同的方式来识别。例如,等待线程的记录可具有在线程标识仓库220中的关联的时间戳(例如由等待控制模块216提供的),其指示线程何时开始等待(例如,线程何时调用等待地址API212或所述记录何时被添加到线程标识仓库220),或者线程可按照指示哪些线程在哪些其他线程之前开始等待的排序被存储在线程标识仓库220中(例如,记录的列表,其中由列表中较早记录识别的线程在由列表中较晚记录识别的线程之前开始等待)。在这种情况下,已等待最长时间的线程是由唤醒控制模块218选取作为唤醒线程的线程。
如上文所讨论,在一个或多个实施例中,除了当前值之外或可替代地取代当前值,等待线程可以提供期望的值参数。在这样的实施例中,除了确定一个或多个线程是否正在等待被修改的地址之外,在唤醒某线程之前,唤醒控制模块218还确定所述地址处的当前值是否具有期望的值或在值的范围内。期望的值或值的范围的指示被包括在存储在线程标识仓库220中的记录中,并且唤醒控制模块218可以容易地确定所述地址处的当前值是否具有期望值或在值的范围内。如果所述地址处的当前值具有期望值或在值的范围内,则唤醒控制模块218唤醒该线程。然而,如果所述地址处的当前值不具有期望值或不在值的范围内,则唤醒控制模块218不唤醒该线程。
在一个或多个实施例中,使用格式“等待地址”来揭示等待地址API212,并且至少包括为如上所讨论线程正在等待的目标地址的目标地址参数。该等待地址API212还可以包括如下值参数,该值参数为由如被存储在如上所讨论的目标地址处的等待线程观测的当前值。此外,等待地址API212可以包括下列参数的一个或多个:大小、超时、掩码(mask)、期望值和原因。这些参数的一个或多个可以由等待线程在调用等待地址API212时提供。当这些参数的一个或多个的值被等待线程提供时,由等待线程提供的这一个或多个值被包括在线程标识仓库220中维护的等待线程的记录中。
大小参数用于指示存储在线程正在等待的目标地址处的值的值大小(例如,以位或字节为单位)。使用该大小参数允许等待控制模块216和唤醒控制模块218获知存储在目标地址处的值的大小。可替代地,该值的大小可以为等待地址API中所固有的。例如,可以使用一个或多个大小特定的等待地址API,比如“等待地址字节”用于8位大小的值,“等待地址字”用于16位大小的值,等等。
超时参数用于指示时间量(例如以毫秒或秒为单位),在该时间量之后,即使线程正在等待的目标地址尚未被修改,线程也要被唤醒。唤醒控制模块218监视超时值,并且如果在超时参数中指示的时间量(例如,基于等待地址API212何时被调用或所述记录何时被存储在线程标识仓库220中)已经流逝后该线程的记录仍然包括在线程标识仓库220中,则唤醒等待线程。
掩码参数用于指示存储在等待线程感兴趣的目标地址处的值的部分。所述值的该部分可以以不同方式识别,比如识别存储在等待线程感兴趣的目标地址处的值的特定比特的掩码值。如果目标地址被修改,则唤醒控制模块218仅在存储在等待线程感兴趣的目标地址处的值的部分已被修改的情况下唤醒等待线程。唤醒控制模块218可以将目标地址处的当前值与存储在线程标识仓库220中维护的、用于等待线程的记录中的值进行比较,并且容易确定等待线程感兴趣的所述值的部分是否已被修改。例如,等待线程可以指示它对目标地址处的值的第一、第三和第六位感兴趣。相应地,如果目标地址处的当前值的第一、第三和第六位的值不同于包括在线程标识仓库220中维护的记录中的值,则存储在等待线程感兴趣的目标地址处的值的部分已被修改。然而,如果目标地址处的当前值的第一、第三和第六位的值与包括在线程标识仓库220中维护的记录中的值相同,则存储在等待线程感兴趣的目标地址处的值的部分未被修改。
期望的值参数用于等待线程以指示:为了唤醒控制模块218唤醒线程,目标地址处的当前值要具有特定值或在特定的值范围内,如上文所讨论。
原因参数被用于指示为何等待线程正在等待目标地址的一个或多个原因。该原因参数类似于期望的值参数,但是不同之处在于:该原因参数指定了线程正在等待的原因而不是为了被唤醒目标地址要具有的特定值或目标地址要处于其中的特定值范围。例如,等待线程可以指示它正在等待目标地址,因为目标地址处的值不是零值。当使用原因参数时,在唤醒线程之前,唤醒控制模块218确定由等待线程指定的原因是否仍然存在。该原因的指示被包括在由等待控制模块216在线程标识仓库220中存储的记录中,并且唤醒控制模块218可以容易地确定所述原因是否仍然存在(例如基于目标地址处的当前值)。如果线程正在等待的原因不再存在,则唤醒控制模块218唤醒该线程。然而,如果线程正在等待的原因仍然存在,则唤醒控制模块218不唤醒该线程。
在一个或多个实施例中,使用格式“唤醒地址”来揭示唤醒地址API214,并且至少包括作为唤醒线程修改的地址的地址参数,如上文所讨论。唤醒地址API214可以例如被实现为“唤醒所有”API,其指示等待所述等待线程修改的地址的所有线程要被唤醒,或被实现为“唤醒单个”API,其指示等待所述等待线程修改的地址的单个线程要被唤醒。
应当注意,在等待同步模块202至少部分在硬件中实现的实施例中,唤醒控制模块218不需要等待直到唤醒地址API214被调用以唤醒一个或多个线程。相反,所述硬件本身可以检测一个或多个线程正在等待的特定存储器位置何时已被修改,并且响应于检测对该特定存储器位置的修改而唤醒至少一个所述等待线程。在这样的实施例中,唤醒地址API214不需要通过等待同步模块来揭示,并且/或者可以被揭示但不导致由等待同步模块202在被调用时执行的任何动作。
图3是图示用于根据一个或多个实施例使用等待地址同步接口的示例过程300的流程图。过程300可以在软件、固件、硬件或其组合中实现。图3的左手侧所示的过程300的动作由第一线程(比如图2的线程204)实施。图3的右手侧所示的过程300的动作由第二线程(比如图2的线程206)实施。过程300被示出为一组动作并且不限于所示的用于执行各种动作的操作的顺序。过程300是用于使用等待地址同步接口的示例过程,使用等待地址同步接口的附加讨论参照不同的附图而包括在本文中。
在过程300中,第一线程检查目标地址处的当前值是否是期望的值(动作302)。该期望值可以是如上所讨论的单个值或值的范围。
过程300基于所述当前值是否是期望值而进行(动作304)。如果目标地址处的当前值是期望值,则线程的操作继续(动作306)。操作的该继续是指在验证了目标地址处的当前值是期望值之后线程继续执行包括在线程中的无论什么指令。
然而,如果所述当前值不是期望值,则第一线程调用等待地址API(动作308)。第一线程提供作为等待地址API的参数的目标地址(其为第一线程正在等待的存储器位置的地址)和当前值(其为由正被存储在目标地址处的等待线程观测的值)二者的指示。除了如上文所讨论的这些参数之外或取代这些参数,还可以提供其他参数。
然后让第一线程睡眠(动作310)。第一线程可以使自己睡眠,或者等待同步模块的模块或组件可以使第一线程睡眠,如上文所讨论。可替代地,如上文所讨论,如果目标地址处的值在动作302中进行检查之后被改变,则可以使第一线程保持醒来,并且返回到动作302以重新检查目标地址处的当前值是否是期望值。
第二线程修改目标地址处的值(动作312)。该修改可以在不同的时间执行,并且典型地在动作310中让第一线程睡眠之后执行。
在修改目标地址处的值之后,第二线程调用唤醒地址API(动作314)。第二线程提供第二线程修改的地址(动作312中的目标地址)的指示作为唤醒地址API的参数。
响应于唤醒地址API被调用,第一线程被唤醒(动作316)。一旦唤醒,第一线程返回到动作302以重新检查目标地址处的当前值是否是期望值。过程300然后如上所讨论的那样基于第一线程是否确定目标地址处的当前值是期望值来继续。
图4是图示用于根据一个或多个实施例实现等待地址同步接口的示例过程400的流程图。过程400由等待同步模块(例如图2的等待同步模块202)实施并且可以在软件、固件、硬件或其组合中实现。过程400被示出为一组动作并且不限于所示的用于执行各种动作的操作的顺序。过程400是用于实现等待地址同步接口的示例过程;参照不同附图本文包括实现等待地址同步接口的附加讨论。
在过程400中,等待地址API和唤醒地址API被揭示(动作402)。
从调用等待地址API的第一线程接收目标地址和当前值(动作404)。目标地址和当前值被接收为等待地址API的参数,如上文所讨论。可以可选地接收等待地址API的其他参数,如上文所讨论。
第一线程的记录和目标地址被存储,其指示第一线程正在等待目标地址(动作406)。该记录可以存储在对应于根据将哈希值应用到目标地址而生成的哈希值的数据结构中,如上文所讨论。
进行关于目标地址处的值是否已经被改变的检查(动作408)。可以例如通过读取目标地址处的当前值并检查该值是否与如上所讨论的在动作404中接收的当前值相同来进行该检查。
如果目标地址已经被改变,则将第一线程的记录从存储的记录中移除,并且使第一线程保持醒来(动作410)。不让第一线程睡眠,并且向第一线程返回重新检查目标地址处的值的指示(动作412)。该重新检查为目标地址处的当前值是否是期望值的检查,如上所讨论。
返回动作408,如果目标地址处的值未被改变,则让第一线程睡眠(动作414)。
最后,来自第二线程的地址被接收为由第二线程调用的唤醒地址API的参数(动作416)。从存储的记录中识别一个或多个线程(如果有),其具有匹配在动作416中接收的地址的目标地址。如果例如存储的记录中的目标地址与接收的地址相同,则存储的记录中的线程具有匹配所接收的地址的目标地址。
在动作418中识别的一个或多个线程中至少一个被唤醒(动作420)。在动作418中识别的所有线程可以被唤醒,或可替代地只有选定的线程可被唤醒,如上文所讨论。此外,被唤醒的至少一个线程的记录被从存储的记录移除(动作422)。
图5图示了可以被配置成实现根据一个或多个实施例的等待地址同步接口的示例计算设备500。计算设备500可以例如是图1的计算设备100。
计算设备500包括一个或多个处理器或处理单元502、可以包括一个或多个存储器和/或存储组件506的一个或多个计算机可读介质504、一个或多个输入/输出(I/O)设备508和允许各种组件和设备相互通信的总线510。计算机可读介质504和/或一个或多个I/O设备508可以作为计算设备500的一部分而被包括,或可替代地可以耦合到计算设备500。总线510表示若干类型总线结构的一个或多个,该总线结构包括使用多种不同总线架构的存储器总线或存储器控制器、外围总线、加速图形端口、处理器或局部总线等等。总线510可以包括有线和/或无线总线。
存储器/存储组件506表示一个或多个计算机存储介质。组件506可以包括易失性介质(比如随机存取存储器(RAM))和/或非易失性介质(比如只读存储器(ROM)、闪存、光盘、磁盘等等)。组件506可包括固定介质(例如,RAM、ROM、固定硬驱动等)和可移除介质(例如,闪存驱动、可移除硬驱动、光盘等等)。
本文所讨论的技术可以在具有由一个或多个处理单元502执行的指令的软件中实现。应当理解,不同指令可以存储在计算设备500的不同组件中,比如存储在处理单元502中、处理单元502的各种高速缓冲存储器中、设备500的其他高速缓冲存储器(未示出)中、其他计算机可读介质上等等。此外,应当理解,指令被存储在计算设备500中的位置可以随时间变化。
一个或多个输入/输出设备508允许用户向计算设备500输入命令和信息,并且还允许将信息呈现给用户和/或其他组件或设备。输入设备的示例包括键盘、光标控制设备(例如鼠标)、麦克风、扫描器等等。输出设备的示例包括显示设备(例如,显示器或投影仪)、扬声器、打印机、网卡等等。
各种技术在本文中可以在软件或程序模块的通用背景中描述。一般地,软件包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。这些模块和技术的实现方式可以存储在某个形式的计算机可读介质上或通过该计算机可读介质传输。计算机可读介质可以是可以被计算设备访问的任何可用介质或媒质。为举例而非限制,计算机可读介质可以包括“计算机存储介质”和“通信介质”。
“计算机存储介质”包括以用于存储信息的任何方法或技术实现的易失性和非易失性、可移除和不可移除的介质,所述信息比如是计算机可读指令、数据结构、程序模块或其它数据。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字通用盘(DVD)或其它光学存储装置、盒式磁带、磁带、磁盘存储装置或其它磁存储设备或可以用于存储期望的信息并可以被计算机访问的任何其它介质。
“通信介质”典型地包含计算机可读指令、数据结构、程序模块或已调制数据信号(比如载波或其它传输机制)中的其它数据。通信介质还包括任何信息传递介质。术语“已调制数据信号”意指其特性中的一个或多个以编码信号中的信息的方式设置或改变的信号。为了举例而非限制,通信介质包括诸如有线网络或直接布线连接之类的有线介质和诸如声学、RF、红外和其它无线介质之类的无线介质。上述任意的组合也包括在计算机可读介质的范围内。
一般地,本文所描述的功能或技术的任意一种可以使用软件、固件、硬件(例如,固定的逻辑电路)、手动处理或这些实现方式的组合来实现。如本文所使用的术语“模块”和“组件”一般地表示软件、固件、硬件或其组合。在软件实现方式的情况下,所述模块或组件表示在处理器(例如一个或多个CPU)上被执行时执行指定任务的程序代码。该程序代码可被存储在一个或多个计算机可读存储器设备中,可以参照图5找到这一点的进一步描述。本文描述的等待地址同步接口的特征是平台独立的,这意味着该等待地址同步接口可以在具有多种处理器的多种商业计算平台上实现。
尽管已经以特定于结构特征和/或方法动作的语言描述了所述主题,但是应当理解,所附权利要求中定义的主题不一定限于上述特定特征或动作。相反,上述特定特征和动作是作为实现权利要求的示例形式来公开的。
Claims (9)
1.一种用于实现等待地址同步接口的方法,包括:
暴露第一应用编程接口,其在被进程的第一线程调用时从所述第一线程接收目标地址和由所述第一线程在所述目标地址处观测的当前值;
维护所述第一线程的记录和所述目标地址,从而在所述目标地址处的当前值随后被修改的情况下,允许所述第一线程被识别;
响应于所述第一应用编程接口被调用,让所述第一线程睡眠,
从所述第一线程接收在所述目标地址处的期望值或期望值范围的指示;
响应于所述第一应用编程接口被调用,检查所述目标地址处的当前值是否是所述期望值或在所述期望值范围内;以及
如果所述目标地址处的当前值是所述期望值或在所述期望值范围内,则向所述第一线程返回重新检查所述目标地址处的值的指示,否则调用所述第一应用编程接口让所述第一线程睡眠。
2.如权利要求1所述的方法,进一步包括:
响应于所述第一应用编程接口被调用,检查所述目标地址是否仍然具有由所述第一线程在所述目标地址处观测的所述当前值;
如果所述目标地址仍然不具有由所述第一线程在所述目标地址处观测的所述当前值,则向所述第一线程返回重新检查所述目标地址处的值的指示;以及
只有当所述目标地址仍然具有由所述第一线程在所述目标地址观测的所述当前值时,才让所述第一线程睡眠。
3.如权利要求1所述的方法,进一步包括:
暴露第二应用编程接口,当其被第二线程调用以指示所述目标地址处的值已被修改时,从所述第二线程接收已被修改的目标地址;
检查从所述第二线程接收的目标地址是否匹配从第一线程接收的所述目标地址;以及
如果从所述第二线程接收的目标地址匹配从第一线程接收的所述目标地址,则唤醒所述第一线程。
4.如权利要求3所述的方法,其中所述第二应用编程接口包括唤醒单个应用编程接口,所述第一线程是等待所述目标地址被修改的多个线程的其中之一,并且进一步包括:
响应于所述唤醒单个应用编程接口被调用,唤醒所述第一线程但不唤醒所述多个线程中的其他线程。
5.如权利要求1所述的方法,进一步包括当所述第一应用编程接口被调用时从所述第一线程接收所述当前值的大小。
6.如权利要求1所述的方法,进一步包括当所述第一应用编程接口被调用时从第一线程接收超时值,该超时值指示即使所述目标地址处的值随后未被修改也要唤醒所述第一线程的时间。
7.如权利要求1所述的方法,进一步包括当第一应用编程接口被调用时从所述第一线程接收所述第一线程感兴趣的目标地址处的值的部分的指示,该方法进一步包括:
暴露第二应用编程接口,其在被第二线程调用以指示所述目标地址处的值已被修改时,从所述第二线程接收已被修改的目标地址;
检查从所述第二线程接收的目标地址是否匹配从第一线程接收的所述目标地址;
确定所述第一线程感兴趣的所述目标地址处的值的部分是否已被修改;以及
只有从所述第二线程接收的目标地址匹配从第一线程接收的所述目标地址且所述第一线程感兴趣的目标地址处的值的部分已被修改时,唤醒所述第一线程。
8.一种计算设备,包括:
一个或多个处理器;以及
一个或多个计算机可读介质,其上存储有多个指令,当所述指令由所述一个或多个处理器作为进程的第一线程执行时使得所述一个或多个处理器:
确定目标地址处的当前值不是期望值;以及
响应于所述目标地址处的所述当前值不是所述期望值,调用第一应用编程接口让所述第一线程睡眠并且在第二线程修改所述目标地址处的值时被唤醒,其中调用所述第一应用编程接口是将所述目标地址和所述当前值标识为所述第一应用编程接口的参数。
9.如权利要求8所述的计算设备,其中所述多个指令进一步使得所述一个或多个处理器:
响应于调用所述第一应用编程接口,在让所述第一线程睡眠之前接收重新检查所述目标地址处的当前值是否是所述期望值的指示;以及
如果所述目标地址处的当前值仍然不是所述期望值,则再次调用所述第一应用编程接口。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US12/958,721 US8490118B2 (en) | 2010-12-02 | 2010-12-02 | Wait on address synchronization interface |
US12/958721 | 2010-12-02 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102541661A CN102541661A (zh) | 2012-07-04 |
CN102541661B true CN102541661B (zh) | 2016-05-18 |
Family
ID=46163517
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110395062.3A Active CN102541661B (zh) | 2010-12-02 | 2011-12-02 | 实现等待地址同步接口的方法和设备 |
Country Status (2)
Country | Link |
---|---|
US (2) | US8490118B2 (zh) |
CN (1) | CN102541661B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8490118B2 (en) | 2010-12-02 | 2013-07-16 | Microsoft Corporation | Wait on address synchronization interface |
JP5819184B2 (ja) * | 2011-12-28 | 2015-11-18 | 富士通株式会社 | 情報処理装置及び情報処理装置の制御方法 |
CN104572275B (zh) * | 2013-10-23 | 2017-12-29 | 华为技术有限公司 | 一种进程加载方法、装置及系统 |
US10761714B2 (en) * | 2015-11-23 | 2020-09-01 | Google Llc | Recognizing gestures and updating display by coordinator |
HUP1600467A2 (en) * | 2016-07-26 | 2018-03-28 | Intersoft Hungary Kft | Method and system for authentically determining the identity of an electronic document and copy or futureversion |
GB2557300A (en) * | 2016-12-05 | 2018-06-20 | Nordic Semiconductor Asa | Demodulation |
CN108460047B (zh) * | 2017-02-21 | 2021-11-16 | 阿里巴巴集团控股有限公司 | 数据同步方法及设备 |
CN109426526B (zh) * | 2017-08-25 | 2021-08-17 | 展讯通信(上海)有限公司 | 接口唤醒同步方法、接口设备及计算机可读介质 |
US10459778B1 (en) | 2018-07-16 | 2019-10-29 | Microsoft Technology Licensing, Llc | Sending messages between threads |
WO2020005595A1 (en) * | 2018-06-28 | 2020-01-02 | Microsoft Technology Licensing, Llc | Sending messages between threads |
CN114443255A (zh) * | 2022-02-25 | 2022-05-06 | 蚂蚁区块链科技(上海)有限公司 | 一种线程调用方法和装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101542412A (zh) * | 2005-04-14 | 2009-09-23 | Mips技术公司 | 用于多线程处理器中自动低功率模式调用的装置和方法 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5659709A (en) * | 1994-10-03 | 1997-08-19 | Ast Research, Inc. | Write-back and snoop write-back buffer to prevent deadlock and to enhance performance in an in-order protocol multiprocessing bus |
US6128640A (en) | 1996-10-03 | 2000-10-03 | Sun Microsystems, Inc. | Method and apparatus for user-level support for multiple event synchronization |
US7962923B2 (en) * | 2005-12-30 | 2011-06-14 | Level 3 Communications, Llc | System and method for generating a lock-free dual queue |
US8214834B2 (en) | 2007-04-30 | 2012-07-03 | Hewlett-Packard Development Company, L.P. | Asynchronous wakeup mechanism that places reference to process on sleep queue if execution of copyout functionality is caused to sleep |
US8386822B2 (en) * | 2008-02-01 | 2013-02-26 | International Business Machines Corporation | Wake-and-go mechanism with data monitoring |
US9021502B2 (en) * | 2008-12-29 | 2015-04-28 | Oracle America Inc. | Method and system for inter-thread communication using processor messaging |
US8490118B2 (en) | 2010-12-02 | 2013-07-16 | Microsoft Corporation | Wait on address synchronization interface |
-
2010
- 2010-12-02 US US12/958,721 patent/US8490118B2/en active Active
-
2011
- 2011-12-02 CN CN201110395062.3A patent/CN102541661B/zh active Active
-
2013
- 2013-07-01 US US13/932,935 patent/US8782674B2/en active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101542412A (zh) * | 2005-04-14 | 2009-09-23 | Mips技术公司 | 用于多线程处理器中自动低功率模式调用的装置和方法 |
Also Published As
Publication number | Publication date |
---|---|
US20120144406A1 (en) | 2012-06-07 |
CN102541661A (zh) | 2012-07-04 |
US8490118B2 (en) | 2013-07-16 |
US20130298143A1 (en) | 2013-11-07 |
US8782674B2 (en) | 2014-07-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102541661B (zh) | 实现等待地址同步接口的方法和设备 | |
CN108090731B (zh) | 一种信息处理方法及设备 | |
TWI552076B (zh) | 使用具有客作業系統及虛擬處理器之超管理器之系統及方法 | |
US20100211954A1 (en) | Practical contention-free distributed weighted fair-share scheduler | |
CN110489213A (zh) | 一种任务处理方法及处理装置、计算机系统 | |
US20110185364A1 (en) | Efficient utilization of idle resources in a resource manager | |
CN113886069B (zh) | 一种资源分配方法、装置、电子设备及存储介质 | |
US20110161969A1 (en) | Consolidating CPU - Cache - Memory Access Usage Metrics | |
US9529651B2 (en) | Apparatus and method for executing agent | |
CN111831436B (zh) | Io请求的调度方法、装置、存储介质及电子设备 | |
CN111831434A (zh) | 资源分配方法、装置、存储介质及电子设备 | |
CN115686346A (zh) | 一种数据存储方法、设备及计算机可读存储介质 | |
CN113342554B (zh) | Io多路复用方法、介质、设备和操作系统 | |
US8972693B2 (en) | Hardware managed allocation and deallocation evaluation circuit | |
CN112486638A (zh) | 用于执行处理任务的方法、装置、设备和存储介质 | |
US10061676B2 (en) | Remotely located timing method and device for a processing unit in an information processing system | |
CN119271375A (zh) | 任务调度方法、装置、电子设备、存储介质及程序产品 | |
CN102426535A (zh) | 动态进程虚拟化 | |
CN114816032B (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
JP6817827B2 (ja) | アクセラレータ処理管理装置、ホスト装置、アクセラレータ処理実行システム、方法およびプログラム | |
CN118819748A (zh) | 一种任务调度方法、调度管理系统及多核处理器 | |
CN116089049A (zh) | 基于异步并行i/o请求的进程同步调度方法、装置以及设备 | |
CN114691376A (zh) | 一种线程执行方法、装置、电子设备和存储介质 | |
CN106934555B (zh) | 工作流的组织方法及装置、计算机设备及存储介质 | |
JP2007241922A (ja) | 共有資源利用のための調停方法及びその調停装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150611 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20150611 Address after: Washington State Applicant after: Micro soft technique license Co., Ltd Address before: Washington State Applicant before: Microsoft Corp. |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |