Chinaunix首页 | 论坛 | 博客
  • 博客访问: 616583
  • 博文数量: 104
  • 博客积分: 1968
  • 博客等级: 上尉
  • 技术积分: 1587
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 17:52
文章分类

全部博文(104)

文章存档

2013年(12)

2012年(50)

2011年(42)

分类: LINUX

2012-11-08 11:55:16

    以前有介绍过linux 下的文件结构,其中有介绍/proc/ 目录,原文链接:

   今天查到/proc/ 下进程文件的具体内容,和大家分享下。(参考资料原文见文章末)


/proc//maps 
查看进程的虚拟地址空间是如何使用的。 
该文件有6列,分别为: 
地址:库在进程里地址范围 
权限:虚拟内存的权限,r=读,w=写,x=,s=共享,p=私有; 
偏移量:库在进程里地址范围 
设备:映像文件的主设备号和次设备号; 
节点:映像文件的节点号; 
路径: 映像文件的路径 
每项都与一个vm_area_struct结构成员对应, 
范例: 
应用程序的正文段(权限为r-xp)从0x08048000到0x08049000,大小为4096;数据段从0x08049000到0x0804a000,大小为1KB。该应用程序使用了两个库:lib和libc。Libc 的正文段从0x00391000到0x004b4000,大小为1164KB;数据段从0x004b5000到0x004b8000,大小为12KB. 
Ld 的正文段从00378000到0038d000,大小为84KB;数据段从0x0038e000到0x0038f000,大小为4KB。该应用程序所使用的库所占的虚拟空间的大小从0x4b8000到0x378000,大小为1280KB,其实真正大小为VmLib(1251KB);因为是按页分配,每页大小为4KB。 

[root@localhost ~]# cat /proc/7114/maps 
08047000-080dc000 r-xp 00000000 03:06 884901 /bin/bash 
080dc000-080e3000 rwxp 00094000 03:06 884901 /bin/bash 
080e3000-08129000 rwxp 080e3000 00:00 0 [heap] 
4d575000-4d58a000 r-xp 00000000 03:06 736549 /lib/ld-2.3.4.so 
4d58a000-4d58b000 r-xp 00015000 03:06 736549 /lib/ld-2.3.4.so 
4d58b000-4d58c000 rwxp 00016000 03:06 736549 /lib/ld-2.3.4.so 
4d58e000-4d6b1000 r-xp 00000000 03:06 736550 /lib/tls/libc-2.3.4.so 
4d6b1000-4d6b2000 r-xp 00123000 03:06 736550 /lib/tls/libc-2.3.4.so 
4d6b2000-4d6b5000 rwxp 00124000 03:06 736550 /lib/tls/libc-2.3.4.so 
4d6b5000-4d6b7000 rwxp 4d6b5000 00:00 0 
4d6de000-4d6e0000 r-xp 00000000 03:06 736552 /lib/libdl-2.3.4.so 
4d6e0000-4d6e2000 rwxp 00001000 03:06 736552 /lib/libdl-2.3.4.so 
4d807000-4d80a000 r-xp 00000000 03:06 736567 /lib/libtermcap.so.2.0.8 
4d80a000-4d80b000 rwxp 00002000 03:06 736567 /lib/libtermcap.so.2.0.8 
b7bf2000-b7c1e000 r-xp 00000000 03:06 881337 /usr/lib/gconv/GB18030.so 
b7c1e000-b7c20000 rwxp 0002b000 03:06 881337 /usr/lib/gconv/GB18030.so 
b7c20000-b7c26000 r-xs 00000000 03:06 881502 /usr/lib/gconv/gconv-modules.cache 
b7c26000-b7d2f000 r-xp 02197000 03:06 852489 /usr/lib/locale/locale-archive 
b7d2f000-b7f2f000 r-xp 00000000 03:06 852489 /usr/lib/locale/locale-archive 
b7f2f000-b7f38000 r-xp 00000000 03:06 734450 /lib/libnss_files-2.3.4.so 
b7f38000-b7f3a000 rwxp 00008000 03:06 734450 /lib/libnss_files-2.3.4.so 
b7f3a000-b7f3c000 rwxp b7f3a000 00:00 0 
b7f51000-b7f52000 rwxp b7f51000 00:00 0 
bfc3d000-bfc52000 rw-p bfc3d000 00:00 0 [stack] 
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso] 
[root@localhost ~]# 

参数 解释 
address: 0085d000-00872000 虚拟内存区域的起始和终止地址文件所占的地址空间 
perms:rw-p 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write) 
offset: 00000000 虚拟内存区域在被映射文件中的偏移量 
dev: 03:08 文件的主设备号和次设备号 
inode: 设备的节点号,0表示没有节点与内存相对应 
name: /lib/ld-2.3.4.so 被映射文件的文件名 

各共享库的代码段,存放着二进制可执行的机器指令,是由kernel把该库ELF文件的代码段map到虚存空间; 
各共享库的数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间; 
用户代码段,存放着二进制形式的可执行的机器指令,是由kernel把ELF文件的代码段map到虚存空间; 
用户数据段之上是代码段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间; 
用户数据段之下是堆(heap),当且仅当malloc调用时存在,是由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在; 
用户数据段之下是栈(stack),作为进程的临时数据区,是由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。 

[root@localhost ~]# ldd /bin/bash 
linux-gate.so.1 => (0xffffe000) 
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4d807000) 
libdl.so.2 => /lib/libdl.so.2 (0x4d6de000) 
libc.so.6 => /lib/tls/libc.so.6 (0x4d58e000) 
/lib/ld-linux.so.2 (0x4d575000) 
[root@localhost ~]# 

这个所谓的"linux-gate.so.1"的内容就是内核映射的代码,系统中其实并不存在这样一个链接库文件,它的名字是由ldd自己起的,了0xffffe400这里的一段代码,这里就是内核为我们映射的系统调用入口代码。Mapped是该应用程序的虚拟空间的大小,这里的值比用top 或ps都大了4KB,就是最后0xffffe400-0xffffffff的代码;shared 给出共享的虚拟空间部分。 

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

[root@localhost ~]# cat /proc/6873/stat 
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 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:disk sleep (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_realvalue=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实时进程 

3 /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]# 

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

[root@localhost ~]# cat /proc/self/statm 
654 57 44 0 0 334 0 


输出解释 
CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为: 
参数 解释 /proc//status 
Size (pages) 任务虚拟地址空间的大小 VmSize/4 
Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4 
Shared(pages) 共享页数 0 
Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4 
Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4 
Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4 
dt(pages) 0 
4
 



阅读(4667) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~