检查Linux中代码的两点之间是否发生了抢占
我有一个应用程序(一个简单的C代码)运行在Linux内核之上。我正在测量代码两点之间的时间。我想知道是否有其他进程或调度程序本身在这两点之间抢占了我的应用程序。有没有办法找到这个问题。确定代码中两点之间是否存在上下文切换的一种方法是使用 getrusage(int-who,struct-rusage*用法) 调用并比较ru_nvcsw和ru_nivcsw的值检查Linux中代码的两点之间是否发生了抢占,linux,linux-kernel,scheduled-tasks,scheduler,preemption,Linux,Linux Kernel,Scheduled Tasks,Scheduler,Preemption,我有一个应用程序(一个简单的C代码)运行在Linux内核之上。我正在测量代码两点之间的时间。我想知道是否有其他进程或调度程序本身在这两点之间抢占了我的应用程序。有没有办法找到这个问题。确定代码中两点之间是否存在上下文切换的一种方法是使用 getrusage(int-who,struct-rusage*用法) 调用并比较ru_nvcsw和ru_nivcsw的值 struct rusage { ... long ru_nvcsw; /* volu
struct rusage {
...
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
这有用吗@GinuJacob你听说过时钟函数或时钟函数吗?所有这些都可以解决您的问题,请参阅CLOCK\u PROCESS\u CPUTIME\u ID。基本上,/proc/pid/stime或utime以系统时钟为单位保存时间,而您的应用程序仅分别在内核/用户空间中使用。从用户空间检查抢占已经完成这一事实是不可能的(并且没有必要)“观察到,当以裸机(没有操作系统)运行时,代码比在操作系统上运行时要快得多。”——这可能适用于几乎所有情况。发出
ps-A
命令以查看所有其他进程竞争资源。使用time
命令前缀执行应用程序。尝试使用nice
更改优先级。“你的问题很像是问水是否湿了。”GinuJacob,然后看看systemtap。它可以让您非常详细地观察任何程序的行为。另一个想法是:将您的程序放入一个实时调度类中(参见sched_setscheduler(2))。这不会完全消除中断(硬件中断等仍然会触发),但没有其他非实时进程能够抢占您的进程。通常情况下,没有实时进程,因此可以有效地将您置于堆的顶端。还要记住,程序可能会被挂起还有其他原因——页面错误、I/O等。