操作系统
执行信息,就可以实现对程序运行状态数据的收集。2.3性能调试设计的关键技术
2.3.1
日志服务在构件化对象上的建立
为了完成在构件处对程序运行数据的收集,就需要为系
统的每个构件提供统一的日志服务功能,以记录系统调用的使用情况。
建立日志服务的作用有如下2点:
(1)实现对系统整体性能的统计,查找系统的性能瓶颈。衡量系统性能的2个最重要指标是系统响应时间和系统吞吐率。前者表现为系统上完成单个程序运行所花费的时间;后者表现为系统支持同时运行的最大程序个数。
在构件化系统中,程序的运行可以视为系统调用请求在多个构件间的流动,那么系统对程序的响应时间和吞吐率可以表示如下:
响应时间=每个构件对程序的响应时间+
系统调用请求在构件间流动所消耗的时间
吞吐率=min{各个构件能同时响应的程序个数}
系统各构件之间的通信采用统一的通信机制,所以构件间的通信效率在大部分时间里应该是稳定的,只有在采用多机互联的系统里可能受到网络不稳定等因素的影响。
因此,对于构件化操作系统I面言,影响系统性能的因素就被划分到一个或多个构件里,只要比较一下每个构件处的日志记录,就能找出影响系统性能的构件,再通过在构件化系统调用上设置断点,就能将系统性能瓶颈准确定位到构件的系统调用接口上,从而弥补进程跟踪在性能方面的不足,加快系统性能的提高和高效率程序的开发。
(2)记录程序的运行轨迹,实现程序的重放。对于具有不可重现特性的程序进程,采用传统的进程跟踪调试手段,无法完成错误的定位,而日志功能则会将程序前次执行的过程记录下来,只要日志记录足够完善,就可以通过日志记录重放前次程序的执行,从而实现对不可重现程序的调试。2.3.2通过构件化系统调用对进程运行状态的控制
在传统的进程跟踪调试里,对程序运行的控制粒度可以根据需要进行改变,如从最细的指令级到系统调用级最后到源代码上的函数级。在基于构件的跟踪调试里,对程序运行的控制粒度有构件级和构件化系统调用级2级。编程人员通过在某一构件处设置断点即可使被调试进程在请求该构件服务时被停止下来,从而实现对构件的功能和性能调试。相比传统的进程调试,编程人员不必去源代码中查找请求该构件的函数调用,从而加快调试的效率。编程人员通过对程序使用构件化系统调用跟踪,即可将错误或性能瓶颈定位到具体的系统调用入El上。
通过增加对构件及构件化系统调用的控制可以实现以下2个功能:
(1)控制系统上单个或多个程序的运行。传统的进程调试模式是由一个进程去控制另一个进程,这样进程间的相互关系对调试结果影响很大,比如一个进程不能同时被2个进程所跟踪,被跟踪进程如果再去尝试调试跟踪进程,将会导致2个进程相互等待而僵死。这也是许多反跟踪技术产生的原因。
通过构件实现肘进程的控制可以将跟踪进程和被跟踪进程彻底隔离开来,从而消除两者之间的相互影响。增加构件对进程的控制功能后,要实现一个进程同时跟踪多个进程,只需要在构件处为多个被跟踪进程没置相应的跟踪点即可。
万
方数据多个进程甚至可以跟踪调试同一个进程,在这种情况下,被跟踪进程的状态由多个跟踪进程的调试命令联合决定,只要有一个跟踪进程发出了停止命令,被跟踪进程就将处于停止状态,只有当所有跟踪进程都允许运行时,被跟踪进程才继续运行。因此,基于构件的跟踪方法能够很容易地实现对多个并发程序的跟踪调试。
(2)控制整个系统的运行状态。通过同步控制系统里所有构件的系统调用,就能实现控制整个系统的运行状态。当所有的系统级构件都关闭对应用程序的服务时,系统里仅有内核进程运行,可以进行系统内核的调试。同时,如果系统支持并行程序的运行,那么此状态就对应到多个并行程序运行时的停止状态,从而可以实现对并行程序的跟踪调试。2.4性能调试设计的关健结构2.4.1构件性能日志
为了查看系统的运行性能,每个构件上将维护一个简单的日志,负责记录调用该构件系统调用的进程及其时间消耗、资源占用比例等情况。结构如表1所示。
衰1构件性能日意
数据项
描述进程ID号
m要
构件化系统调用号
流入日f问流出时间资源占J{J比例
由于同一个进程有可能多次调用同一个构件化系统调用,因此记录中的进程ID号和构件化系统调用号都是允许重复的。程序被运行一次后,通过统计对应进程在每个构件内运行的总时间占程序运行总时间的比例就可以确定影响程序执行时间的构件。通过统计记录表中有流入时间但流出时间为空的记录条数就能得到当前构件内的总进程数。如果要实现日志一重放的功能,则还需要对该表进行扩充,记录详细的运行上下文情况。
2.4.2构件化系统调用控制表
为了控制系统里所有的构件化系统调用是否对指定进程服务,系统必须负责维护一张全局的系统调用表,如表2所示。当表中Server属 …… 此处隐藏:392字,全部文档内容请下载后查看。喜欢就下载吧 ……