用于自主硬件辅助的线程栈跟踪的装置与方法

文档序号:6426087阅读:103来源:国知局
专利名称:用于自主硬件辅助的线程栈跟踪的装置与方法
技术领域
本发明总的涉及一种改进的数据处理系统。具体地讲,本发明提供了一种用于获取数据处理系统中性能数据的方法与装置。更具体地讲,本发明提供了一种在获取关于线程栈的性能数据的过程中用于软件工具的硬件辅助的方法与装置。
背景技术
在分析和提高数据处理系统和执行于该数据处理系统中的应用的性能的过程中,了解数据处理系统中哪些软件模块正在使用系统资源将是有益的。数据处理系统的有效的管理和提高,需要了解各种系统资源是如何被使用的以及何时被使用的。性能工具用于监视和检查数据处理系统,以确定各种软件应用正执行于数据处理系统中时资源的消耗情况。例如,性能工具可以识别数据处理系统中最频繁执行的模块和指令,或可以识别那些分配了最大量存储器或进行了最多I/O(输入/输出)请求的模块。可以把硬件性能工具建造于该系统中,或者晚些时候将其添加到该系统中。
一种已知的软件性能工具是追踪工具。追踪工具可以使用一种以上的技术,以提供指示一个正在执行程序的执行流程的追踪信息。一种技术,即所谓的基于事件的特征测试(profiling)技术,通过在某些事件发生时对它们加以登记,以保持对指令的特定序列的跟踪。例如,追踪工具可以登记每次进入到模块、子程序、方法、功能、或系统部件,或者每次从它们之中退出。或者,追踪工具也可以针对每一存储器分配请求来登记请求者和所分配的存储器的数量。通常,为每一这样的事件制作一个加有时间标记的记录。也把类似于进入-退出记录的相应的记录对用于追踪任意代码段的执行、启动和完成I/O或数据传输、以及许多其它所关注的事件。
为了改进不同系列计算机所生成的代码的性能,常常需要判断在执行代码的过程中,处理器正在把时间花费在什么地方,在计算机处理技术领域,这样的努力通常作为定位“热点”而被人所知。理想的情况是,人们希望在代码级的指令与/或源行上孤立这样的热点,以把注意力集中在从对代码的改进中可能受益最大的区域。
另一种追踪技术涉及对程序的执行流程周期性地取样,以识别程序中的某些位置,即在这些位置,程序似乎要花费大量的时间。这一技术基于这样的概念按有规律的间隔周期性地中断应用或数据处理系统的执行,即所谓的基于样本的特征测试。在每一个中断处,在预先确定的时间长度,或按预先确定的所关注事件的数目,记录信息。例如,在间隔期间,可以记录当前正在执行的线程的程序计数器,其中线程是正在进行特征测试的较大程序的可执行部分。可以在后期处理期间针对数据处理系统的加载映射和符号表信息解析这些值,而且根据这一分析,可以获得“时间花于何处”的特征。
创建工具,如那些用于发现与特定情况或问题相关的答案的工具,由于软件工具本身对所测系统的影响,可能需要付出很大的努力,而且很难加以校准。本发明认识到,用于工具开发和问题分析的硬件辅助,可以显著缓解开发软件性能工具所需的努力。另外,随着处理器密度的增大,硬件辅助可以被包括在内,以提供另外的调试和分析特性。
因此,提供一种用于向分析数据处理系统的性能的性能工具提供硬件辅助的改进的方法、装置、以及计算机指令,将是有益的。

发明内容
本发明提供了一种用于在追踪计算机程序期间提供一种用于跟踪线程栈的自主机制的方法与装置。本发明包括允许处理器自主地为每一存储了调用栈的线程保持工作区的硬件辅助机制。
根据本发明,当将对计算机程序进行追踪时,追踪软件,即性能监视应用,通知该计算机系统的处理器开始在线程工作区中保持线程调用栈信息。例如,可以这样实现这一点通过在该处理器的控制位寄存器中设置控制位,以指示将进行线程跟踪。
操作系统或追踪应用的一部分,分配数据区,以用作存储线程调用栈信息的线程工作区,其中追踪应用为操作系统的核心扩展或设备驱动器,以下将其简称为该计算设备的操作系统。处理器为计算机程序执行过程中的每一个线程保持工作区,该工作区的大小是基于核心扩展操作系统所通知的大小加以确定和加以分配的。工作区由存储在处理器的控制寄存器中的地址和长度信息加以指定。从而,第一控制寄存器存储开始存储器地址作为线程的线程工作区的开始,第二控制寄存器存储该工作区的长度或大小,以及第三控制寄存器指示该栈的顶。
根据需要,例如操作系统的指令,通过针对线程扩展线程工作区和重新在线程控制寄存器中设置其长度,可以增加线程的工作区的大小。当存储在线程工作区中的线程跟踪信息的数量将超过线程工作区时,处理器可以向操作系统发送中断以扩展线程工作区。然后,操作系统可以分配更大范围的存储器地址,来存储线程跟踪信息、重新设置存储在控制寄存器中的存储器地址和长度、并把已存储的线程跟踪信息拷贝到新的线程工作区。
处理器包含微代码,当设置了控制位时,这一微代码用于使处理器自动地把线程跟踪信息存储在由该处理器的控制寄存器所指定的工作区中。当处理器执行调用指令时,自动地把与所调用的方法/例程相关的信息存储在适当的线程工作区中,即把方法/例程信息推入调用栈,并指示具体方法/例程的入口。当处理器执行返回指令时,处理器自动地从线程工作区中的调用栈删除该方法/例程信息,即通过调整指向栈顶的控制寄存器,从该调用栈中弹出该方法/例程调用栈入口。
然而,在替代的实施例中,不是从调用栈中弹出方法/例程入口,而是调用栈中的各入口可以或者指示方法/例程的入口,也可以或者指示方法/例程的出口。在这样的替代的实施例中,由于进入方法/例程的入口或退出该方法/例程的出口具有多个单个的入口,而且这些单个的入口指示了它们是否与一个入口或一个出口相关,所以无论是否要添加该入口,都要添加该调用栈的入口。
按照这一方式,线程工作区包括一些硬件生成的线程跟踪信息,软件应用可以使用这些线程跟踪信息以获得用于分析计算机程序的执行的追踪数据。例如,一个追踪应用可以周期性地“醒来”,并通过观察线程工作区来获取追踪数据的快照,以获取关于计算机程序的执行的当前状态的信息。追踪应用可以观察所有的当前的线程工作区、仅针对当前执行的线程的工作区、处于挂起(suspended)状态的线程的工作区等。
本发明利用了这样一个事实根据处理器所执行的指令,该处理器知道其何时进入和退出方法/例程。因此,不是让软件程序监视计算机程序的执行,来确定何时进入/退出方法/例程,以及向软件保持的调用栈写入信息,而是本发明能够使处理器硬件自动地把必要的信息写入线程工作区。在这一方式下,独立于软件追踪算法进行线程栈的保持。结果,用于跟踪计算机程序的执行的软件中的变化,不影响用于保持该线程调用栈的机制。
在以下对优选实施例的详细描述中,将描述本发明的这些和其它特性及优点,通过这一描述,这一技术领域中的普通熟练技术人员将会明显体会到本发明这些和其它特性及优点。


