首页 文章

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

提问于
浏览
0

我怎么知道进程闲置?

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

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

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

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

有什么建议...

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

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

4 回答

  • 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)哪个管道是可读写的 . 很可能繁忙的子进程在监视进程中将使其输入管道不可写(因为已满) .

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

  • 0

    您可以读取/ 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

  • 0

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

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

  • 1

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

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

相关问题