摘要 | 第4-5页 |
ABSTRACT | 第5-6页 |
第一章 绪论 | 第10-16页 |
1.1 研究背景 | 第10页 |
1.2 研究现状 | 第10-12页 |
1.3 论文主要工作 | 第12-13页 |
1.4 论文的组织结构 | 第13-16页 |
第二章 多线程访存问题与相关检测技术介绍 | 第16-20页 |
2.1 多线程访存问题背景 | 第16页 |
2.1.1 线程与多线程计算 | 第16页 |
2.1.2 多线程访存问题 | 第16页 |
2.2 程序分析相关技术 | 第16-17页 |
2.2.1 静态分析介绍 | 第16-17页 |
2.2.2 动态分析介绍 | 第17页 |
2.3 LLVM底层虚拟机背景简介 | 第17-18页 |
2.3.1 LLVM中间表达式简介 | 第17-18页 |
2.3.2 LLVM优化遍历系统简介 | 第18页 |
2.4 Clang与Clang静态检测框架背景简介 | 第18-19页 |
2.5 本章小结 | 第19-20页 |
第三章 多线程访存问题的静态检测框架设计 | 第20-38页 |
3.1 设计需求 | 第20-21页 |
3.2 研究目标和内容 | 第21页 |
3.2.1 研究目标 | 第21页 |
3.2.2 本文的创新之处 | 第21页 |
3.3 多线程访存问题分类及检测器设计 | 第21-33页 |
3.3.1 不可重入库函数中潜在的数据竞争 | 第22-23页 |
3.3.2 因为不正确使用位段而导致的数据竞争 | 第23-25页 |
3.3.3 在线程阻塞期间销毁互斥锁 | 第25-27页 |
3.3.4 在多线程环境下调用signal()函数 | 第27-28页 |
3.3.5 在一个表达式中引用多个原子变量 | 第28-29页 |
3.3.6 在某一个线程被join后继续对该线程进行join操作 | 第29-30页 |
3.3.7 线程共享内存对象声明时中使用不正当的存储修饰符 | 第30页 |
3.3.8 及时释放线程特定存储 | 第30-31页 |
3.3.9 在多线程环境中正确使用变长数组成员 | 第31页 |
3.3.10 在多线程环境依赖求值顺序来求值 | 第31-33页 |
3.4 系统设计 | 第33-36页 |
3.4.1 检测器命名 | 第33-34页 |
3.4.2 黑/白名单过滤系统设计 | 第34-36页 |
3.5 本章小结 | 第36-38页 |
第四章 多线程访存问题的动态检测工具设计 | 第38-46页 |
4.1 设计需求 | 第38页 |
4.2 设计目标 | 第38页 |
4.3 基于伙伴内存分配器的元数据存储方式 | 第38-40页 |
4.3.1 定义 | 第39页 |
4.3.2 内存布局 | 第39-40页 |
4.4 内存布局 | 第40页 |
4.5 算法设计 | 第40-44页 |
4.5.1 内存对象的分配与释放 | 第40页 |
4.5.2 访存检查算法 | 第40-41页 |
4.5.3 内存访问 | 第41-44页 |
4.6 本章小结 | 第44-46页 |
第五章 多线程访存问题检测框架的实现与性能分析 | 第46-52页 |
5.1 静态检测系统实现 | 第46-47页 |
5.1.1 设计原则 | 第46页 |
5.1.2 系统结构 | 第46-47页 |
5.1.3 检测方式 | 第47页 |
5.2 动态检测系统实现 | 第47-49页 |
5.3 准确性评估 | 第49页 |
5.4 性能评估 | 第49-51页 |
5.4.1 改编后的Olden基准测试 | 第50页 |
5.4.2 算法性能评估 | 第50-51页 |
5.5 本章小结 | 第51-52页 |
第六章 结束语 | 第52-54页 |
6.1 论文总结 | 第52页 |
6.2 下一步的研究工作 | 第52-54页 |
参考文献 | 第54-60页 |
致谢 | 第60-62页 |
攻读学位期间发表的学术论文 | 第62页 |