最近在做一个项目,需要内核监控一个本机用户进程cpu占用率, 当时考虑有以下几种方法:

1,使用ps命令获取。

方法简单,直接执行命令,再过滤就行。但是从内核调用命令,查了一下,好像Linux可以使用call_usermodehelper,使内核调用用户态的程序

具体的解释在这里~ http://www.cnblogs.com/hoys/archive/2012/03/13/2395232.html。 但是对FreeBSD而言,好像就没有这样的接口啦。

2. 直接调用函数

既然ps是一个用户命令,实际起作用的应该是内核的动作,如果直接调用内核相应的函数,问题不就解决了?好像这是正解,继续分析:

首先,我先分析了下ps的实现原理。

ps -- process status, 它的主要文件是usr\src\usr.bin\procstat\Procstat.c, 在main函数中,我们看到ps实际上是通过函数

p = procstat_getprocs(prstat, KERN_PROC_PROC, 0, &cnt);

来打印进程信息的。而函数

procstat_getprocs是调用<span style="font-family: song, Verdana;">sysctl从内核中获取进程信息。
<span style="font-family: Arial, Helvetica, sans-serif;">入核了!</span>
<span style="font-family: Arial, Helvetica, sans-serif;">static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc, CTLFLAG_RD | CTLFLAG_MPSAFE,</span>
 sysctl_kern_proc, "Return process table, no threads");

通过sysctl的定义,我们发现实际的处理函数为

sysctl_kern_proc。
随后的调用关系就是sysctl_kern_proc -> sysctl_out_proc -> kern_proc_out -> fill_kinfo_proc
从 <span style="font-family: Arial, Helvetica, sans-serif;">sysctl_out_proc开始,进程变量struct proc *p是作为一个参数传递数据。因此,只要我们能够得到p,就可以调用以后的函数获得它的信息。</span>
<span style="font-family:Arial, Helvetica, sans-serif;">最后写的函数</span>
<span style="font-family:Arial, Helvetica, sans-serif;"></span><pre name="code" class="cpp">int get_kinfo_by_comm(char *comm, struct kinfo_proc *ki)
{struct proc *p;int find = 0; sx_slock(&allproc_lock);FOREACH_PROC_IN_SYSTEM(p) {if (strcmp(p->p_comm, comm) == 0) { find = 1; break;}    }    sx_sunlock(&allproc_lock);if (find) {          PROC_LOCK_ASSERT(p, MA_OWNED);MPASS(FIRST_THREAD_IN_PROC(p) != NULL);fill_kinfo_proc(p, ki); return 0;}    return 1;
} 

该函数使用p的commands, 反找相应的p,然后调用

fill_kinfo_proc
把proc中的信息存在kinfo中。

FreeBSD:从内核获取其他进程的pid及cpu占用率相关推荐

  1. kswapd0进程在CentOS下CPU占用率过高

    kswapd0进程在CentOS下CPU占用率过高 问题并不是内存不够那么简单 我自己解决问题的过程记录 问题并不是内存不够那么简单 今早到公司,开晨会,发现华为云上的测试环境应用访问不到了.晨会开完 ...

  2. linux命令获取进程pid_如何使用命令获取Linux进程的PID?

    PID或进程ID是标识进程的唯一编号.它们是由Linux内核在运行时创建的,进程调度程序控制着它们的CPU活动.因此,无论何时调用应用程序,内核都会首先产生必要的进程并为它们分配这些唯一的PID值.一 ...

  3. linux c 获取进程 cpu占用率 内存占用情况

    实例如下: #include <stdio.h> #include <unistd.h> #include <sys/time.h> #include <st ...

  4. 获取进程CPU占用率

    获取进程CPU占用率 // 时间转换 static __int64 file_time_2_utc(const FILETIME* ftime) {LARGE_INTEGER li;li.LowPar ...

  5. 如何top命令查看进程信息和cpu占用率分析

    top 通过top命令查看进程信息 通过adb shell top -h查看其使用方法 130|root@sp9820e_1h10:/ # top -h Usage: top [ -m max_pro ...

  6. oracle查询cpu占用率高,解决oracle进程CPU占用过高问题

    解决问题的过程: 1)查看服务器CPU使用情况 输入top 会发现排在前面的都是oracle的进程,而且CPU占用率都是50以上. $top top - 16:28:41 up 4 days, 22: ...

  7. 深度解读鸿蒙轻内核CPU占用率

    摘要:CPUP(Central Processing Unit Percentage,CPU占用率)分为系统CPU占用率和任务CPU占用率.用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规 ...

  8. hint ksql oracle_性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增

    你的位置: 问答吧 -> Oracle -> 问题详情 性能测试中发现oracle11g数据库每天22点,oralce进程CPU占用率突增 每天都会报以下信息(alert.log): CJ ...

  9. java获得某进程CPU占用率

    昨天碰到一个问题,用java根据进程号获得该进程的CPU占用率. 在网上找了很多例子,都是用一个sigar.jar包去做的,下载下来以后,根据示例代码,发现获得的进程CPU占用率都是0.0,不知何故. ...

最新文章

  1. DeepMind 的2017:有 AlphaGo,更有社会责任
  2. redmine1.3.x 插件安装
  3. 开发Android应用 提升性能的小技巧
  4. R in action读书笔记(3)-第六章:基本图形
  5. 今日恐慌与贪婪指数为54 等级由贪婪转为中立
  6. mongoose实现批量删除和多id查询的api/方法
  7. topjui的表格怎么得到行与列的数据
  8. openstack进阶:虚拟桌面usb重定向(usb映射)
  9. 书里都没的高清无码彩图【人人都是产品经理:9084】
  10. 全套web前端课程思维导图+视频+源码 web高端课程 深入学习 624个视频教程
  11. 126邮箱国外服务器,OUTLOOK连126邮箱能不能向国外新闻组投递邮件?哪些邮箱服务器可以?...
  12. 树莓派做旁路网关 及 无法上网解决
  13. jre包括jvm和java核心类库_JDK、JRE、JVM分别是什么及它们之间的有什么关联
  14. [原创]【2011/6/8】高一名师网校课程大全
  15. Windows10家庭版升级至专业版
  16. iOS开发拓展篇—音效的播放
  17. java基础之线程概述_繁星漫天_新浪博客
  18. 使用电子邮件营销可以更快速推广餐厅
  19. 基于C51单片机的DA方波可控制发生器
  20. 视频号关联账号超1000个!品牌矩阵如何在视频号上“风生水起”?

热门文章

  1. 基于Django的照相馆预约系统的设计与实现
  2. 支持向量机SVM(二)
  3. 【校招VIP】IT职位校招简历千万不要用两栏的模板,另外,告诉你个陷阱:越个性机会越少
  4. 接口显示返回值正常,但是拿到的值却是undefined?
  5. 龙光集团·天境助力业主成就考究生活
  6. 从HP Deskjet 460 说激光打印机打印原理
  7. 创建一个mysql组
  8. stack overflow是程序员必须会用的社区
  9. F - 士兵队列训练问题 HDU - 1276
  10. Faststone Capture怎么打开视频编辑器