论文部分内容阅读
计算机已经进入多核时代,从Intel,AMD,Sparc到PowerPC,CPU的设计者们不再追求单核的高频率而是向多核发展,现在的双核乃至四核CPU已经成为了主流。多核的出现将迫使改变原有的程序设计观念,可以设想的是,未来的计算机程序将会是并行化的并且能充分利用多CPU能力的。并发通常能够让系统资源得到最有效的利用,提高资源的利用率是实现计算机系统性能最大化的关键所在,通常当串行执行方案非常低效时,CPU处于闲置状态,并行可以提高系统整体的资源利用率。同时很多软件是自然的并发问题。 为了使程序并行化,常用的方法是使用多线程技术,但是多线程只有运用恰当,才能使硬件资源得到更加充分的利用,从而达到提高计算机性能的目标。反之,如果运用不当,多线程技术不但会降低计算性能,还可能导致应用程序发生一些不可预测的行为,甚至出现难以解决的故障,本论文主要是解决这些问题。目前已经出现了一些针对C/C++等Native语言的检测工具,并将开发一个针对java语言,能检测多线程程序冲突和死锁的工具。 其中,冲突检测的算法上,实现了一种基于lockset和happen-before算法的新算法,这种算法结合了lockset和happen-before算法的优势,合理的应用happen-before算法既消除了lockset算法中容易出现的false positive,同时保留了lockset算法的高效。在大型程序下,其性能仍然是可以接受的。在死锁检测算法中,实现了一种基于环的死锁检测算法,测试表明这种算法能有效检测程序中的由加锁构成环而引起的死锁。 在前台数据抽取引擎中,开发了一个Eclipse plugin,用户只需要导入其Java程序,启动后台即可得出关于冲突和死锁的诊断报告。在前台Java程序信息(例如地址,线程ID,锁集合等)的抽取中我充分利用了新版JDK的instrument功能,jvmtiagent和asm等二进制instrument工具,测试表明,本工具能截获大部分和线程相关的事件,从而提高了检测的准确度。 在工具的开发过程中,性能始终是困扰我最多的地方,因为一个大型程序通常会有上百万次的内存访问,这其中有很多是不构成datarace和deadlock的,如何正确而又高效地过滤无用信息,如何设计正确的数据结构高效地存储海量数据等这些问题在本论文中得到了有效地解决。