仅使用系统调用监视进程活动(不使用“top”等实用程序)

仅使用系统调用监视进程活动(不使用“top”等实用程序)

我想使用Linux系统调用获取有关不同用户和用户正在运行的不同进程使用的内存的信息以及有关这些进程的统计信息,例如内存消耗、执行速度等。

我不想使用诸如 等命令freetop任何人都可以建议如何执行此操作吗?

答案1

了解如何使用内存非常重要。内存的很大一部分通常是共享的。程序及其库中使用的任何代码都在不同进程之间共享。代码以只读方式映射到内存中,并由所有进程共享,因此不属于任何一个用户。某些库几乎libc被每个进程使用,但只在 RAM 中加载一次。代码较多的程序比数据较多的程序拥有更多的共享内存。

为了回答你的问题,top、free 和 ps 等程序获得的几乎所有信息都来自扫描/proc文件系统。每个进程都有自己的文件夹,并以其 PID 命名。其中有许多文件,例如显示内存映射的maps、显示启动进程所执行的命令的comm 以及显示I/O 使用情况的io。/proc里面有介绍Linux 内核文档

答案2

我认为您需要使用以下方法。我正在展示一个示例:

  • 考虑到我需要了解有关在我的 Linux Box 上运行的 Firefox 浏览器的信息。我将按照以下步骤操作:

    1. 获取火狐浏览器的PID:

    [shubham@system-dev ~]$ ps -aux | grep firefox Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ shubham 24790 17.5 25.8 1679220 1038440 ? Sl 09:15 26:02 /usr/lib/firefox/firefox

    1. 现在使用带有“PID”的/proc FS来查看各种信息(下面给出了我的linux机器上的firefox的示例) [shubham@system-dev ~]$ cat /proc/24790/status Name: firefox State: S (sleeping) Tgid: 24790 Pid: 24790 PPid: 29843 TracerPid: 0 Uid: 501 501 501 501 Gid: 0 0 0 0 Utrace: 0 FDSize: 256 Groups: 0 VmPeak: 1682804 kB VmSize: 1679412 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 1183048 kB VmRSS: 1040800 kB VmData: 1453848 kB VmStk: 152 kB VmExe: 64 kB VmLib: 61296 kB VmPTE: 2828 kB VmSwap: 147048 kB Threads: 24 SigQ: 1/31287 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000001001000 SigCgt: 00000001800044ef CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: ffffffffffffffff Cpus_allowed: f Cpus_allowed_list: 0-3 Mems_allowed: 1 Mems_allowed_list: 0 voluntary_ctxt_switches: 2604819 nonvoluntary_ctxt_switches: 560691

    2. 您可以使用 /proc// 目录下的许多文件进行监控(例如:mem、io、stat.stack 等)

注意:如果仅与系统调用一起使用,您将需要以下系统调用:open()、creat()、close()、read() 等。

希望你能明白我的答案!

相关内容