linux的proc

来源:互联网 发布:mysql什么是事务实例 编辑:程序博客网 时间:2024/05/20 09:48

在做oj后台评测系统的时候为了计算用户代码使用的内存和时间情况接触到proc这个文件系统。现在是该好好整理下关于proc了。好多东西,有些记不住。

proc文件系统是一个虚拟文件系统,通过文件系统的接口实现,用于输出系统的运行状态,它以文件系统的形式,为操作系统本身和应用进程之间的通信提供了一个界面,使应用程序能够安全方便的获得系统当前的运行状况和内核的内部数据信息,并可以修改某些系统的配置信息,另外,由于proc文件系统的接口实现,用户可以像访问普通文件一样对其访问。但它只存在于内存当中,并不存在于真正的物理磁盘当中,所以,当系统重启和电源关闭的时候,该系统中的数据信息将全部丢失。


重要的proc文件和目录  可参考这http://www.huacolor.com/article/19656.html

    /proc/1关于进程1的信息目录。每个进程在/proc下有一个名为其进程号的目录

  /proc/cpuinfo处理器信息,如类型、制造商、型号和性能

  /proc/devices当前运行的核心配置的设备驱动的列表

  /proc/dma显示当前使用的DMA通道

  /proc/filesystems核心配置的文件系统

  /proc/interrupts显示使用的中断

  /proc/ioports当前使用的I/O端口

  /proc/kcore系统物理内存映像

  /proc/kmsg核心输出的消息,也被送到syslog

  /proc/ksyms核心符号表

  /proc/loadavg系统的平均负载

  /proc/meminfo存储器使用信息,包括物理内存和swap

  /proc/modules当前加载了哪些核心模块

  /proc/net网络协议状态信息

  /proc/stat系统的不同状态

  /proc/version核心版本

  /proc/uptime系统启动的时间长度

  值得注意的是:所有上述文件给出易读的文本文件,有时可能是不易读的格式。有许多命令做了些格式化以更容易读。例如,free程序读/proc/meminfo并将给出的字节数转换为千字节(并增加了一些信息)。

  下面将通过例子来说明如何使用PROC文件系统来获得进程的信息。

  首先使用vi编辑器建立一个c源程序文件,编译后形成目标文件,该文件的主要功能是进行计算,将其保存在/root目录下,下面将其运行:

  #cd /root //切换目录

  #./calculate //运行该程序,则生成了以该程序为名称的进程

  使用ps命令,则能发现在系统中运行了calculate这样一个进程:

  #ps

  root 2108 61.2 0.1 1344 224 pts/0 R 21:20 0:11 ./calculate

  ……

  进程的基本信息都会存放在/proc文件系统中,具体位置是在/proc目录下。通过使用如下命令可以查看系统中运行进程的相关信息:

  # ls /proc //查看/proc目录下的内容

  //如下显示为系统中运行进程的信息所存放的目录,每个进程对应一个目录,加蓝的2108为本例使用的进程的详细信息所在目录

  1 1790 1922 2049 2083 8 fs meminfo swaps

  10 1799 1923 2056 2108 9 ide misc sys

  11 1809 1924 2063 2111 apm interrupts modules sysvipc

  1491 1818 1925 2065 2138 bus iomem mounts tty

  1550 1829 1968 2067 2162 cmdline ioports mtrr uptime

  1554 1893 1969 2069 2163 cpuinfo irq net version

  1572 19 1978 2071 3 devices kcore partitions

  1591 1902 2 2073 4 dma kmsg pci

  1670 1911 2032 2074 5 driver ksyms scsi

  1720 1919 2043 2079 6 execdomains loadavg self

  1757 1920 2045 2081 7 fb locks slabinfo

  1771 1921 2047 2082 77 filesystems mdstat stat

  #cd 2108 //切换到2108目录,以方便详细的查看进程信息

  #ls //列出进程详细的状态信息文件

  cmdline cwd environ exe fd maps mem mounts root stat statm status

  在这些文件当中,status这个状态文件是比较重要的,包含了很多关于进程的有用的信息,用户可以从这个文件获得信息,如下为列出该文件内容的操作:

  #cat status //使用cat命令列出status文件内容

  Name: calculate //进程名

  State: R (running) //进程运行状态

  Tgid: 2108 //进程组ID

  Pid: 2108 //进程ID

  PPid: 2083 //父进程ID

  TracerPid: 0 //跟踪调试进程ID

  Uid: 0 0 0 0 //进程所对应程序的UID

  Gid: 0 0 0 0 //进程所对应程序的GID

  FDSize: 256 //进程使用文件句柄大小

  Groups: 0 1 2 3 4 10 10 //组信息

  //进程所使用的虚拟内存以及实际内存、信号机制方面的信息

  VmSize: 1344 kB

  VmLck: 0 kB

  VmRSS: 224 kB

  VmData: 12 kB

  VmStk: 16 kB

  VmExe: 4 kB

  VmLib: 1292 kB

  SigPnd: 0000000000000000

  SigBlk: 0000000000000000

  SigIgn: 8000000000000000

  SigCgt: 0000000000000000

  CapInh: 0000000000000000

  CapPrm: 00000000fffffeff

  CapEff: 00000000fffffeff

  这样,我们就可以知道进程使用的虚拟内存、以及实际内存、信号机制方面的信息了。



