多线程程序的动态数据竞争检测技术研究
发布时间:2021-12-18 00:30
随着多核硬件的广泛普及,多线程编程技术也被应用到计算机领域的各个方面,多线程编程技术能够更加充分的利用多核众核设备的超强计算能力,在同一时间执行多项任务,还可成倍加速某些任务,特别适用于某些需要快速响应用户操作的任务。但多线程程序在执行过程中会产生大量可能的交错,执行顺序具有极大的不确定性,导致严重的并发错误,数据竞争是一种具有高度破坏性的并发错误。数据竞争会导致数据损坏、内存泄漏、程序崩溃或不正确的执行等现象。当多个线程同时访问同一共享变量,至少存在一次写访问操作时,会引发数据竞争。由于无序的线程交错,在调试过程中数据竞争会随机出现或消失,查找和重现它们异常困难。因此,检测出数据竞争错误是提高并发软件可靠性和安全性急需解决的问题。国内外研究人员已经提出了许多静态和动态程序分析技术来检测数据竞争。然而,在检测开销、精度、覆盖率、速度等方面还有改进的空间。文中提出一种基于优化的FastTrack算法和锁模式相结合的动态混合数据竞争检测算法AsampleLock。该算法利用采样技术,监控同一时刻同时运行的来自并发线程的函数对;通过预竞争检测获得真正涉及数据竞争的内存访问对;为了降低算法受线...
【文章来源】:中原工学院河南省
【文章页数】:75 页
【学位级别】:硕士
【部分图文】:
论文主要研究内容结构图
10富并且强大的编程接口,它提供的API允许注入任意C/C++代码,Pin的插桩粒度包括指令级(Instruction)插桩、轨迹级(Trace)插桩、镜像级(Image)插桩、函数级(Routine)插桩。图2.2Pin的软件架构Pin的软件架构如图2.2所示[36],Pin由虚拟机、代码缓存和调用Pintool的插桩API三部分组成。Pin虚拟机包括即时编译器、模拟执行单元、代码调度器三部分。整个架构的运转流程为:Pin获得了应用程序的控制权后,虚拟机通过协调它的组件开始工作一起执行应用程序,即时编译器编译并插桩应用程序代码,然后由调度程序启动该代码。2.2.2DynamoRIO平台DynamoRIO[37]是另一个运用广泛的动态二进制插桩框架,是Google上的一个开源项目,在其上可为Windows、Linux、Android构建称为客户端的程序分析工具,并支持商用的IA-32、AMD64、ARM、AArch64指令集架构。DynamoRIO是应用程序和操作系统之间的中间平台,能够观察和操纵应用程序中每个被执行的指令。DynamoRIO使用回调机制来处理二进制可执行代码,通过在事件上设置回调,可以轻松地操纵目标程序的二进制可执行代码。DynamoRIO可用于创建程序分析、插桩、优化和翻译等动态分析工具[38],[39]。DynamoRIO通过将应用程序代码复制到代码缓存器中,一次一个基本块,来执行目标应用程序。通过上下文切换将代码缓存从DynamoRIO的调度状态输入到应用程序的状态[40]。DynamoRIO提供了丰富的API接口,开发
11者可以利用这些接口实现对指令、基本块、线程、系统调用等的监控,从而实现二进制分析插件的开发[41]。DynamoRIO的内核由三个模块组成:调度器(Dispatch)、基本块构建器(Basicblockbuilder)和代码缓存器(Codecache),DynamoRIO将以单个控制转移指令结尾的指令序列视为基本块[42],DynamoRIO的基本块通常包含大约6或7条指令,但是少数基本块也可达到50条以上的指令。图2.3描述了DynamoRIO的运转流程,三个模块分别负责的任务以及各个组件的运转流程为:首先,基本块构建器把待测程序分割成许多基本块,并对基本块进行插桩,然后把插桩完毕的基本块存储到代码缓存器中,最后,调度器来截获和操纵基本块中每个被执行的指令,对内存事件进行监控,并协调其它模块进行工作[43]。以上介绍了两种动态插桩工具的整体架构和各自的特点,虽然DynamoRIO跟Pin相比具有较高的性能,但本文选择了IntelPin插桩工具,其主要原因如下:在运行大型软件程序时,Pin比DynamoRIO更稳定可靠,本文采用的基准测试集均为大型程序;DynamoRIO的API并不是最友好和易于使用的,但Pin给开发人员提供了丰富易用的API接口函数以及大量详细的样例Pintool的源代码;Pin插桩平台的插桩粒度较多,较灵活,本文实验涉及多种插桩粒度;Pin通过动态编译插桩时,配合多种优化方法,执行效率更高。图2.3DynamoRIO运转流程图
【参考文献】:
期刊论文
[1]程序分析研究进展[J]. 张健,张超,玄跻峰,熊英飞,王千祥,梁彬,李炼,窦文生,陈振邦,陈立前,蔡彦. 软件学报. 2019(01)
[2]并发程序中数据竞争检测方法[J]. 张杨,梁亚楠,张冬雯,孙仕欣. 计算机应用. 2019(01)
[3]竞态漏洞检测方法综述[J]. 赵世斌,周天阳,朱俊虎,王清贤. 计算机工程与应用. 2018(03)
[4]基于访问对的有害数据竞争定位方法[J]. 张高举,郭绍忠,王磊. 信息工程大学学报. 2017(06)
[5]基于动态二进制分析的网络协议逆向解析[J]. 何永君,舒辉,熊小兵. 计算机工程. 2010(09)
[6]多线程程序数据竞争的静态检测[J]. 吴萍,陈意云,张健. 计算机研究与发展. 2006(02)
[7]面向Java的分布式程序测试系统[J]. 顾庆,陈道蓄,谢立,孙钟秀. 软件学报. 2003(04)
博士论文
[1]并发程序缺陷检测技术研究[D]. 薄莉莉.中国矿业大学 2019
[2]并发缺陷的检测与规避研究[D]. 禹振.哈尔滨工业大学 2017
硕士论文
[1]基于二进制指令插桩的C++程序缺陷检测技术的研究与实现[D]. 何磊.北京邮电大学 2017
[2]多线程程序数据竞争检测和验证方法研究[D]. 杨振.哈尔滨工业大学 2016
[3]动态数据竞争检测研究[D]. 汪雄峰.华中科技大学 2016
[4]多线程程序数据竞争静态检测方法研究[D]. 简道红.大连理工大学 2013
[5]基于线程摘要的C/C++数据竞争检测研究[D]. 姚欣洪.北京邮电大学 2011
本文编号:3541261
【文章来源】:中原工学院河南省
【文章页数】:75 页
【学位级别】:硕士
【部分图文】:
论文主要研究内容结构图
10富并且强大的编程接口,它提供的API允许注入任意C/C++代码,Pin的插桩粒度包括指令级(Instruction)插桩、轨迹级(Trace)插桩、镜像级(Image)插桩、函数级(Routine)插桩。图2.2Pin的软件架构Pin的软件架构如图2.2所示[36],Pin由虚拟机、代码缓存和调用Pintool的插桩API三部分组成。Pin虚拟机包括即时编译器、模拟执行单元、代码调度器三部分。整个架构的运转流程为:Pin获得了应用程序的控制权后,虚拟机通过协调它的组件开始工作一起执行应用程序,即时编译器编译并插桩应用程序代码,然后由调度程序启动该代码。2.2.2DynamoRIO平台DynamoRIO[37]是另一个运用广泛的动态二进制插桩框架,是Google上的一个开源项目,在其上可为Windows、Linux、Android构建称为客户端的程序分析工具,并支持商用的IA-32、AMD64、ARM、AArch64指令集架构。DynamoRIO是应用程序和操作系统之间的中间平台,能够观察和操纵应用程序中每个被执行的指令。DynamoRIO使用回调机制来处理二进制可执行代码,通过在事件上设置回调,可以轻松地操纵目标程序的二进制可执行代码。DynamoRIO可用于创建程序分析、插桩、优化和翻译等动态分析工具[38],[39]。DynamoRIO通过将应用程序代码复制到代码缓存器中,一次一个基本块,来执行目标应用程序。通过上下文切换将代码缓存从DynamoRIO的调度状态输入到应用程序的状态[40]。DynamoRIO提供了丰富的API接口,开发
11者可以利用这些接口实现对指令、基本块、线程、系统调用等的监控,从而实现二进制分析插件的开发[41]。DynamoRIO的内核由三个模块组成:调度器(Dispatch)、基本块构建器(Basicblockbuilder)和代码缓存器(Codecache),DynamoRIO将以单个控制转移指令结尾的指令序列视为基本块[42],DynamoRIO的基本块通常包含大约6或7条指令,但是少数基本块也可达到50条以上的指令。图2.3描述了DynamoRIO的运转流程,三个模块分别负责的任务以及各个组件的运转流程为:首先,基本块构建器把待测程序分割成许多基本块,并对基本块进行插桩,然后把插桩完毕的基本块存储到代码缓存器中,最后,调度器来截获和操纵基本块中每个被执行的指令,对内存事件进行监控,并协调其它模块进行工作[43]。以上介绍了两种动态插桩工具的整体架构和各自的特点,虽然DynamoRIO跟Pin相比具有较高的性能,但本文选择了IntelPin插桩工具,其主要原因如下:在运行大型软件程序时,Pin比DynamoRIO更稳定可靠,本文采用的基准测试集均为大型程序;DynamoRIO的API并不是最友好和易于使用的,但Pin给开发人员提供了丰富易用的API接口函数以及大量详细的样例Pintool的源代码;Pin插桩平台的插桩粒度较多,较灵活,本文实验涉及多种插桩粒度;Pin通过动态编译插桩时,配合多种优化方法,执行效率更高。图2.3DynamoRIO运转流程图
【参考文献】:
期刊论文
[1]程序分析研究进展[J]. 张健,张超,玄跻峰,熊英飞,王千祥,梁彬,李炼,窦文生,陈振邦,陈立前,蔡彦. 软件学报. 2019(01)
[2]并发程序中数据竞争检测方法[J]. 张杨,梁亚楠,张冬雯,孙仕欣. 计算机应用. 2019(01)
[3]竞态漏洞检测方法综述[J]. 赵世斌,周天阳,朱俊虎,王清贤. 计算机工程与应用. 2018(03)
[4]基于访问对的有害数据竞争定位方法[J]. 张高举,郭绍忠,王磊. 信息工程大学学报. 2017(06)
[5]基于动态二进制分析的网络协议逆向解析[J]. 何永君,舒辉,熊小兵. 计算机工程. 2010(09)
[6]多线程程序数据竞争的静态检测[J]. 吴萍,陈意云,张健. 计算机研究与发展. 2006(02)
[7]面向Java的分布式程序测试系统[J]. 顾庆,陈道蓄,谢立,孙钟秀. 软件学报. 2003(04)
博士论文
[1]并发程序缺陷检测技术研究[D]. 薄莉莉.中国矿业大学 2019
[2]并发缺陷的检测与规避研究[D]. 禹振.哈尔滨工业大学 2017
硕士论文
[1]基于二进制指令插桩的C++程序缺陷检测技术的研究与实现[D]. 何磊.北京邮电大学 2017
[2]多线程程序数据竞争检测和验证方法研究[D]. 杨振.哈尔滨工业大学 2016
[3]动态数据竞争检测研究[D]. 汪雄峰.华中科技大学 2016
[4]多线程程序数据竞争静态检测方法研究[D]. 简道红.大连理工大学 2013
[5]基于线程摘要的C/C++数据竞争检测研究[D]. 姚欣洪.北京邮电大学 2011
本文编号:3541261
本文链接:https://www.wllwen.com/shoufeilunwen/xixikjs/3541261.html