- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java程式的目标单赋值探析.doc
Java程式的目标单赋值探析
--第一章绪论
1. 1多核体系结构与多线程程序
多内核是表示在一枚处理器里集成两个和多个完好的计算引擎,每个计算引擎有独立的计算单元与独立的寄存器组,计算引擎之间通过共享处理器二级或三级缓存或数据总线实现数据交互,如图1.1所示。多核体系结构自从提出以来,广受业界及用户欢迎,相对于传统的单核架构,多核体系结构主要有以下几个优点:
1.通过划分任务,应用程序能充分利用多个执行内核,可在特定的时间内执行更多任务,从而提高系统性能。
2.仅仅依赖提高单核芯片工作频率提升系统性能会导致处理器功耗过高,使用多核架构能有效提高系统性能并保持相对低功耗。
3.多核架构与传统单核架构有很好的兼容性,现有软件无需修改即可支持多核平台,由操作系统负责充分利用多个处理器内核完成软件功能。
4.对比不断提升单核处理器主频所增加的成本,使用多核架构更具性价比。
虽然多核架构优秀的兼容性允许现有软件无需修改即可使用在多核平台上,但是,要完全发挥多核架构的效力,需要使用多线程编程模型来编写应用程序。因此,多核体系结构的广泛应用增加了对编写多线程程序的需求,进而促进了多线程编程语言的发展。多线程程序中每个线程为独立的执行单元,线程之间通过信号量与锁机制实现同步操作。多线程程序可以有效的利用多核架构的多核资源,但是,如果程序员不能很好的处理线程之间的同步操作,则会引入数据竞争与死锁等线程同步错误。
在多线程程序中,当两个线程没有时序关系的约束而访问同一个内存位置,没有拥有公共的锁,且至少有一个访问是写操作,则会发生数据竞争错误。引起数据竞争的主要原因是应用程序没有对并发访问的线程进行正确的同步。由于多线程程序运行时对内存访问顺序不确定,存在数据竞争的应用程序,其运行结果具有不确定性,对于同一输入数据多次执行的结果可能不同。多线程程序必须进行正确同步以保证对共享数据的正确访问,从而消除数据竞争。但程序员在实际编写多线程程序时很容易引入多线程并发错误:虽然使用粗粒度的锁同步易于保证程序的正确性,但不必要的同步操作会带来额外的同步开销,且可能造成死锁;而过分谨慎的使用同步操作,虽然减少同步开销和提高了并发度,但写出的程序稳定性差,容易引入数据竞争和死锁错误。为此,学术界提出了多种方法来帮助开发者检测、排除多线程程序中出现的并发错误,其中数据竞争检测以及确定性回放算法是两种最为成熟的多线程程序诊断、排错方法。
1. 2数据竞争检测与确定性回放技术
对于多线程程序运行时的不确定性问题,学术界提出了多种解决方法。其中以数据竞争检测[3,4,19,20,21,22,23]、确定性回放[5,15,24,25,26,27,28]两种方法最为成熟。数据竞争检测算法通过静态分析程序代码或动态监控程序内存访问检测程序中出现的数据竞争情况,并将发生数据竞争的具体对象返回给用户。确定性回放算法在程序运行时通过一记录线程内存访问顺序,使多线程程序能确定性的重复运行,从而重现程序错误运行,帮助用户诊断并解决数据竞争与死锁等错误。
除此之外,Tom Bergan等通过修改线程调度机制使多线程程序始终确定性运行来避免程序运行中的不确定性问题。但是对比数据竞争检测与确定性回放方法,确定性运行方法由于需要将部分可并行程序串行化执行,所以并不能完全利用多核体系结构的并行优势。
1.3数据竞争检测技术
数据竞争检测算法可分为静态检测和动态检测两种类型。动态检测算法通常采用运行时代码插装的方法得到程序运行状态,实时监控程序内存操作与锁操作等关键信息,用以确定程序运行时是否出现数据竞争。动态检测算法通常可以避免假的竞争错误,检测的精度较高。但动态检测只能发现执行路径上的竞争错误,存在检测覆盖度的问题,且随着程序规模的增加,代码插装开销也不断增加。静态检测一般采用锁集合检测算法,在程序编译阶段,利用编译器的指向分析和并发分析等静态分析方法,检测程序中可能的数据竞争错误。静态数据竞争检测算法分析的复杂度较高,复杂的检测算法可扩展性较低,而相对简单的检测算法又导致检测精度不高,因此静态检测算法实现通常是检测精度和可扩展性之间的折衷。此外,由于静态分析难以获得精确的线程时序关系,所以静态检测算法都是不完备的近似算法,容易生成大量假的数据竞争错误报告。
Stefan Savage提出了锁集合((LockSet)算法用于检测多线程程序中数据竞争错误,并实现了第一个基于锁集合检测算法的动态数据竞争检测工具Eraser。根据锁集合检测算法描述,所有的共享内存位置都被锁保护,当两个线程访问同一个内存位置,其中有一个是写操作,且两个线程没有拥有公共的锁时,则这两个访问事件存在数据竞争错误。当多个线程对共享内存位置的并发访问被一个公共锁保护时,且线程要访问m必须要先获得锁
文档评论(0)