【问题标题】:Check whether a preemption had occurred in Linux between two points of the code检查 Linux 中代码的两点之间是否发生了抢占
【发布时间】:2015-12-30 14:07:57
【问题描述】:

我有一个运行在 Linux 内核之上的应用程序(一个简单的 C 代码)。我正在测量代码两点之间的时间。我想知道是否有任何其他进程或调度程序本身在这两点之间抢占了我的应用程序。有没有办法找到这个。

【问题讨论】:

  • @GinuJacob 你听说过clock_gettime函数还是clock函数?任何这些都应该可以解决您的问题,请参阅 CLOCK_PROCESS_CPUTIME_ID。基本上 /proc/pid/stime 或 utime 将时间保存在系统滴答声中,您的应用程序仅分别在内核/用户空间中花费。从用户空间检查抢占已经完成是不可能的(也没有必要)
  • “据观察,当作为裸机(无操作系统)运行时,代码比在操作系统上运行时快得多。” -- 这可能对几乎所有的人都是正确的案例。发出ps -A 命令以查看所有其他进程竞争资源。使用time 命令前缀执行您的应用程序。尝试使用nice 更改优先级。你的问题很像问水是不是湿的。
  • @GinuJacob 然后看看 systemtap。它可以让您非常详细地观察任何程序的行为。包括发生切换的时间。
  • 另一个想法:将您的程序放入实时调度类之一(参见 sched_setscheduler(2))。这不会完全消除中断(硬件中断等仍会触发),但没有其他非实时进程能够抢占您的进程。而且通常没有个实时进程,这样可以有效地将你置于堆的顶部。还要记住,您的程序可能会暂停还有其他原因——页面错误、I/O 等。

标签: linux linux-kernel scheduled-tasks scheduler preemption


【解决方案1】:

识别代码中两点之间是否有任何上下文切换的一种方法是使用

getrusage(int who, struct rusage *usage)

调用并比较 ru_nvcswru_nivcsw

的值
   struct rusage {
       ...
       long   ru_nvcsw;         /* voluntary context switches */
       long   ru_nivcsw;        /* involuntary context switches */
   };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多