240 likes | 472 Views
中期报告:二进制翻译下的多线程 Replay 系统. 报告人:刘泽善 导师: 武成岗 时间: 2011 年 1 月. 目录. 研究意义 研究背景 二进制翻译下的 Replay 系统 共享内存访问依赖 系统调用的处理 环境变量的处理 项目及课程完成情况. 研究意义. 二进制翻译( BT ) 在龙芯上兼容执行 X86 程序,丰富龙芯上的应用软件 e.g. flashplayer 多线程程序 flashplayer, firefox, mysql, apache, splash 具有不确定性,调试困难,尤其在 DBT 下
E N D
中期报告:二进制翻译下的多线程Replay系统 报告人:刘泽善 导师: 武成岗 时间: 2011年1月
目录 • 研究意义 • 研究背景 • 二进制翻译下的Replay系统 • 共享内存访问依赖 • 系统调用的处理 • 环境变量的处理 • 项目及课程完成情况
研究意义 • 二进制翻译(BT) • 在龙芯上兼容执行X86程序,丰富龙芯上的应用软件e.g. flashplayer • 多线程程序 • flashplayer, firefox, mysql, apache, splash • 具有不确定性,调试困难,尤其在DBT下 • Replay对二进制翻译器的意义 • 研究表明,调试一个并发错误所花费的时间取决于错误重现的速度 • Replay是重现错误的有效方法 • 对提高DBT的健壮性具有重要意义
研究意义 • 降低Replay系统开销的意义 • 学术界和工业界关注的重点 • 时间敏感的程序的需求 • 研究现状 • PinPlay实现了本地的记录重放系统,但开销巨大 • 就调研所知目前尚无二进制翻译下的记录重放系统
目录 • 研究意义 • 研究背景 • 二进制翻译下的Replay系统 • 共享内存访问依赖 • 系统调用的处理 • 环境变量的处理 • 项目及课程完成情况
背景介绍 • PinPlay(CGO’10)详尽的分析了影响多线程的不确定性因素 • 起始栈位置的改变 • 代码和数据位置的改变 • 程序二进制码以及共享库代码的改变 • 处理器特定指令行为的改变 • 信号 • 未初始化内存的读 • 系统调用行为的改变 • 共享内存访问依赖 DBT下不存在 静态编译避免 SPLASH2不存在
14 Local2 := 2 15 $r1 := Flag 16 Bneq $r1, $r0, -1 17 Nop 18 $r1 := Flag 19 Bneq $r1, $r0, -1 20 Nop 21 Y := Share1 22 Z := Share2 背景介绍-Transitive Reduction i j 31 Flag := 1 32 Share1 := 5 33 Share2 := 6 34 Flag := 0 35 Local1 := 3
目录 • 研究意义 • 研究背景 • 二进制翻译下的Replay系统 • 共享内存访问依赖 • 系统调用的处理 • 环境变量的处理 • 项目及课程完成情况
i j 31 Flag := 1 14 Local2 := 2 15 $r1 := Flag 32 Share1 := 5 16 Bneq $r1, $r0, -1 33 Share2 := 6 34 Flag := 0 17 Nop 18 $r1 := Flag 35 Local1 := 3 19 Bneq $r1, $r0, -1 20 Nop 21 Y := Share1 22 Z := Share2 共享内存访问依赖 • i:31j:15和i:34j:18为W/R依赖,j:15i:34为R/W依赖
共享内存访问依赖-记录 • FDR(ISCA’03)的软件实现,结合了Transitive Reduction • tid1:pc1:ic1tid2:pc2:ic2 • 上图中记录的结果: • i:pc{flag := 1}:31j:pc{$r1 := flag}:15 • j:pc{$r1 := flag}:15i:pc{flag := 0}:34 • i:pc{flag := 0}:34j:pc{$r1 := flag}:18
i j spin_unlock(lock1) 31 Flag := 1 lock1 14 Local2 := 2 spin_lock(lock1) spin_unlock(lock2) 15 $r1 := Flag 32 Share1 := 5 lock2 16 Bneq $r1, $r0, -1 33 Share2 := 6 spin_lock(lock2) spin_unlock(lock3) 34 Flag := 0 17 Nop lock3 18 $r1 := Flag spin_lock(lock3) 35 Local1 := 3 19 Bneq $r1, $r0, -1 20 Nop 21 Y := Share1 22 Z := Share2 共享内存访问依赖-重放 • 每个依赖关联一把锁,初始化成锁闭状态,弧头spin_lock,弧尾spin_unlock
IC1 IC2 IC3 … ICm 依赖弧尾队列,IC递增 访存指令 IC1’ IC2’ IC3’ … ICn 依赖弧头队列,IC递增 共享内存访问依赖-重放 • 每条访存指令有两个队列(弧尾队列、弧头队列),按指令计数从低到高排序,避免查找
addr 16bits (16-x)bits xbits 第一层映射 CIC[P] 共享内存访问依赖-优化措施 • 栈内存访问无需插桩 • 利用龙芯富余的临时寄存器,手工编写了插桩函数,几乎无上下文切换 • 内存地址关联数据结构的优化组织 • 查找约20条 • <= 64M • 实验选择x = 6
共享内存访问依赖-优化措施 • 写log文件的优化 • 线程写入自己的缓存区,程序结束时再写入统一的log文件,避免竞争 • 尚未实现,但有价值的优化措施 • 访存地址关联数据结构的缓存优化(减少近20条指令) • 根据程序的特点进行特定的优化 • Linux多线程程序多用pthread库编写 • 粗细粒度结合重放方法(同步点插桩、指令级插桩结合)
共享内存访问依赖-优化措施 • 重放插桩函数的手工编写 • 访存依赖的静态分析冗余消除 T0 T1 T2 T3 • 方法:求依赖图所有点对最长路径,只保留路径上的访存依赖 • 减少约1~10%的依赖 10:read(x) 21:write(x) 32:write(x) 43:write(x)
系统调用 • gettimeofday • 记录运行时保存,重放运行时恢复 • futex • 唤醒序问题 • join子线程问题
T0 T1 T2 T3 wait wait wait wake(1) wake(1) wake(1) wake(0) 系统调用-futex • 解决方法: • 记录wakewait序 • 重放时:不执行wait/wake,重用访存依赖的方法 • 记录恢复返回值 futex的唤醒序问题,wake(i)的i是唤醒的线程数目
系统调用-futex • 父线程join子线程 • 存在exitwait序 • 父线程只有在发现子线程没有退出时才wait • 给定父子线程,序是否存在不确定 • 解决方法 • 等待机制保证该唤醒序一定存在
环境变量 • 如$OLDPWD不同 • 影响getenv()的执行行为 • 解决方法: • 记录运行:程序启动时记录下所有的环境变量 • 重放运行:清空所有的环境变量clearenv(),再恢复成记录的环境变量状态putenv()
待完成的内容 • 降低记录重放的开销 • 实现已经想到的优化措施 • 阅读相关文献和调试系统的过程中发掘其他的有效优化措施 • 控制其他的不确定性因素 • 代码和数据位置的改变 • 信号 • 二进制翻译下多线程重放系统对实际调试的作用
目录 • 研究意义 • 研究背景 • 二进制翻译下的Replay系统 • 共享内存访问依赖 • 系统调用的处理 • 环境变量的处理 • 项目及课程完成情况
项目及课程完成情况 • 参加项目 • 课程学习