如何确定进程是否在C中空闲

时间:2014-09-13 01:00:03

标签: c linux kernel pid context-switch

我怎么知道进程正在闲置?

假设我的程序产生了许多进程,我想知道是否有任何进程闲置,所以我可以让他们做额外的工作, 但问题是如何确定进程在分配的时间片内是否空闲。

我可以在整个系统中找到cpu利用率((总时间 - 空闲时间)/总时间),但我不知道如何为进程获取它。

因为(如果我错了,请纠正我)一个进程如果在时间片中空闲,会自愿放弃剩余的cpu时间,因此获得该进程的cpu时间并不好。

一个可能的解决方案是查看自愿上下文切换计数是否增加(比如超过阈值),但我必须使用低于2.6.23的内核,以便读取/ proc / pid / status为voluntary_context_switches& nonvoluntary_context_switches对我来说不是一个选择...

任何建议......

注意: 我上面给出的例子是过度简化。 IPC不是一种选择。特定呼叫的过程应该能够确定它是否处于空闲状态。在流程花费时间的所有地方进行跟踪是不可行的。

最重要的是,我想查看一些内核属性来确定这个特定进程是否正在进行并根据此信息做一些事情。

4 个答案:

答案 0 :(得分:2)

你可以阅读/ proc / pid / stat - 第3个字段(用scanf("%*s %*s %c", &state)读取)是进程当前状态的单个字符:

R - running
S - sleeping in interruptable wait
D - waiting in uninterruptable disk sleep
Z - zombie (exited)
T - traced or stopped
W - paging wait

如果进程停止等待睡眠或I / O,它将处于状态S

答案 1 :(得分:1)

您的计划是forking(不产生)流程。换句话说,您的程序应该使用fork(2)而不是posix_spawn来启动其他进程。

然后你的程序知道它的子进程的PID(它是fork的结果),它应该保留它们。

一旦你知道一个过程的PID,例如1234,使用/proc/1234/查询有关该进程的信息。见proc(5);特别是你的程序可以读取/proc/1234/status/proc/1234/stat等....你的程序需要打开,按顺序读取和关闭这些伪文件(这很快,不涉及磁盘IO)。

但是,我认为这是错误的做法。您最好将pipe(7) - s用于这些流程,并拥有event loop,例如使用poll(2)哪个管道是可读写的。很可能繁忙的子进程在监视过程中将使其输入管道不可写(因为已满)。

顺便说一句,你应该考虑升级你的内核。

答案 2 :(得分:0)

一种方法是在Windows中使用WMI来检查进程CPU统计信息 在Unix中,您需要运行像top这样的命令来查找进程CPU利用率

或者,如果这些进程由实际创建它们的主进程管理,则需要维护与threadpool类似的空闲和已使用进程

答案 3 :(得分:0)

不确定这是否符合您的要求,但一种方法是借助内核模块从用户空间访问内核中的task_struct结构。这将在流程pid的帮助下为您提供流程的完整信息。您可以在下面的链接中查看内核源代码中的task_struct结构定义。如果您可以向我们提供有关您尝试做的更多详细信息,它将帮助我们分享可行的内容。

http://lxr.free-electrons.com/source/include/linux/sched.h#L1224