所述权利要求中阐述了被视为本发明特征的新颖特性。然而,参照以下对一个说明性实施例的详细描述并结合附图阅读时,将可最全面地了解这一发明本身、使用本发明的优选模式、以及本发明的进一步的目的和优点,在这些附图中图1是其中可以实施本发明的分布式数据处理系统的示例性图示表示;图2A是其中可以实施本发明的一些方面的服务器数据处理系统的示例性框图;图2B是其中可以实施本发明的一些方面的独立的或客户机数据处理系统的示例性框图;图3是示例性框图,描述了用于对数据处理系统中的处理过程进行性能追踪的部件;图4是一个示例图,描述了对运行在系统上的工作负载进行性能追踪的各个阶段;图5说明了根据本发明的一个示例性实施例的主要操作部件;图6说明了根据本发明的一个示例性实施例,处理器中控制寄存器的使用;图7说明了根据本发明的一个示例性实施例的数据流程;图8是流程图,描述了根据本发明的示例性实施例,用于启动硬件线程跟踪的示例性操作;图9是流程图,描述了根据本发明的示例性实施例,用于向线程工作区写线程跟踪信息的示例性操作;以及图10是流程图,描述了根据本发明的示例性实施例,用于处理存储在线程工作区中的线程跟踪信息的示例性操作。
优选实施例本发明提供了一种硬件辅助机制,用于自动地并且独立于用于追踪计算机程序的执行的追踪算法地保持线程跟踪信息。可以在独立的计算设备中或在基于网络的计算设备中实施本发明。例如,本发明可以实施于个人计算机、网络计算机、服务器等。因此,下面图1~2B中的图是为了向以下所描述的操作提供环境。
现在,参照这些图,特别是参照图1,图1描述的是其中可以实施本发明的分布式数据处理系统的图形表示。分布式数据处理系统100是其中可以实施本发明的计算机网络。分布式数据处理系统100包括网络102,在分布式数据处理系统100中,网络102是用于在连接在一起的各种设备和计算机之间提供通信链路的媒介。网络102可以包括永久性连接,例如电线或光纤缆线,或者通过电话连接所实现的临时连接。
在所描述的例子中,服务器104以及存储器单元106连接于网络102。另外,也把客户机108、110以及112连接于网络102。例如,这些客户机108、110以及112可以是个人计算机或网络计算机。出于这种应用的目的,网络计算机可以是任何耦合于网络的计算机,其从耦合于该网络的另一计算机接收程序或其它应用。在所描述的这一例子中,服务器104向客户机108~112提供数据,例如引导文件、操作系统映像(image)以及应用程序。客户机108、110以及112是针对服务器104的客户机。分布式数据处理系统100可以包括另外的服务器、客户机、以及其它未示出的设备。在所描述的这一例子中,分布式数据处理系统100是具有网络的102的因特网,代表了世界范围网络与网关的集合,这些网络与网关使用TCP/IP协议组相互通信。因特网的核心处是主节点或主计算机之间的高速数据通信线路的主干网(backbone),由成千上万的路由数据和消息的商业、政府、教育和其它计算机系统组成。当然,分布式数据处理系统100也可以被实施为许多不同类型的网络,例如内联网(Intranet)或局域网。
图1作为示例,并不是对于本发明各处理过程的体系结构的限制。这一技术领域中的普通熟练技术人员将很容易意识到可以使用所描述的这一分布式数据处理系统或其修改形式实施本发明。
现在,参照图2A,根据本发明,描述了数据处理系统的示例性框图,该数据处理系统可以被实施为服务器,例如图1中的服务器104。数据处理系统200可以是包括多个连接于系统总线206的处理器202和204的对称多处理器(SMP)系统。或者,也可以使用单处理器系统。连接于系统总线206的还有存储器控制器/高速缓冲存储器208,存储器控制器/高速缓冲存储器208向本地存储器209提供接口。I/O总线桥210连接于系统总线206,并向I/O总线212提供接口。可以按所描述的把存储器控制器/高速缓冲存储器208与总线桥210集成在一起。
连接于I/O总线212的外围部件互连(PCI)总线桥214向PCI局部总线216提供接口。可以把调制解调器218连接于PCI局部总线216。典型的PCI总线的实施将支持4个PCI扩展槽或添加连接器。可以通过经由添加板连接于PCI局部总线216的调制解调器218和网络适配器220,向图1中的网络计算机108~112提供通信链路。
附加的PCI总线桥222和224为附加的PCI总线226和228提供了接口,通过这些接口,可以支持附加的调制解调器或网络适配器。在这一方式下,服务器200允许与多个网络计算机的连接。也可以把存储器映射的图形适配器230和硬盘232直接或间接地连接于所描述的I/O总线212。
这一技术领域中的普通熟练技术人员将会意识到图2A中所描述的硬件是可变的。例如,其它的外围设备,例如光盘驱动器等,也可用于向所描述硬件添加或取代所描述硬件。所描述的这一例子,不意味着对本发明体系结构上的限制。
例如,如图2A中所描述的数据处理系统可以是IBM RISC/System 6000(国际商用机器公司 精简指令集计算机/系统6000)系统,这是位于纽约Armonk(阿尔蒙克)的国际商用机器公司(International Business Machines公司)的产品,运行在Advanced Interactive Executive(AIX,高级交互执行体)操作系统上。
现在参照图2B,图2B是框图,说明了其中可以实现本发明的数据处理系统。数据处理系统250可以是独立的计算设备,或者也可以是客户计算机的一个例子,例如图1中所示的客户计算机。数据处理系统250使用了一个外围部件互连(PCI)局部总线体系结构。尽管所描述的例子使用PCI总线,然而也可以使用其它的总线体系结构,例如Micro Channel(微通道)和ISA(工业标准结构)。通过PCI桥258把处理器252和主存储器254连接于PCI局部总线256。PCI桥258也可以包括用于处理器252的集成的存储器控制器和高速缓冲存储器。也可以通过直接部件互连或通过添加板,向PCI局部总线256进行另外的连接。在所描述的这一例子中,通过直接部件连接把局域网(LAN)适配器260、SCSI(小型计算机系统接口)主机总线适配器262、以及扩展总线接口264连接于PCI局部总线256。相比之下,通过插入扩展槽中的添加板,把音频适配器266、图形适配器268、以及音频/视频适配器(A/V)269连接于PCI局部总线266。扩展总线接口264为键盘和鼠标器适配器270、调制解调器272以及附加存储器274提供了连接。在所描述的这一例子中,SCSI主机总线适配器262为硬盘驱动器276、磁带驱动器278、以及CD-ROM(光盘-只读存储器)280提供了连接。典型的PCI局部总线的实施将支持3或4个PCI扩展槽或添加连接器。
在图2B中,操作系统运行在处理器252上,并用于协调数据处理系统250中的各个部件,以及提供对这些部件的控制。这一操作系统可以是市场上可见的操作系统,例如JavaOS For BusinessTM(用于商务的Java操作系统)或OS/2TM(操作系统/2),可以从国际商用机器公司获得这两种操作系统。从网络上的服务器把JavaOS加载到网络客户机上,而且JavaOS还支持Java程序和小应用程序。如下文所描述的,几个有利于通过栈展开(unwind)进行追踪的JavaOS特点是,JavaOS不支持分页(paging)或虚拟存储器。面向对象的编程系统,例如Java,可以与该操作系统相结合而运行,并且可以从在数据处理系统250上执行的Java程序或应用提供对该操作系统的调用。可以把该操作系统、面向对象的操作系统、以及应用或程序的指令加载到存储器设备中,例如硬盘驱动器276中,也可以将它们加载到主存储器254中,以由处理器252加以执行。当把数据处理系统250用作网络客户机时,通常不具有硬盘驱动器,而且存储器也受到限制。
这一技术领域中的普通熟练技术人员将会意识到,图2B中的硬件可以随具体实施而加以改变。例如,其它外围设备,如光盘驱动器等,可以用于增加到或代替图2B中所描述的硬件。所描述的这一例子,并不意味着对本发明体系结构的限制。例如,本发明的各处理过程,也可应用于多处理器数据处理系统。
本发明提供了一种自动存储硬件生成的线程跟踪信息以供其后由追踪应用和后处理器应用使用的方法和装置,其中自动存储硬件生成的线程跟踪信息指的是不需要跟踪软件应用的干预来指令线程跟踪信息的存储。在一个示例性实施例中,操作系统为线程跟踪信息分配工作区。可以根据追踪应用提供工作区的大小。可以把追踪应用设置在与处理器所在计算设备相同的计算设备上,或者可以设置为远离处理器所在的计算设备,所述处理器将自动生成线程跟踪信息。
将把本发明的硬件辅助机制用于保持跟踪应用或后处理应用所使用的信息,以获得追踪计算机程序的执行的性能信息。因此,将给出对追踪应用和后处理应用的简要的描述。
现在参照图3。图3是框图,描述了用于对数据处理系统中的处理过程进行性能追踪的部件。把追踪程序300用于特征测试处理过程302。追踪程序300可以用于根据在异常分支(hook)执行时记录数据,其中异常分支是例程或程序中其它例程可以被连接的特定位置上的一段特殊的代码。为了进行调试、性能分析、或改善功能,通常插入追踪异常分支。使用这些追踪异常分支把追踪数据发送至追踪程序300,追踪程序300把追踪数据存储在缓冲器304中。接下来,可以把缓冲器304中的追踪数据存储在一个文件中用于后处理,或者也可以实时地处理该追踪数据。然后,如以下更全面加以描述的,由后处理器306处理缓冲器304或追踪文件中的追踪数据,以生成针对所加载的模块的符号数据的索引数据库。
在非Java环境中,可以把追踪异常分支用于辅助对这样的模块的识别,即这些模块在被追踪的应用中使用。若使用Java操作系统,则可以把追踪异常分支用于辅助对所加载的类和方法的识别。
另外,由于可以加载和卸载类和模块,所以也可以通过使用追踪数据识别这些变化。这特别涉及“网络客户机”数据处理系统,例如那些可以在JavaOS操作系统下操作的数据处理系统,因为类和运行时编译执行的(jitted)方法可能因有限的存储器并因作为网络客户机而被更频繁地加载和卸载。注意,在嵌入式应用环境中也涉及类或模块的加载和卸载信息,在嵌入式应用环境中,通常存储器会受到限制。
现在参照图4,图4描述了对运行在一个系统上的工作负载进行性能追踪的各个阶段。由于受到存储器的限制,所以为了对具体程序进行特征测试,所生成的追踪输出的长度及详细度,可以仅与分析者所要求长度和详细度一样。
初始化阶段400用于捕获追踪启始时的客户机的状态。这一追踪初始化数据包括识别所有现存线程的追踪记录、所有所加载的类(模块)、以及所有针对所加载的类(模块)的方法(段(section))。写入来自于从异常分支所捕获的追踪数据的记录,以指示线程转换、中断、以及类(模块)和“运行时编译执行”方法(段)的加载与卸载。
任何被加载的类(模块)都拥有指示类(模块)及其方法(段)的名字的追踪记录。在所描述的这一例子中,把4个字节的ID(识别)用作线程、类、以及方法的标识符。把这些ID与已经输出于追踪记录中的名字相关联。写追踪记录,以指示何时已经写完所有的启动信息。
接下来,在特征测试阶段402期间,把追踪记录写入追踪缓冲器或追踪文件。在本发明中,追踪缓冲器可以具有多种类型的记录的组合,例如,那些可能因响应特定类型的事件,例如方法进入或方法退出,而执行的追踪异常分支所产生的记录,以及那些可能因响应计时器中断,例如栈展开,而执行的栈查看(walking)功能所产生的记录,也叫做调用栈记录。
例如,如果特征测试工具的用户已请求了基于样本的特征测试信息,则在特征测试阶段期间可能出现下列操作。每当一个特定类型的计时器中断出现时,写一个追踪记录,这一追踪记录指示系统程序计数器。这一系统程序计数器可用于识别被中断的例程。在所描述的这一例子中,把计时器中断用于启动对追踪数据的采集。当然,也可以采用除计时器中断之外的其它类型的中断。例如,可以使用基于编程性能监视事件或其它类型周期性事件的中断。
在后处理阶段404中,对跟踪缓冲器中所收集的数据进行处理,并将它们发送到一个跟踪文件,以进行后处理。在一个配置中,可以将该文件发送到一个服务器,这一服务器为客户机上的各个过程确定特征测试。当然,根据可用资源的情况,也可以在客户机上进行后处理。
采用本发明,不必使用异常分支来把线程跟踪信息写入追踪缓冲器,本发明使用硬件辅助来自动检测计算机程序的执行何时进入和退出方法/例程,以及何时把线程跟踪信息写入指定的线程工作区。因此,本发明不需要把正在执行的计算机程序设置为能够确保存储线程跟踪信息以备以后处理。而且,一旦启动,本发明将独立于追踪应用而操作。因此,可以把本发明随多个不同的追踪应用一起使用。
现在参照图5。图5说明了根据本发明的一个示例性实施例的主要操作部件。采用本发明,在性能追踪程序的初始化阶段期间,例如在图4中的初始化阶段402中,追踪程序代码520可以指令操作系统540关于将分配给计算机程序的线程的工作区的大小,并且可以在处理器510中设置控制位,以指示将进行的硬件线程跟踪。然后,操作系统540可以分配一部分系统存储器530,以用作线程跟踪信息的工作区。然后,可以把工作区的开始地址和长度存储在处理器510的控制寄存器514中。
当在计算机程序的执行期间启动线程时,操作系统540可以分配其中将存储线程的调用栈信息的工作区532~538,为计算机程序中的每一个现存的线程分配一个工作区。可以把存储器的每一部分的开始地址和长度存储在处理器510的相应的控制寄存器514中。另外,也可以把控制寄存器用于识别被写入入口的最后的工作区。在这一方式下,可以识别当前活跃的线程工作区。可以用每一环境转换(context switch)来更新这一控制寄存器中的值。因此,本发明可以利用多个工作区,对每一个现存的线程使用一个工作区,来保持线程跟踪信息。
使用指令对微代码512进行编程,以建立工作区和监视指令的执行,从而能够确定如何更新工作区中的线程跟踪信息。微代码512为一个永久性存储器,其中装有计算机必须针对其指令集中的每一指令所执行的基本电路操作。微代码512用作计算机的指令和电子层之间的一个翻译层。本发明改进了人们所熟悉的微代码,使其包括了此处的所讨论的附加的功能与操作。
因此,操作系统540为每一现存的线程分配一部分存储器530,用于存储一或多个工作区。这一部分存储器530的大小等于追踪应用代码520向操作系统540通告的大小。然后,微代码512开始监视处理器510所执行的指令,以确定是否产生了新的线程、是否发生了存储器溢出、是否执行了方法/例程进入指令、以及是否执行了方法/例程退出指令。
如果产生了新的线程,则可以在系统存储器530中创建新的工作区,而且可以把环境转换通知微代码512,使得可以更新识别所访问的最后工作区的寄存器中的值。如果出现存储器溢出,则可以扩展相关线程的工作区。如果执行了方法/例程进入指令,则在适当的工作区中创建针对该方法/例程的调用栈入口,表示方法/例程的进入,即把调用栈入口压入该调用栈中。如果执行了方法/例程退出指令,则从适当的工作区中删除针对该方法/例程的调用栈入口,表示方法/例程的退出,即从栈中弹出相应于该方法/例程的调用栈入口。或者,也可以把针对方法/例程的退出的调用栈入口装入工作区的调用栈,而不是从调用栈中弹出方法/例程。以下将逐一描述这些操作。
如果在被追踪的计算机程序的执行期间产生了一个新的线程,以及通过对处理器510中控制位的设置,在处理器510中使能了线程跟踪,则需要一个新的工作区以跟踪线程的执行。操作系统540可以根据环境转换的通告确定是否已产生了一个新的线程。与初始化期间工作区的分配相类似,通过对控制寄存器514进行设置,使其指向工作区的开始,并指定系统存储器530中工作区的长度,操作系统540可以为这一新的线程分配一个新的工作区。接下来,当该新的线程导致一个事件发生时,例如导致方法/例程的进入或退出时,将把一个入口写入工作区,或将其从工作区中删除,用于拥有追踪应用/后处理器所使用的必要信息的新线程。
如果按照处理器510所执行的指令是否为一条“调用”指令来确定处理器510执行了方法/例程进入指令,则微代码512确定是否处理器510中使能了线程跟踪。即微代码512确定是否设置了识别线程跟踪将被使能的控制位。如果设置了这一控制位,并且处理器510执行了方法/例程进入指令,则微代码512确定已发生了要求为相关的线程在工作区中创建和存储调用栈入口的调用栈事件。
微代码512通过从控制寄存器514检索地址信息,识别线程的工作区的开始地址,并判断工作区中是否有足够的空间写入该事件的调用栈入口。可以通过把控制寄存器514中所指定的工作区的长度与写入工作区的调用栈中的最后入口的位置进行比较,实现这一判断。如果工作区拥有足够的剩余存储空间,则生成该事件的调用栈入口,并将其存储在该线程的工作区中,例如存储在线程工作区532。例如,这一调用栈入口可以包括所调用的方法/例程的地址。
如果对于一个新的调用栈入口来说,线程的工作区,例如线程工作区532,没有足够的存储容量,则微代码512把这一情况识别为工作区或存储器溢出。因此,微代码512经由操作系统540向追踪应用代码520发送指示工作区溢出的中断。作为响应,追踪应用代码520可以指令操作系统540把该线程的工作区扩展一定量的存储空间。
响应于扩展该线程工作区的指令,操作系统540可以为工作区分配一个新的大于先前范围的存储器地址范围。然后,可以对控制寄存器514进行设置,使其指向存储器地址的这一新范围的开始处。接下来,可以指定这一存储器地址范围的新的大小,然后,把先前工作区中的调用栈入口信息拷贝到这一新工作区。
与以上关于方法/例程的进入操作相类似,处理器510可以通过执行计算机程序代码中的“返回”指令检测出退出了方法/例程。当执行了“返回”指令时,处理器510可以首先判断是否设置了用于硬件辅助的线程跟踪的控制位。如果设置了硬件辅助的线程跟踪的控制位,则处理器510可以调整指向栈的末尾的寄存器的值,并在相应于正退出的方法/例程的调用栈的末尾处弹出一个入口。可以首先检索指示当前线程工作区的控制寄存器的值,以判断对于相应的方法/例程调用栈入口应搜寻哪一工作区。下面,可以把该方法/例程调用栈入口弹出该调用栈。
或者,如以上所描述的,当检测到“返回”指令时,取代从方法/例程的调用栈中弹出入口,本发明可以添加指定方法/例程的出口的附加的入口。在这一方式下,取代删除被退出的方法/例程的入口,在线程的执行期间该调用栈保持关于所进入和所退出的每一方法/例程的信息。
于是,当处理器510执行正在被追踪的计算机程序的指令时,操作系统540自动为新产生线程分配新的工作区,响应于对入口/出口方法/例程事件的检测,把调用栈入口写入线程工作区,并且当需要时扩展工作区。因此,本发明的硬件机制有助于缓解完全以软件执行这些操作的一部分负担。而且,由于可以独立于追踪应用和正在被追踪的计算机程序虚拟地操作该硬件,所以对于这些操作而言,可以不管正在执行的具体的追踪应用或计算机程序而执行这些操作。另外,不需要把正在被追踪的计算机程序设置为获取调用栈信息,因为一旦追踪应用指出线程跟踪将被使能,则处理器可自动获得这一信息。
应该认识到,在追踪计算机程序的过程中,可以在任何时刻启动本发明的以上所描述的操作。因此,可能出现这样一种情况已经启动了本发明的机制,而方法调用当前尚未完成,即已进行了方法调用,而且在退出被调用的方法之前启动本发明。当处于调用栈模式时,可以在不进行调用操作的情况下,执行返回操作,同时本发明处于工作状态。在这些情况下,就像处理空操作一样,处理这样的返回操作。
图6说明了根据本发明的一个示例性实施例,处理器中控制寄存器的使用情况。如图6中所示,处理器610包括控制位寄存器612、控制寄存器614、以及控制寄存器616。存储器620,例如其可以是系统存储器,包括由操作系统所分配的线程工作区622。当把一个入口写入线程工作区622将超过分配给工作区622的地址的范围时,可以扩展这一线程的工作区。把工作区622的扩展描述为扩展624,虽然该扩展可能导致完全不同的给由元素622和624组成的工作区分配的地址集合。
如图6中所示,把控制位寄存器612用于识别处理器610中何时使能了线程跟踪。即当追踪应用初始化了对计算机程序的追踪时,则追踪应用可以对控制位寄存器612进行设置,以指示处理器610的微代码应该开始自动跟踪线程的执行。
因此,操作系统在存储器620中分配工作区622。这一工作区622包括存储器地址的一个范围,将把调用栈入口写入这些存储器地址中。处理器610的微代码对控制寄存器614和616进行设置,以使其指向工作区622的开始地址和长度。于是,如果正在被追踪的计算机程序产生了多个线程,而且将把工作区用于每一现存的线程,则将把多个控制寄存器组614和616用于存储存储器620中的多个工作区622的开始地址和长度。
当执行的线程涉及正在执行要求在该线程的工作区622中创建并存储调用栈入口的指令的处理器610时,处理器610的微代码根据存储在控制寄存器614和616中的地址识别该工作区622,并试图把入口写入工作区622。如果由于所分配的工作区622中没有足够的存储空间而使入口的写入不能完成,即该写入是企图向大于或超出与存储在控制寄存器616中的长度相关的地址范围的地址所进行的写入,则处理器610的微代码识别存储器或工作区溢出,并且可以向该追踪应用发送中断。
响应于对这一中断的接收,与该追踪应用相关的中断处理程序可以指令操作系统为该线程扩展工作区。响应于这一扩展工作区的指令,操作系统可以重新分配工作区622,以包括扩展区624。这样的重新分配可能导致工作区有完全不同的地址范围,或可能包括最初的地址范围加上扩展624的附加的地址集合。在每一种情况中,对控制寄存器614和616进行更新,以使它们指向包括元素622和624的工作区的适当的开始地址和长度。在这一方式下,在计算机程序的追踪期间,操作系统可以动态地为线程跟踪扩展工作区。
如以上所提到的,处理器的微代码继续自动地把调用栈入口写入存储器的相应的工作区,直至完成对计算机程序的追踪,或直至通过线程跟踪控制位的重新设置被指令中止线程跟踪。追踪应用与/或后处理器可以使用存储在工作区中的信息,对正在被追踪的计算机程序进行性能评估。
例如,追踪应用可以周期性地“醒来”,并通过观察线程工作区以获取追踪数据的快照,从而获取关于计算机程序的执行的当前状态的信息。追踪应用可以观察所有当前的线程工作区、仅针对当前正在执行的线程的工作区、那些处于挂起状态的线程工作区等。
在一个示例性实施例中,追踪应用可以周期性地醒来,例如每10毫秒醒来一次,并把某些所关注的线程工作区的内容拷贝到追踪缓冲器中。这将提供计算机程序执行的快照。然后,后处理器对这些快照进行分析,以确定计算机程序执行的性能度量。
图7说明了根据本发明的一个示例性实施例的数据流程。如图7中所示,操作以追踪应用710开始,追踪应用710告知操作系统715用于存储线程跟踪信息,例如调用栈信息,的工作区的大小,并指令处理器720设置控制位寄存器中的线程跟踪使能控制位。可以把该大小信息存储在寄存器中,以备以后当为所产生的线程分配新工作区时使用。
然后,操作系统715通过为每一线程分配存储器730中的地址范围,为计算机程序的现存的线程分配新的工作区。接下来,处理器720对控制寄存器进行设置,使它们指向每一工作区的开始地址,并存储每一工作区的长度。此后,当发生调用栈事件时,把处理器720调用栈入口写入存储器730中的适当的工作区。
在此后的某一时刻,追踪应用710可能会醒来,并且追踪应用可以向处理器720请求线程调用栈信息。然后,处理器720可以把线程工作区地址信息返回到追踪应用710。接着,追踪应用710可以经由操作系统715从存储器730检索所关注的线程的调用栈信息。然后,所检索的所关注的线程的调用栈信息可以由追踪应用710加以处理,或将它们存储在数据结构中,以供后处理程序进行分析。
图8是流程图,描述了根据本发明的示例性实施例的用于启动硬件线程跟踪的示例性操作。图9是流程图,描述了根据本发明的示例性实施例,用于向线程工作区写线程跟踪信息的示例性操作。图10是流程图,描述了根据本发明的示例性实施例,用于处理存储在线程工作区中的线程跟踪信息的示例性操作。
将认识到,流程示中的每一个框,以及流程示中框的组合,可以通过计算机程序的指令加以实施。可以把这些计算机程序指令提供于处理器或其它可编程的数据处理装置,以产生这样一个机制执行在处理器或其它可编程的数据处理装置上的指令,可创建用于实施流程图一个或多个框中所指出的功能的方法。可以把这些计算机程序指令存储在计算机可读的存储器或存储媒介中,这些计算机程序指令可指导处理器或其它可编程的数据处理装置以特定的方式加以运作,以致于存储在计算机可读的存储器或存储媒介中的指令可以制造出一件产品,包括实施流程图一个或多个框中所指出的功能的指令方法。
因此,流程图说明的各个框支持用于执行指定功能的方法的组合、用于执行指定功能的步骤的组合、以及用于执行指定的功能的程序指令方法。还将应认识到可以通过执行指定功能或步骤的基于专用硬件的计算机系统,或通过专用硬件和计算机指令的组合,实施流程图说明的每一个框,以及流程图说明的框的组合。
现在参照图8。通过启动对代码执行的追踪,开始用于启动硬件线程跟踪的操作(步骤810)。然后,设置用于存储线程跟踪信息的控制位(步骤820),并告知操作系统线程的工作区的大小(步骤830)。接下来,操作系统根据这一大小为现存的线程分配工作区(步骤840),并对控制寄存器进行设置,以使它们指向开始地址并存储每一工作区的长度(步骤850)。然后,终止操作。
现在参照图9,通过处理器微代码检测对调用/返回指令或操作的处理,开始把线程跟踪信息写入线程工作区的操作(步骤910)。判断指令是否为调用指令(步骤915)。如果指令为调用指令,则判断该调用是否来自新的线程(步骤920)。如果该调用不是来自新的线程,则判断把入口写入现存线程的工作区是否导致工作区溢出(步骤930)。如果导致工作区溢出,则向操作系统或监视应用,例如跟踪应用,发送一个中断,以扩展工作区(步骤935)。然后,扩展工作区,并对控制寄存器重新加以设置,以使它们指向所扩展的工作区的新的开始地址和长度(步骤940)。
如果调用来自新的线程,则在存储器为新的线程分配新的工作区,并对控制寄存器进行设置,使其指向新线程的新工作区的开始地址和长度(步骤950)。接下来,在扩展了工作区之后(步骤940),或如果向现存工作区写入入口不导致工作区溢出(步骤930),则把针对该调用的入口写入该线程的工作区中的调用栈(步骤960)。
返回到步骤915,如果指令是返回指令,则根据控制寄存器识别当前线程工作区(步骤965)。接下来,把当前线程工作区中的调用栈中的最后入口从调用栈中弹出(步骤970)。然后,终止操作。
现在参照图10,通过唤醒追踪应用,开始处理存储在线程工作区中的线程跟踪信息的操作(步骤1010)。然后,识别所关注的线程(步骤1020)。所关注的线程是实施细节,例如可以包括仅当前正在执行的线程、已处于挂起状态的线程、所有线程而无论当前是否正在执行等。假设追踪应用将知道哪些线程是所关注。
根据存储在控制寄存器中的信息,检索所关注的线程的工作区中的地址信息(步骤1030)。接下来,可以从存储器中的工作区检索这些工作区中的数据(步骤1040),并对这些数据进行处理(步骤1050),然后,终止操作。
应该加以注意的是,尽管上文中就处理器根据处理器所处理的指令的类型自动检测调用和返回指令的形式描述了本发明,但本发明并不局限于这一方式。相反,也可以具体实现指令,如通过编译器,使其可包括对标志位进行设置,以把该指令识别为将作为调用或返回指令而加以对待的指令。例如,存在着这样的一些情况如当存在指向一个例程的分支指令时,可以进入或退出该例程而无需通过“调用”指令明示地“调用”该例程或通过“返回”指令明示地退出该例程。在这样的情况下,本发明的机制可允许把该分支指令或其它类型的进入或退出例程而无需执行明示的“调用”或“返回”的指令标记为一条将被作为调用或返回指令而对待的指令。
例如,当处理器检索用于执行的指令时,可以把指令元数据与处理器所读的指令相关联。处理器可以检查调用标志位或返回标志位的设置,以判断是否将把该特定指令作为调用或返回指令加以对待,即使该指令本身不是调用或返回指令。如果为该指令设置了调用标志位,则上面描述的线程栈处理将以类似于好像该指令是明示“调用”指令的方式来执行。如果为该指令设置了返回标志位,则上面描述的线程栈处理将以类似于好像该指令是明示“返回”指令的方式来执行。这样,对于线程栈处理,这样的指令,即有效执行与调用或返回相类似的功能,但不是明示的调用或返回指令的指令,将仍然以与明示调用及返回指令相同的方式对待。
于是,本发明利用了这样一个事实根据处理器正在执行的指令,处理器知道何时进入和退出方法/例程。采用本发明,可不必用软件程序来监视计算机程序的执行,以确定何时进入/退出方法/例程而且不必把信息写入软件所保持的调用栈,而是本发明使能处理器硬件,使其自动地把必要的信息写入线程工作区。以这种方式,对线程栈的保持将独立于软件追踪算法来执行。因此,在跟踪计算机程序的执行方面,软件中的变化将不会影响用于保持线程调用栈的机制。而且,不需要将正在被追踪的计算机程序设置为保持线程调用栈信息,因为处理器将这一信息自动地存储在为这些线程分配的工作区中。
需要加以注意的一个重要方面是,尽管已就全功能数据处理系统环境描述了本发明,然而,这一技术领域中的普通熟练技术人员将会意识到,能够以指令的计算机可读媒介的形式以及多种形式分配本发明的各个过程,而且不管实际用于执行该分配的信号承载媒介的具体类型如何,本发明同等地适用。计算机可读媒介的例子包括可记录型媒介,例如软盘、硬盘驱动器、RAM(随机存取存储器)、CD-ROM、DVD-ROM(数字视频光盘只读存储器);以及传输型媒介,例如使用如射频和光波传输等传输形式的数字和模拟通信链路、有线或无线通信链路。计算机可读媒介可以采用编码格式的形式,为了在具体数据处理系统中实际加以应用,将对这些格式进行解码。
已说明性和描述性地对本发明进行了描述,这一描述并不旨在以所公开的这一形式穷尽或限制本发明。这一技术领域中的普通熟练技术人员将会明显意识到,可以对本发明进行多方面的变更与修改。例如,取代使用指令中或指令组(bundle)中的字段,可以把新的指令或操作代码用于指示相继的指令或相继的指令集是标记指令。另外,在希望把性能指示符包含于指令的字段中的情况下,如果无用于性能指示符的多余的字段,则也可以改变处理器的体系结构,使其包括附加的位。选择和描述本实施例,是为了最好地解释本发明的原理、实际的应用,并且使这一技术领域中的更多普通熟练技术人员能够针对不同的适合于所考虑的具体应用而进行了多方面修改的实施例理解本发明。
权利要求
1.一种在计算机程序的执行期间在数据处理系统中用于存储线程跟踪信息的方法,包括为计算机程序的线程分配工作区,其中,所述工作区用于为所述线程存储线程跟踪信息;在所述处理器的微代码中,自动地判断是否已经发生要求修改所述工作区中所述线程跟踪信息的事件;以及修改所述工作区中的线程跟踪信息,以响应所述微代码自动地判断已发生了需要修改所述工作区中线程跟踪信息的事件。
2.根据权利要求1所述的方法,还包括通过对所述处理器中线程跟踪控制位进行设置,使能处理器线程跟踪,其中,仅当对所述线程跟踪控制位进行了设置,才执行分配、自动判断、以及修改步骤。
3.根据权利要求1所述的方法,还包括通过对所述处理器中第一控制寄存器进行设置,以使其指向所述工作区的开始地址,以及通过对所述处理器中第二控制寄存器进行设置,以使其识别所述工作区的长度,来为线程分配该工作区。
4.根据权利要求1所述的方法,还包括在所述计算机程序的执行期间,识别新线程的产生,其中,执行为计算机程序的线程分配工作区以响应正在产生的新线程。
5.根据权利要求1所述的方法,还包括从运行在所述数据处理系统的追踪应用,接收对所述工作区的大小的识别。
6.根据权利要求1所述的方法,其中,在所述计算机程序的执行期间,由运行在所述数据处理系统上的操作系统分配所述工作区以响应线程的产生。
7.根据权利要求1所述的方法,还包括判断修改所述线程跟踪信息是否会导致所述工作区的溢出;以及如果断定修改所述线程跟踪信息会导致所述工作区的溢出,则扩展该工作区。
8.根据权利要求7所述的方法,其中,扩展所述的工作区包括为存储所述线程跟踪信息而分配新的存储器区;把所述新区的开始地址和长度存储在所述处理器的控制寄存器中;以及把现存的线程跟踪信息从所述工作区拷贝到所述新的存储器区中。
9.根据权利要求1所述的方法,其中,所述线程跟踪信息是线程调用栈,而且,其中,修改所述线程跟踪信息包括向所述线程调用栈添加入口,以及从所述线程调用栈弹出入口两者中至少之一。
10.根据权利要求1所述的方法,其中,所述事件是进入方法/例程和退出方法/例程之一。
11.一种在计算机程序的执行期间用于存储线程跟踪信息的装置,包括处理器,具有微代码;以及存储器,耦合于所述处理器,其中,所述处理器通过追踪应用执行正在被追踪的计算机程序的指令,并且在所述存储器中为所述计算机程序的线程分配工作区,所述工作区用于存储该线程的线程跟踪信息,而且,其中,所述处理器的微代码自动地判断是否发生要求修改所述工作区中线程跟踪信息的事件,并且,若断定已发生了因此将修改所述工作区中线程跟踪信息的事件,则修改所述工作区中的线程跟踪信息以响应该事件。
12.根据权利要求11所述的装置,其中,所述处理器还包括线程跟踪控制寄存器,其中,通过对所述线程跟踪控制寄存器中的线程跟踪控制位进行设置,使能处理器线程跟踪。
13.根据权利要求11所述的装置,其中,所述处理器包括第一控制寄存器和第二控制寄存器,其中,对所述第一控制寄存器进行设置以使其指向所述工作区的开始地址,以及对所述第二控制寄存器进行设置以使其识别所述工作区的长度。
14.根据权利要求11所述的装置,其中,所述处理器为所述线程分配工作区以响应对正在产生的新线程的检测。
15.根据权利要求11所述的装置,其中,由所述追踪应用设置所述工作区的大小。
16.根据权利要求11所述的装置,其中,在所述计算机程序的执行期间,由运行在所述处理器上的操作系统分配所述工作区以响应线程的产生。
17.根据权利要求11所述的装置,其中,所述处理器的微代码判断修改所述线程跟踪信息是否会导致该工作区的溢出,如果修改该线程跟踪信息会导致该工作区的溢出,则向追踪应用的中断处理程序发送中断,而且,其中,所述中断处理程序扩展该工作区以响应对所述中断的接收。
18.根据权利要求17所述的装置,其中,所述中断处理程序通过下列操作扩展所述工作区分配新的存储器区用于存储所述线程跟踪信息;把所述新区的开始地址和长度存储在所述处理器的控制寄存器中;以及把现存的线程跟踪信息从所述工作区拷贝到所述新的存储器区中。
19.根据权利要求11所述的装置,其中,所述线程跟踪信息是线程调用栈,而且,其中,通过向所述线程调用栈添加入口以及从所述线程调用栈弹出入口两者中至少之一,所述处理器的微代码修改所述线程跟踪信息。
20.根据权利要求11所述的装置,其中,所述事件是进入方法/例程和退出方法/例程之一。
21.一种在计算机程序的执行期间用于存储线程跟踪信息的计算机可读媒介中的计算机程序产品,包括第一指令,用于为所述计算机程序的线程分配工作区,其中,所述工作区用于存储所述线程的线程跟踪信息;第二指令,用于在所述处理器的微代码中自动地判断是否发生要求修改所述工作区中线程跟踪信息的事件;以及第三指令,用于修改所述工作区中的线程跟踪信息,以响应该微代码自动断定已发生了因此将修改所述工作区中的线程跟踪信息的事件。
全文摘要
一种用于在追踪计算机程序期间提供一种用于跟踪线程栈的自动机制的方法与装置。这种方法与装置包括硬件辅助机制,该机制允许处理器自主地为每一线程保持其中存储了调用栈的工作区。使用这种装置与方法,计算设备的操作系统把分配给具体线程工作区的数据区的大小告知操作系统。另外,当将执行对计算机程序的追踪时,追踪软件经由操作系统通知处理器开始在一个线程工作区中保持线程调用栈信息。对于计算机程序的执行中的每一线程,处理器保持一工作区,该工作区具有的大小根据操作系统所告知的大小确定。工作区由存储在处理器的控制寄存器中的地址和长度信息来指定。处理器包含微代码,当设置了控制位时,这些微代码用于使处理器自动把线程跟踪信息存储在由处理器的控制寄存器所指定的工作区中。
文档编号G06F9/06GK1614555SQ20041007511
公开日2005年5月11日 申请日期2004年8月31日 优先权日2003年11月6日
发明者小吉米·E·德威特, 弗兰克·E·莱文, 克里斯托弗·M·理查森, 罗伯特·J·厄克特 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1