【问题标题】:controlling program execution控制程序执行
【发布时间】:2010-12-13 03:40:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux kernel signals real-time


    【解决方案1】:

    你真的认为你可以nanosleep 100 纳秒吗?你内核中的HZ 值是什么?最接近此睡眠顺序的是udelay(),但这是在内核中,您可以禁用抢占,而不是在用户区。查看 Linux 内核源代码中的 linux/include/delay.hinit/calibrate.c

    【讨论】:

    • nanosleep(100) 只是一个例子。一般来说,我需要类似 time_execute(target_pid, time_to_execute)
    • 不过,这里的时间量是一个非常重要的考虑因素。你能给我们一个实时的价值来考虑吗?
    • 您的方法的问题是您希望“不再”延迟,而 Linux 只允许您“不短于 X”延迟,X 有一些下限(通常为 10 微秒)。超出延迟的时间取决于调度程序。您可以查看“实时”POSIX 信号/计时器 - 在那里您可以清楚地看到您错过了多少计时器脉冲。
    • 由于我可以检测目标源代码或二进制文件以使其“慢”,因此实时值可以是微秒级
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多