具体实施方式
在以下对优选实施例的详细描述中,参考了例示出可实践本发明的实施例的附图。应该理解,在不背离本发明范围的情况下,可以使用其它实施例并可做出改变。附图和详细描述并非将本发明限制为所公开的特定形式。相反,本发明将覆盖落入如权利要求所限定的本发明的精神和范围中的所有修改、等同物和变体。这里的标题并非以任何方式限制其主题。
***
如前所述,在多处理器环境中,多个线程在同一时间逐个运行,并从而可能竞争使用相同的***设备。根据本发明的实施例,线程资源分配逻辑(这里也被称为“线程资源分配核”或“TRAC”)确定可以在特定时间运行的线程组合,以减少线程冲突。这可包括TRAC响应于来自处理器的特定线程查询,其中该处理器将特定线程指示为用于上下文交换的候选者,并且TRAC通过指示出该线程是否将导致资源冲突来进行响应。此外,或者可替换地,这可包括TRAC响应于来自处理器的饥饿(starved)线程查询,其中TRAC确定出将不会导致与给定线程(例如,需要运行的“饥饿”线程)的资源冲突的线程的一个或多个列表,并将其传送给处理器。
TRAC包括用来跟踪哪些***资源被使用以及哪些线程在使用它们的逻辑和存储器阵列(这里被称为“资源使用存储器”、“资源使用列表”或“RUL”)。RUL具有指示出每个线程已使用了哪些***资源的存储器项,以及指示出每个线程何时使用了这些***资源中的每个的存储器项。
现在参考图2,例示了根据本发明实施例的片上***200。与图1的***100相似,在***200中,处理器102和104共享PLB互连总线106,PLB 106进一步连接到OPB总线108、桥110以及存储器控制器112。(当然,本发明适用于具有多于两个处理器的***。增加存储器数量会增加***资源冲突。因此本发明在具有更多处理器的***中更加有用。)图2的OPB 108具有相关联的OPB时钟120,并根据其周期而工作。与***100相似,如图所示,***200包括多个***设备(通过未示出的***适配器连接于OPB 108):usb30、SATA、音频DAC、音频ADC、LCD、MAL、无线、uART、密码机、照相机、mpeg编码器、mpeg解码器和DMA。
除了传统***100的特征之外,***200包括TRAC 202。其与PLB 106相连,从而其可以监听总线上的事务。处理器102和104可以经由DCR总线204访问TRAC 202的DCR寄存器(图2中未示出)。DCR寄存器包含线程和***资源的状态信息,所述***资源包括图2中示出的usb30、SATA、音频DAC等。DCR寄存器指示出在特定时间处理器102和104可以运行的线程组合。
用于确定线程组合的概念性框图
候选线程查询
现在参考图3,所示出的框图例示了根据本发明实施例的用于确定特定线程在特定时间是否可以运行的候选线程查询的某些过程和结构。所示出的TRAC 202响应于在图3中被称为“已排队线程”302的查询。即,“可用处理器”304向TRAC 202指示出作为用于上下文交换的候选者的特定线程。在所例示的实例中,图2的处理器102和104可用,并且查询302的候选线程是线程3、6、4和9。这些线程3、6、4和9中的每个都以将在下文进一步解释的方式分别关联于图2中示出的某些***资源。具体而言,如已排队线程302中所示,线程3关联于IrDA和USB;线程6关联于JPEG和SATA;线程4关联于MAL;以及线程9关联于IIC。
TRAC 202包括用来跟踪哪些***资源被使用以及哪些线程在使用它们的逻辑和存储器阵列(图3中未示出)。这包括指示出每个线程已使用了图2的***usb30、SATA、音频DAC等中的哪些的存储器项(未示出),以及指示出每个线程何时使用了这些***资源中的每个的存储器项。因此,如图所示,TRAC 202经由OPB 108(图2)监视“当前运行线程”306。在所例示的实例中,线程1和7正在运行。线程1正在使用USB,而线程7正在使用MAL。TRAC 202通过指示出候选线程3、6、4和9中的哪些可以运行(即,指示出哪些线程将不会导致与当前运行线程1和7的资源冲突,以及通过暗示指示出哪些线程将会导致与线程1和7的冲突)而响应于特定查询302。在所示的示例中,如图所示,TRAC 202指示出“计划中线程”308:线程6和9可以运行,即,它们将不会导致冲突。
饥饿线程查询
现在参考图4,所示出的框图例示了根据本发明实施例的用于确定可以与饥饿线程一起运行的线程的查询的某些过程和结构。所示出的TRAC202响应于来自处理器的查询,在图4中被称为“饥饿线程”402。即,处理器102或104指示出TRAC 202用来确定可以与饥饿线程一起运行而不存在***资源冲突的特定线程。在所例示的实例中,该查询的饥饿线程是线程号3。TRAC 202以将在下文进一步解释的方式将此线程与图4中示出的某些***资源相关联。具体而言,线程3关联于IrDA和USB。
TRAC 202通过指示出现有线程中的哪些线程可以运行(即,不论这些线程是否正在运行,指示出哪些线程将不会导致资源冲突,以及通过暗示指示出哪些线程将会导致冲突)而响应于饥饿线程查询402。在所示出的示例中,线程5、7和9可以运行,即,它们将不会导致冲突,因为线程5与***MAL相关联,线程7与IIC相关联,而线程9与JPEG和SATA相关联,它们均与关联于线程3的***资源不同。
TRAC 202将所标识出的无冲突线程写入所分配的存储器阵列,作为线程过程标识符的列表404,在该列表末端为“00”。当然,可以使用不同的终止符号。
TRAC的框图
现在参考图5,所示出的高级框图例示了根据本发明实施例的TRAC202的某些方面。TRAC 202包括耦合于RUL线程分配逻辑504的RUL502,RUL线程分配逻辑504接着耦合于DCR总线接口506(图2)。TRAC202还包括耦合于PLB 106(图2)的总线监视逻辑508,其功能是监听在OPB 108(图2)上由处理器102和104(图2)的线程对***资源的访问。即,总线监视逻辑508监听PLB 106(图2)来确定线程在由处理器102和104(图2)执行之时的身份,以及确定特定线程正在访问的***usb30、SATA等(图2)的身份。因此,通过监听PLB 106,TRAC 202持续地跟踪哪些线程正在使用哪些***资源。
更具体地,***200上的操作***分配哪些线程在处理器102和104中的哪个上运行,并将这些线程分配用信号发送给总线接口单元506。控制单元510从总线接口单元506获得此信息。TRAC 202包括线程处理器映射寄存器(未示出),控制单元510将用于每个线程的项(包括线程过程标识符和用于线程的相关联处理器102或104的标识符)写入所述线程处理器映射寄存器中。这提供了线程到处理器的映射。
总线监视逻辑508还将用于相应***usb30、SATA等的项写入寄存器(未示出),所述项指示出处理器102和104用来访问***资源的地址。这提供了地址到***资源的映射。
在***200的工作期间,总线监视逻辑508在PLB 106上监视线程事务,并通过参考地址到***资源的映射来确定这种事务的目标***usb30、SATA、音频DAC等。总线监视逻辑508在操作上耦合于线程分配逻辑504,线程分配逻辑504接着耦合于RUL 502。总线监视逻辑508将***资源的使用传送给线程分配逻辑504,线程分配逻辑504将线程项写入其中,其提供了在RUL 502中的哪些线程正在使用哪些***资源的记录,如下文进一步描述的。
控制逻辑510经由DCR总线接口506从处理器102和104(图2)接收候选线程和饥饿线程查询,并作为响应将用于查询的线程的过程标识符传递到冲突逻辑512。TRAC 202的控制逻辑510耦合于冲突逻辑512和DCR总线接口506(图2)。冲突逻辑512还耦合于RUL 502,并可操作来读取RUL 502的项,以便对于给定查询的线程确定其它线程与该线程有什么***资源冲突以及没有什么***资源冲突。冲突逻辑512将答复返回到控制逻辑510,控制逻辑510接着经由DCR总线接口506答复处理器102和104。
更具体地,在对TRAC 202的查询中,处理器102或104包括用于线程的过程标识符和查询类型,其指示出该查询是否正在询问:i)所标识的线程是否与当前正运行的线程冲突(这里被称为“候选线程”查询),或者ii)存在与所标识的线程不冲突的什么线程(这里被称为“饥饿线程”查询)。过程标识符和查询类型被控制逻辑510写入DCR查询寄存器(未示出),接着冲突逻辑512执行在DCR查询寄存器中的所标识线程与RUL502中的线程之间的由查询类型所指定的特定比较或一系列比较,如下文将进一步描述的。
RUL
现在参考图6,示出了根据本发明实施例的用于跟踪哪些***资源被使用、它们何时被使用以及哪些线程在使用它们的RUL 502和线程分配逻辑504的相关联的“是否使用”逻辑602和“何时使用”逻辑604。RUL 502包括多个线程阵列,即,用于第一线程的第一阵列606、用于第二线程的第二阵列608等,出于例示性目的象征性地将这些线程阵列彼此堆叠地示出。每个线程阵列在结构上与图6上端象征性示出的线程阵列606相类似。
线程阵列606具有用于图2中的***资源的每一个的列、“是否使用”行610(其可以是寄存器)以及“何时使用”行612(其也可以是寄存器),“是否使用”行610在每一列中具有指示出相应列的***资源是否过去被关联于线程阵列606的线程所使用的存储器项,“何时使用”行612在每一列中具有指示出相应列的***资源在过去何时被相关联的线程所使用的存储器项。(应该理解,RUL 502的每一行可以是寄存器,而每一列可以是该寄存器中的一比特。因此,线程的“是否使用”行的列中的项在这里可以被称为“已使用”比特。)
应该理解,在本发明其它实施例中,存在与上述不同的布置。在一其它实施例中,与TRAC 202使用线程阵列606的“是否使用”行610以及“何时使用”行612(以及其它阵列,诸如阵列608等)不同,TRAC 202仅使用“何时使用”行612来确定***资源是否已被使用以及它何时被使用。
生成和移除RUL的项的可替换方式
在图6中示出的本发明实施例中,通过响应于周期计数器的“何时使用”逻辑604来生成线程阵列(诸如阵列606)的“何时使用”行612的项。在所例示的基于周期计数器的本发明实施例中,用于线程阵列606的“何时使用”行612的逻辑604包括PLB周期计数器逻辑614。(注意,在图2中,PLB 106具有相关联的PLB时钟120,并根据该时钟的周期进行工作。)用于关联于线程阵列606的线程的PLB周期计数器逻辑614对于“何时使用”行612的每一列周期性地输入PLB时钟120的周期的累计计数。(例如,这可以在PLB时钟120的每个周期后完成。)复位逻辑616监视PLB 106中的由相应处理器102和104(图2)对***usb30等的I/O访问,并将其用信号通知PLB周期计数器逻辑614以便每当该线程访问关联于这一列的***资源时复位该列的计数。因此,线程阵列606的列的行612中的计数越小,相关联的***资源被使用的时间就越近。
同样地,在本发明实施例中,通过“是否使用”逻辑602来生成线程阵列606的“是否使用”行610的项。“是否使用”逻辑602包括“已使用”逻辑618,其响应于访问***资源的与阵列606相关联的线程,从复位逻辑616接收信号以访问***资源并将所有列中与图2的***usb30等中的特定一个相关联的相应一列中的“是否使用”行610的比特设置为值“1”。“是否使用”逻辑602响应于该线程在超过预定时间间隔后仍未再次访问该***资源,将该比特复位为值“0”。即,在所例示的本发明实施例中,“是否使用”逻辑602包括“未使用”逻辑620,其读取对于该***资源的PLB时钟120的周期的累计计数,并响应于该累计计数超出预定阈值数则用信号通知“已使用”逻辑618将该比特复位为“0”。
在本发明的可替换实施例中,与PLB周期计数器逻辑614不同,“何时使用”逻辑604具有用于关联于线程阵列606的线程的线程访问计数器逻辑(未示出)。线程访问计数器逻辑首先响应于复位逻辑616用信号通知线程阵列606的阵列已访问“何时使用”行612的一列的***资源,将该列设置为预定值。线程访问计数器逻辑还监视PLB 106以确定该线程是否被暂停。响应于该线程被暂停而没有访问***资源,线程访问计数器逻辑减小“何时使用”行612中用于该***资源的列。另外,响应于该列的值被减小为“0”,线程访问计数器逻辑用信号通知“已使用”逻辑618将该列的“是否使用”行610复位。因此,对于本发明的可替换实施例,在线程阵列606的一列的“何时使用”行612中的累计计数越高,相关联的***资源被使用的时间就越近。
关于上述可替换方案,在***资源对线程透明的情形中,图6中示出的基于周期计数器的本发明实施例是有利的。例如,到存储设备的直接存储器存取写入可能无法使能中断,这使线程要知道对设备的写入何时完成变得复杂。即,除非线程查询该设备本身,否则TRAC 202将不会检测到对设备的写入已完成的任何指示。
TRAC工作的示例
再次参考图2和5,在示例性的实例中,***200正在工作。具体而言,处理器102正在运行以下线程:
使用USB30、密码机和SATA的线程0;
使用无线、MPEG解码器、LCD控制器和音频DAC的线程1;
使用MPEG编码器、MPEG解码器、音频adc、音频dac、lcd控制器、照相机和无线控制器的线程2;
使用SATA的线程3;以及
使用USB30的线程4。
处理器104正在运行使用音频ADC的线程5。
在这里如上所述,操作***知道哪些线程在处理器102和104中的哪个上运行,该信息经由总线接口506被传送到TRAC 202的控制单元510。总线监视逻辑508通过检测由处理器102或104对特定地址的I/O设备的I/O请求而确定线程正在使用哪个***资源。响应于来自总线监视逻辑508的信息,线程分配逻辑504将以下列举的序列分配给***资源,并将此分配映射写入寄存器。
[0]:USB30
[1]:SATA
[2]:音频DAC
[3]:音频ADC
[4]:LCD
[5]:MAL
[6]:无线
[7]:uART
[8]:密码机
[9]:照相机
[10]:MPEG编码器
[11]:MPEG解码器
(DMA未在以上列表中,因为它可以被配置来处理来自多个处理器的多个请求,并因此不会遇到冲突。)对于此情形,总线监视逻辑508监视在PLB 106上的线程事务,参照地址到***资源的映射,并作为响应而确定以上线程正在使用以上所指示的***资源。因此,监视逻辑508写入对于相应线程的“是否使用”行,诸如阵列606的行610(图6)。这提供了在RUL 502中的哪些线程正在使用哪些***资源的记录,如以下表1中示出的。
表1:RUL中对于各个线程的“已使用”比特
线程0 |
110000001000 |
线程1 |
001010100001 |
线程2 |
001110100111 |
线程3 |
010000000000 |
线程4 |
100000000000 |
线程5 |
000100000000 |
经过一段时间后,处理器102超时,并中断操作***进行上下文交换。操作***确定它将交换处理器102和104,并查询TRAC 202以找到可以并行运行的线程组。因此,处理器102或104之一发送查询到TRAC 202的控制逻辑510,控制逻辑510将查询写入DCR寄存器并将该查询通知冲突逻辑512。作为响应,冲突逻辑512执行在RUL 502的项之间的比较或一系列比较,这确定了没有冲突的四组线程。冲突逻辑512将无冲突线程的组写入四个DCR可读的寄存器,如以下表2所列举的。(寄存器数量对应于TRAC可计算的不同组的数量。在所例示的实施例中,四组无冲突线程是冲突逻辑可确定的最大值。在本发明其它实施例中,此数量可以不同。需要更多逻辑来确定更多组,这限制了组的数量。)
表2
子组Peg 0 |
0000_0023(线程0、1和5) |
子组Peg 1 |
0000_001C(线程2、3和4) |
子组Peg 2 |
0000_0032(线程1、4和5) |
子组Peg 3 |
0000_0038(线程3、4和5) |
应该理解,在表2中列举的寄存器值以十六进制格式示出。因此,例如,0000_0023表示以下的32比特:00000000000000000000000000100011,其在第一、第二和第五比特(表示第一、第二和第五线程)具有逻辑值“1”。寄存器宽度由TRAC 202可以追踪的线程的最大数量所确定,在所例示的实施例的示例中为32。表2示出了在上下文交换之时这些寄存器的状态。
在此示例中,操作***挑选线程2和3分别在处理器102和104上运行。操作***将此选择经由DCR总线108通知TRAC 202,并且线程分配逻辑504作为响应而更新线程到处理器的映射。
在经过再一段时间后,处理器102或104之一再次超时,并中断操作***来执行另一次上下文交换。操作***确定:不管冲突的可能性,线程1都必须被安排。操作***将此选择经由DCR总线204通知TRAC 202,并且控制逻辑510设置TRAC寄存器以指示仅包含线程1的子组。寄存器与TRAC 202可以管理的线程的最大数量等宽,在所例示的实施例中为32。因此,寄存器被设为“0x0000_0001”。冲突逻辑512执行在RUL 502的项之间的“饥饿线程”比较或一系列比较,这确定了可以与线程1一起运行而没有冲突的线程组。冲突逻辑512将无冲突线程的组写入四个DCR可读的寄存器,如以下表3所列举的。
表3
子组Peg 0 |
0000_0023(线程0、1和5) |
子组Peg 1 |
0000_0032(线程1、4和5) |
子组Peg 2 |
0000_0000无线程 |
子组Peg 3 |
0000_0000无线程 |
操作***挑选线程4与线程1一起运行,将此选择经由DCR总线204通知TRAC 202,并且线程分配逻辑504作为响应而再一次更新线程到处理器的映射。
用于确定线程是否可与当前运行的线程一起运行的过程
现在参考图7,所示出的流程图一般地例示了根据本发明实施例的TRAC操作。在702,当处理器102或104可用于开始交换新线程时,处理器102或104之一在704查询TRAC 202,以确定该处理器的候选线程之间的特定线程是否可以与已经在运行的其它线程一起运行。如果否,则处理器选择不同的候选线程,并重复704的查询,直到在706找到可以运行的线程为止。
当找到要运行的线程之后,处理器运行该线程。在708,TRAC 202进行监视以维持RUL 502对哪些线程使用哪些***资源的当前关注。具体而言,这包括在710检测以找到要停止的线程。在线程继续时,这包括TRAC 202在712监听线程对***资源的访问。如果检测到访问,则在714,TRAC 202检查已使用比特以查看所访问的***资源之前是否已被访问过。如果否,则在716,TRAC 202设置RUL 502中用于该线程的***资源比特,而TRAC 202的逻辑流继续到718。如果是,则在716该比特无需被设置。从而,TRAC 202的逻辑流跳过718,在718,TRAC将用于该线程的***资源的“最后使用”比特复位,以指示该***资源为最后使用的一个。接着TRAC 202的逻辑流返回框708以继续监视。
在710,当TRAC检测到线程停止时,TRAC 202的逻辑流沿分支到达702。并在704等待来自处理器对于新的候选线程的新查询。
用于确定线程是否可以与饥饿线程一起运行的TRAC逻辑
现在参考图8,所示出的根据本发明实施例的TRAC 202的冲突逻辑512的一部分用于确定给定线程(诸如饥饿线程,即处理器已确定必须运行的线程)是否具有与另一线程(诸如可用于与饥饿线程一起运行的线程)的***资源冲突。如图所示,饥饿线程的N个“已使用比特”的每个以及所述另一线程的相应的N个“已使用比特”的每个被分别输入到N个两输入与门,由冲突逻辑512中的与门802所表示。(记住,在这里如上所述,相应的“已使用比特”与给定***资源相关联。如果两线程的比特都被设置为逻辑“1”,这指示出两线程均已使用过相同的***资源,并因此两线程被认为存在冲突。)与门802输出的N个结果被输入到N输入或门804。如果这N个输入都不是“1”,则或门804的输出为“0”。接着,或门804的单个输出被输入到非门806,使得如果或门804的输出为“0”,则非门806的输出为“1”,这指示出没有冲突。
用于确定线程是否可以与当前运行的线程一起运行的TRAC逻辑
现在参考图9,所示出的根据本发明实施例的TRAC 202的冲突逻辑512的一部分用于确定一组特定线程是否具有与另一组特定线程的冲突。例如,这具有用于确定一组候选线程是否可以与已经在运行的一组线程一起运行的应用。RUL 502中每个线程的相应的“已使用比特”被输入冲突逻辑512中的若干对相应与门。即,在所例示的实例中,存在三个线程,每个线程具有N个已使用比特。一个线程的已使用比特被输入与门902和908,另一个线程的已使用比特被输入与门904和910,而另一个线程的已使用比特被输入与门906和912。(以与图8所例示的相同方式,图9中所示的与门902-912以及918均表示N个两输入与门。同样,或门914和916均表示N个三输入或门。)控制逻辑512中的控制使能逻辑922通过将每个所选择的与门声明为逻辑“1”而选择与门902-912中的哪些被使能。
因此,例如,如果处理器102向RUL 502指示出第一线程是候选线程,并且RUL 502已经确定第二和第三线程已经在运行,则控制使能逻辑922使能用于第二和第三线程的与门904和906,以及使能用于第一线程的与门908。接着将候选线程的相应“已使用比特”与第二和第三线程的相应比特进行比较。即,对于被声明过的第二或第三线程的每个比特,或门914的输出被声明,这指示出线程之一已使用了相应的***资源。或门914的输出被发送到与门918。同样,对于被声明过的第一线程的每个比特,或门916的输出被声明,并且或门916的输出被发送到与门918。
与门918比较或门914和916的N个输出,并且如果同一比特的输出均是逻辑“1”,则这指示出***资源冲突。与门918的N个输出被馈送给N输入或门920。如果对于在线程之间进行比较的任意“已使用比特”指示出没有冲突,则不会对或门920的所有输入进行声明,从而不会对或门920的输出进行声明,并且对于所比较的线程指示出没有冲突。
其它变体和一般注解
通过前述内容应该理解,由于本发明减少了线程进行交换时必须等待***资源的机会,所以本发明是尤其有利的。即,本发明提供了之前的***资源使用的适当收集的和存储的历史,其很可能指示出其后的***资源使用。响应于所存储的历史,线程资源分配逻辑有利地与处理器合作来选择要运行的线程。尽管这并不保证线程将不会遇到冲突和停止,但它减少了这种可能性。此外,本发明可以补充管理线程使用的其它方法,诸如当线程遇到冲突并被停止时交换线程的方法。
在各种实施例中,***200(图2)采用各种形式,包括个人计算机***、大型机计算机***、工作站、服务器等。即,应该理解,术语“计算机***”旨在包括具有执行来自存储器媒体的指令的处理器的任何设备。***200还可包括键盘、点击设备(例如鼠标)、非易失性存储器(例如ROM、硬盘、软盘、CD-ROM和DVD)以及显示设备。
***200的存储器存储程序指令(也被称为“软件程序”),程序指令可由处理器102和104执行来实现根据本发明的方法的各种实施例。各种实施例以各种方式实现一个或多个软件程序,包括基于过程的技术、基于组件的技术、和/或面向对象的技术等等。特定示例包括XML、C、C++对象、Java和商用类库。本领域普通技术人员将理解,图200中的硬件取决于实现方式可以不同。例如,除了图2中描述的硬件之外可以再使用其它***设备,或者用其它***设备取代图2中描述的硬件。所描述的示例并非暗示对本发明的体系结构上的限制。
在此使用了术语“逻辑”、“核”、“存储器”等。应该理解,这些术语指代作为集成电路芯片的设计的一部分的电路。芯片设计用图形计算机编程语言来创建,并被存储于计算机存储媒体(诸如盘、磁带、物理硬盘驱动器、或诸如存储存取网络中的虚拟硬盘驱动器)中。如果设计者未构造芯片或用于构造芯片的光刻掩模,则设计者直接或者间接地通过物理装置(例如通过提供存储了所得到的设计的存储媒体的拷贝)或者用电子方法(例如通过因特网)来将所得到的设计传送到这些实体。接着所存储的设计被转换为用于构造光刻掩模的适当格式(例如GDSII),其典型地包括将在晶片上构成的所述芯片设计的多个拷贝。光刻掩模被用来限定将被刻蚀或另外处理的晶片(和/或其上的层)的区域。
所得到的集成电路芯片可被构造者用原料晶片的形式(即,具有多个未封装芯片的单个晶片)作为裸片分发,或者以封装形式被分发。在后一情形中,该芯片被安装在单芯片包装(诸如具有附着于主板的导线的塑料载体或者其它高级载体)中或多芯片包装(诸如具有单表面或双表面互连或嵌入互连的陶瓷载体)中。在任意情形中,该芯片接着与其它芯片、分散的电路单元、和/或其它信号处理设备相集成,成为(a)中间产品(诸如主板)或(b)最终产品的一部分。最终产品可以是包括集成电路芯片的任何产品,其范围从玩具和其它低端应用到具有显示器、键盘或其它输入设备和中央处理器的高级计算机产品。
已经出于例示目的呈现了对本实施例的描述,但其不是穷尽性的,也并非将本发明限制于所公开的形式。许多修改和变体对于本领域普通技术人员来说将很明显。例如,应该理解,尽管已在完全运行的数据处理***的上下文中描述了本发明,并且尽管已根据基于硬件的逻辑描述了TRAC202,但是本领域普通技术人员将理解,TRAC 202的逻辑可以由对于处理器应用特定的集成电路来实现,其中本发明的过程能够用计算机可读媒体的指令的形式被分布。这种计算机可读媒体可具有多种形式。不管实际用来执行所述分布的信号承载媒体的特定类型如何,均可等同应用本发明。计算机可读媒体的示例包括可读类型的媒体(诸如软盘、硬盘驱动器、RAM和CD-ROM)和传输类型的媒体(诸如数字和模拟通信链路)。
另外,在此描述的本发明实施例中,线程分配是基于***设备的线程使用的历史(其可以作为一类计算(即处理、资源)来查看)。不过,其处于本发明的精神和范围内,以包括其中线程分配基于不同类型的计算资源的线程使用的历史的实施例。
还要注意,在此处上述的本发明实施例中,基于指示出线程已使用了完全不同的线程组的线程历史来选择线程。不过,在可替换方案中,如果本发明的计算机***具有多个饥饿线程,则操作***可以指引两个(或甚至更多个)饥饿线程运行而不管潜在冲突。即,选择饥饿线程来并行地运行,即便它们各自的历史指示出潜在的冲突。在一所述可替换方案中,如上所示比较所有饥饿线程的历史,选择具有最少数量的潜在冲突的线程来运行。在另一可替换方案中,选择具有数量少于某个阈值数量的潜在冲突的线程来运行。
作为重申,所选择和描述的实施例是为了最好地解释本发明的原理、实践应用,并使本领域普通技术人员能够理解本发明。具有多种修改的多种其它实施例可适合于所预期的特定使用,但也可处于本发明的范围内。
除了清楚明确说明之外,权利要求并非旨在暗示动作的任何特定顺序。所包括的用于权利要求一部分的诸如a)、b)、c)等的标号并非独立地暗示任何特定顺序,而是仅使得对这些部分的引用更方便。