在串口执行shell命令导致死锁。rtmutex相关故障排查方法。
2012-08-07 21:57
531 查看
串口执行命令导致阻塞的流程是这样的,假设有如下场景:
1) 优先级为60的1041(0x411)号线程(命令解析线程), 解析命令后,执行system时产生缺页(c库代码段缺页),这个时候
1041抓到了mmap_sem,执行请求调页(可能比较耗时),接着do_fork会将进程的页表全部设为只读,以引发写时复制;
2)优先级为88的MediaThd 线程, 由于代码段被改成只读,也发生了缺页;
3) 优先级为87的IdleTask_Cpu线程,由于代码段被改成只读,也发生了缺页;
4)1041的请求调页执行完,尝试按照优先级由高到低顺序依次唤醒阻塞队列里的各个线程;
5)假如1041线程,先唤醒MediaThd1, 然后MediaThd1执行完缺页流程再去唤醒IdleTask_Cpu1,同时
把锁持有者(pending owner)强行置为IdleTask_Cpu1。
由于这两个线程在一个cpu上,并且前者优先级比后者高,
因此后者一直得不到调度,同时idle的优先级也比较高,其他同一个进程下的其他线程无法偷到此锁,导致系统中连环死锁
6)可以把idle的任务优先级往下调整至最低来避免此问题(媒体面设置了排他,idle下调优先级应该无影响)
1) 优先级为60的1041(0x411)号线程(命令解析线程), 解析命令后,执行system时产生缺页(c库代码段缺页),这个时候
1041抓到了mmap_sem,执行请求调页(可能比较耗时),接着do_fork会将进程的页表全部设为只读,以引发写时复制;
2)优先级为88的MediaThd 线程, 由于代码段被改成只读,也发生了缺页;
3) 优先级为87的IdleTask_Cpu线程,由于代码段被改成只读,也发生了缺页;
4)1041的请求调页执行完,尝试按照优先级由高到低顺序依次唤醒阻塞队列里的各个线程;
5)假如1041线程,先唤醒MediaThd1, 然后MediaThd1执行完缺页流程再去唤醒IdleTask_Cpu1,同时
把锁持有者(pending owner)强行置为IdleTask_Cpu1。
由于这两个线程在一个cpu上,并且前者优先级比后者高,
因此后者一直得不到调度,同时idle的优先级也比较高,其他同一个进程下的其他线程无法偷到此锁,导致系统中连环死锁
6)可以把idle的任务优先级往下调整至最低来避免此问题(媒体面设置了排他,idle下调优先级应该无影响)
相关文章推荐
- 六种用ruby调用执行shell命令的方法
- ssh远程执行命令方法和Shell脚本实例
- python执行shell命令的方法
- Linux C 程序执行 shell 命令并获取返回结果的方法
- python中执行shell命令的几个方法小结
- python2.7 执行cmd命令及shell命令封装方法
- yum因被锁定导致无法执行相关操作的解决方法
- python执行shell命令的几种方法
- shell中执行一个字符串命令的方法
- Python调用shell命令的几种方法(在新进程中执行shell命令)
- linux中执行shell命令的几种常用方法
- ruby调用执行shell命令的方法
- python执行shell命令的几种方法
- python执行使用shell命令方法分享
- 执行命令mm出错以及运行adb shell出现insufficient permissions for device错误的解决方法
- ssh远程执行命令方法和Shell脚本实例
- 通过shell脚本循环进入目录执行命令的方法
- Ruby中调用执行shell命令的6种方法
- expect中使用exec执行shell命令的方法
- C++/Php/Python 语言执行shell命令的方法(推荐)