uma*_*now 7 unix kernel process rhel strace
我有一个在RHEL6.x(64位)上运行的多线程进程.
我发现当我尝试启动进程时,进程会挂起并且某些线程(同一进程)会崩溃.有些线程等待线程之间的共享内存被创建(我可以看到所有这些都没有被创建).
但是当我使用strace时,进程不会挂起并且它工作得很好(所有应该创建的内存都会被创建).即使在创建内存后中断strace,也可以保持进程正常运行.
我读过这个:
这确实给了我一个想法.但我仍然不清楚这是因为他们使用的RHEL版本没有被提及.
另外,另一点是,将内核更改为fedora(兼容)内核不会产生问题.
所以,我想知道strace究竟是如何影响一个过程的?(或者只是如链接中指出的那样移回内核的堆栈)?
最可能的原因是strace,它使用该ptrace工具拦截系统调用,由于涉及每个系统调用的开销,因此会影响应用程序的时间。
考虑一个场景,两个线程并行启动,其中线程 A 初始化全局变量,线程 B 访问该变量,而无需任何类型的线程同步。只要线程 A 在线程 B 访问该变量之前未能初始化该变量,线程 B 就会触发分段错误。
但是,如果线程 B 在访问变量之前与操作系统交互(通过系统调用),则strace可能会引入延迟,该延迟可能足以为线程 B 提供时间来初始化变量。相反,如果线程 A 在初始化变量之前与操作系统交互,strace则可能会由于初始化延迟而更容易出现分段错误。
同样,不同的内核实现可能会影响用户空间进程感知的时序,并可能导致具有竞争条件的应用程序失败,即使内核不是失败的根本原因,而只是触发器。
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |