2

我正在为多线程应用程序编写小型调试程序。我的想法是运行目标,例如调试 100 纳秒,然后暂停并检查其内存。然而这(只是伪代码)

nanosleep(100);             //sleep debuger for 100 nanosec and let a program run
kill(target_app_pid, SIGSTOP); //stop target app

不起作用,因为进程切换可能会在 nanosleep 之后立即发生,并且目标会根据需要运行更长时间。有没有办法给一个进程“定义”的时间片然后暂停它?我能想象的唯一解决方案是添加系统调用并修复调度程序以实现我所需要的,但这需要付出很大的努力和许多错误。也许为调试器进程设置“实时”优先级会有所帮助?它会是干净的解决方案吗?

也假设我可以检测目标应用程序的源代码。是否可以设置某种计时器并在一段时间(非常小且精确)后使整个过程休眠?

4

2 回答 2

1

你真的认为你可以做到nanosleep100 纳秒吗?你的HZ内核有什么价值?最接近这种睡眠顺序的是udelay(),但这是在内核中,您可以禁用抢占,而不是在用户空间中。查看linux/include/delay.h并查看init/calibrate.cLinux 内核源代码。

于 2009-11-04T19:16:50.667 回答
1

由于 linux 充其量是一个“软实时”操作系统(尤其是在用户空间中工作),因此很难获得您所追求的精度类型。

如果您正在使用嵌入式处理器,nanosleepandmicrosleep调用通常实现为自旋循环。在引导期间,处理器的特点是“校准”这个自旋循环。然而,要获得这种类型的精度仍然需要非常详细地了解处理器架构和正在执行的内容(在指令级别)。

较新版本的 linux 内核确实具有一些高速计时器实现,但您仍在关注微秒分辨率。

如果您在桌面系统上运行,我不知道您为什么需要这种级别的精度。

于 2009-11-04T19:18:42.533 回答