系统监视器实际上PROC文件系统的整合,通过对某一时刻PROC文件系统中的文件分析,可以得到此刻系统的详细状态信息,如CPU的使用、内存的使用、当前处于活动状态和休眠状态的进程查看……等,通过系统监视器的编写,也可以增强我们对Linux的PROC文件系统的了解,设计阶段,结合任务说明,我的监视器主要分为以下几个功能:
(1). CPU信息模块
CPU信息包括CPU物理信息以及CPU的时刻使用信息,CPU物理信息主要存放于”/proc/cpuinfo”文件中,本次打算提取以下信息:
序号 | 字段名 | 含义 | 信息值 |
1 | Model name | 型号和主频 | Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz |
2 | Cache size | CACHE 大小 | 3072 KB |
3 | Cpu MHz | 主频 | 2500 |
4 | Cpu cores | 核心数 | 1 |
5 | Address sizes | 寻址位数 | 42 bits physical, 48 bits virtual |
在该文件中,cpu主频:CPU MHz此值随时间而变化,因此显示的信息需要随时更新。此外,还需要提取出CPU的时刻使用率。
在”/proc/stat”文件中,有如下信息:
cpu 1880 214 2622 23722 100 0 52 0 0 0
cpu0 987 214 1186 11623 64 0 19 0 0 0
cpu1 892 0 1435 12099 35 0 33 0 0 0
计算CPU的利用率,需要用到前五个数据(计算CPU利用率可以查到不同版本,用前五个计算的较为常见),分别为:user, nice, system, idle, iowait. CPU时间可以通过以下等式计算:
CPU(total) =user + nice + system +idle + iowait
计算CPU利用率时,采样两个足够短的时间,分别为t1,t2。则CPU利用率可以用下等式计算
pcpu = 100 *(total – idle) / total
total =total(t2) – total(t1)
idle =idle(t2) – idle(t1)
由于CPU利用率随时间改变,因此对于显示出的CPU利用率,需要随时更新,我设置为1秒更新一次。
(2). 内存信息模块
序号 | 字段名 | 含义 | 信息值 |
1 | MemTotal | 内存总大小 | 2063728 kB |
2 | MemFree | 空余内存大小 | 1174408 kB |
3 | Buffers | 缓存大小 | 52232 kB |
4 | SwapTotal | 交换区总大小 | 1046524 kB |
5 | SwapFree | 交换区空余大小 | 1046524 kB |
相对于CPU来说,内存部分的信息较为简单,上表中内存的信息在文件”/proc/meminfo”中对于的字段即可以寻找到。此外还需要计算内存和交换分区的使用率,内存使用率按照以下公式计算:
pmm= (MemTotal – MemFree) / MemTotal
pswap= (SwapTotal – SwapFree) / SwapTotal
由于内存和交换分区使用率也随着时间而变化,因此上述两个值得信息我也设计每秒更新一次。
(3). 进程信息模块
进程信息模块主要是获得进程的详细信息,同时,我设计了刷新功能、用PID搜索进程详细信息功能以及杀死进行的功能。
Linux中,每一个进程在目录”/proc/”下对应一个文件夹,该文件夹名称为进程号,因此符合该条件的文件夹的数量即为进程数,对于每一个进程来说,其信息在”/proc/<pid>/”路径下。本次的信息主要用到了两个文件,分别为:”/proc/<pid>/status”和”/proc/<pid>/stat”
第一个文件中主要获得了以下信息:
序号 | 字段名 | 含义 |
1 | Name | 进程名 |
2 | State | 状态(S:休眠,R:运行) |
3 | Pid | 进程号 |
4 | PPid | 父进程号 |
5 | VmSize | 占用内存大小 |
为了获得进程的优先级,需要查看stat文件,在stat文件中也保存着关于该进程的一些详细信息,包括进程名,运行状态,PID等,这些信息已在status中获得,本次主要获得优先级信息即可。priority在该文件的第18位中。
通过上述过程即可获得关于进程所需要的信息,此外,还需要有通过PID查看进程、更新进程信息以及杀死进程的功能。为此,设计了一个GtkEntry,在其中输入进程号即可以进行查询,为了方便用户使用,当点击某一进程的时候,进程号会自动填写到entry中。
进程的搜索是进入”/proc/<pid>/”这个目录,如果该目录不存在则输出提示信息,然后再根据上述过程弹出对话框展示此进程详细信息。
杀死进程需要调用系统命令:system(“kill <pid>”),该功能的实现较为简单,不过杀死进程的过程中会遇到权限不够的问题,因此最好在杀死进程时进行权限的判断。
(4). 系统信息查看模块
系统信息查看模块比较简单,不需要更新,因此设置一个label显示该信息即可,获得的信息如下表所示。
序号 | 字段名 | 内容 |
1 | sysname | Linux |
2 | nodename | Ubuntu |
3 | release | 3.14.34 |
4 | version | #4 SMP Fri Mar 6 03:28:29 PST 2015 |
5 | machine | i686 |
(5). 简单功能的实现
除了几个大的模块信息之外,我还设计了以下一些额外方面用户使用的功能:
l 状态栏:一些常见的信息我再状态栏给予了显示,而不是直接采用标签,状态栏可以更灵活可变。
l 关机注销:提供常见对机器操作的功能,不过需要采用root身份登陆,如果不是root身份时,会弹出窗口警告。
l 曲线作图:曲线图有助于用户对某一物理信息有着直观上的了解,我设计了CPU利用率图像,内存使用率图像以及交换区使用率图像以方便用户有一个直观的了解。
l 时间:在状态栏中会显示系统当前时间,同时,通过系统运行时间可以获得到系统的开机时间。
l 多进程:开发出从资源管理器中可以直接打开程序的方式,不仅是程序,也可以打开文本,只需要输入对应的命令即可,起到类似于一个小的终端的功能。
l 帮助:系统帮助有助于使用者对本系统有一个大概的了解,也可以获得开发者的联系方式。
总体运行效果如下图所示:
1. CPU信息部分
2.内存以及交换分区使用率
3.进程信息查看
4.系统信息查看
5.关机提示
6.杀死进程
7. 运行子进程
代码内容详情请查看我的资源。