我正在为多线程应用编写小型调试程序。我的想法是运行目标,例如100纳秒,然后暂停并检查其记忆。然而这(只是伪代码)
nanosleep(100); //sleep debuger for 100 nanosec and let a program run
kill(target_app_pid, SIGSTOP); //stop target app
不起作用,因为过程切换可能在nanosleep之后发生,并且目标会根据需要运行更长时间。有没有办法给进程“定义”时间片然后暂停它?只有我能想象的解决方案是添加系统调用并修复调度程序以实现我的要求,但这需要付出很大的努力和许多错误。 也许为debuger过程设置“实时”优先级可以帮助吗?它会是干净的解决方案吗?
也可以假设,我可以提供目标应用的源代码。是否有可能设置某种计时器并在一段时间(非常小而精确)的时间段之后让整个过程睡眠?
答案 0 :(得分:1)
你真的认为你可以nanosleep
100纳秒吗?内核中的HZ
值是多少?你得到这个睡眠顺序的最接近的是udelay()
,但是你可以在内核中禁用抢占,而不是在用户区。查看Linux内核源代码中的linux/include/delay.h
和init/calibrate.c
。
答案 1 :(得分:1)
由于linux最多只是一个“软实时”操作系统(特别是在用户空间中工作),因此很难获得你所追求的精确类型。
如果您正在使用嵌入式处理器,nanosleep
和microsleep
调用通常会实现为自旋循环。在启动期间,处理器的特征在于“校准”该旋转环。但是,获得这种类型的精度仍需要非常详细地了解处理器架构和正在执行的内容(在指令级别)。
较新版本的Linux内核确实有一些高速计时器实现,但你仍然在看微秒级分辨率。
如果您在桌面系统上运行,我不知道您为何需要这种精确度。