进程的proc的stat信息解析:

[root@localhost ~]# cat /proc/6873/stat
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 025 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 02097798 0 0 0 0 0 0 0 17 0 0 0 [root@localhost ~]#


每个参数意思为:
参数 解释
pid=6873 进程(包括轻量级进程,即线程)号
comm=a.out 应用程序或命令的名字
task_state=R 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disksleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie,X:dead
ppid=6723 父进程ID
pgid=6873 线程组号
sid=6723 c该任务所在的会话组ID
tty_nr=34819(pts/3) 该任务的tty终端的设备号,INT(34817/256)=主设备号,(34817-主设备号)=次设备号
tty_pgrp=6873 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=8388608 进程标志位,查看该任务的特性
min_flt=77 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=0 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=0 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=1587 该任务在用户态运行的时间,单位为jiffies
stime=1 该任务在核心态运行的时间,单位为jiffies
cutime=0 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=0 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=25 任务的动态优先级
nice=0 任务的静态优先级
num_threads=3 该任务所在的线程组里线程的个数
it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=5882654 该任务启动的时间,单位为jiffies
vsize=1409024(page) 该任务的虚拟地址空间大小
rss=56(page) 该任务当前驻留物理地址空间的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
这些页可能用于代码,数据和栈。
rlim=4294967295(bytes) 该任务能驻留物理地址空间的最大值
start_code=134512640 该任务在虚拟地址空间的代码段的起始地址
end_code=134513720 该任务在虚拟地址空间的代码段的结束地址
start_stack=3215579040 该任务在虚拟地址空间的栈的结束地址
kstkesp=0 esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip=2097798 指向将要执行的指令的指针, EIP(32 位指令指针)的当前值.
pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
block_sig=0 阻塞信号的位图
sigign=0 忽略的信号的位图
sigcatch=082985 被俘获的信号的位图
wchan=0 如果该进程是睡眠状态,该值给出调度的调用点
nswap 被swapped的页数,当前没用
cnswap 所有子进程被swapped的页数的和,当前没用
exit_signal=17 该进程结束时,向父进程所发送的信号
task_cpu(task)=0 运行在哪个CPU上
task_rt_priority=0 实时进程的相对优先级别
task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程



[root@localhost proc]# cat /proc/1/statm
487 185 133 31 0 67 0

    /proc/[pid]/statm
              Provides information about memory usage, measured in pages.  The
              columns are:
                  size       total program size
                             (same as VmSize in /proc/[pid]/status)
                  resident   resident set size
                             (same as VmRSS in /proc/[pid]/status)
                  share      shared pages (from shared mappings)
                  text       text (code)
                  lib        library (unused in Linux 2.6)
                  data       data + stack
                  dt         dirty pages (unused in Linux 2.6)




/proc/ /status
包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。

[root@localhost ~]# cat /proc/self/status
Name: cat
State: R (running)
SleepAVG: 88%
Tgid: 5783
Pid: 5783
PPid: 5742
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0 1 2 3 4 6 10 
VmSize: 6588 kB
VmLck: 0 kB
VmRSS: 400 kB
VmData: 144 kB
VmStk: 2040 kB
VmExe: 14 kB
VmLib: 1250 kB
StaBrk: 0804e000 kB
Brk: 088df000 kB
StaStk: bfe03270 kB
ExecLim: 0804c000
Threads: 1
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff


输出解释
参数 解释
Name 应用程序或命令的名字
State 任务的状态,运行/睡眠/僵死/
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。
Tgid 线程组号
Pid 任务ID
Ppid 父进程ID
TracerPid 接收跟踪该进程信息的进程的ID号
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize 文件描述符的最大个数,file->fds
Groups 
VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB) 任务在用户态的栈的大小 (stack_vm)
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE 该进程的所有页表的大小,单位:kb
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
SigQ 待处理信号的个数
SigPnd 屏蔽位,存储了该线程的待处理信号
ShdPnd 屏蔽位,存储了该线程组的待处理信号
SigBlk 存放被阻塞的信号
SigIgn 存放被忽略的信号
SigCgt 存放被俘获到的信号
CapInh Inheritable,能被当前进程执行的程序的继承的能力
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性
CapEff Effective,进程的有效能力


范例 1
可以看出该应用程序的正文段(1KB)很小,说明代码很少,是依靠库(1251KB)来执行。栈(138KB)适中,说明没有太多许多嵌套函数或特别多的临时变量。VmLck为0说明进程没有锁住任何页。VmRSS表示当前进程使用的物理内存为2956KB。当进程开始使用已经申请的但还没有用的内存时,VmRSS的值开始增大,但是VmSize保持不变。
[root@localhost 1]# cat /proc/4668/status
Name: gam_server
State: S (sleeping)
SleepAVG: 88%
Tgid: 31999
Pid: 31999
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmSize: 2136 kB
VmLck: 0 kB
VmRSS: 920 kB
VmData: 148 kB
VmStk: 88 kB
VmExe: 44 kB
VmLib: 1820 kB
VmPTE: 20 kB
Threads: 1
SigQ: 1/2047
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001006
SigCgt: 0000000210000800
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
[root@localhost 31999]#