지난번에는 /proc 에 있는 대략적인 내용만을 간략히 살펴 보았다.

 

그중에서도 중요한 파일이 있다.

stat 라는 파일 이다. 이 파일에 대하여 상세히 알아 보도록 하자.

# cat /proc/stat
cpu  544023 442606 465657 154293151 2889668 31514 77805 0
cpu0 267594 208794 234637 77115277 1492183 15589 38171 0
cpu1 276429 233812 231020 77177874 1397485 15925 39634 0
intr 284344139 79372614 10 0 0 0 0 0 0 46 0 0 0 103 0 128 0 187589552 0 96 0 17381590 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 276210886
btime 1310005227
processes 43493
procs_running 1
procs_blocked 0

제일 첫 줄의 cpu는 나머지의 합산이며, 컬럼 순서대로 다음의 정보를 담고 있다. ( 듀얼 코어의 경우 이며 단일 코어는 1개만 나온다. )
user: normal processes executing in user mode
nice: niced processes executing in user mode
system: processes executing in kernel mode
idle: twiddling thumbs
iowait: waiting for I/O to complete
irq: servicing interrupts
softirq: servicing softirqs

"intr" 부팅 이후 서비스된 인터럽트의 갯수이며, 각각 가능한 시스템 인터럽트들이다.  첫번째 컬럼은 서비스된 모든 인터럽트 개수이다.
"ctxt" 은 모든 CPU를 통틀어 context switch가 발생한 개수이다.
"btime" 은 부팅된 시스템 시간이다. 초 단위로 표시 한다.
"processes" 은 생성된 프로세스와 쓰레드수를 나타 내며, fork()와 clone()에 의해 생성된 것도 포함한다.
"procs_running" 은 CPU 상에서 현재 실행중인 프로세스의 개수를 나타낸다.
"procs_blocked" 은 현재 blocked된 프로세스의 개수를 나타내는데, I/O가 완수되기를 기다린다.

 

또한 지난번에도 말햇듯이 /proc 디렉토리 안에는 숫자로 되어 있는 디렉토리 들이 있는데 이 디렉토리는 현재 시스템에서 운영 되고 있는 각각의 process id 번호에 해당 한다.
 
즉 어떤 프로세스가 실행 되고 있다면, ps를 이용하여 확인을 해보면 대략 다음과 같은 내용이 출력 된다.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2908  1848 ?        Ss   Jul07   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jul07   0:00 [migration/0]


이중 2번째 섹션이 PID 이며, 이 PID 번호가  /proc/<번호>/ 의 형태의 디렉토리와 같이 매핑이 되게 된다.

특히 PID 1번은 어느 시스템이건 init 프로세스가 차지 하고 있다.

해당 PID 가 가리키는 디렉토리 안에 있는 파일 및 디렉토리는 해당 프로세스에 대한 정보들이 들어 있다.

이파일들 중 위의 시스템에서와 마찬가지로 stat 파일에 대하여 상세히 알아 보도록하자.

# cat /proc/1/stat
1 (init) S 0 1 1 0 -1 4194560 3707 6544232 36 1430 0 166 22229 4475 22 0 1 0 39 2977792 462 4294967295 134512640 134597368 3216010416 3216009536 4294960144 0 0 0 671835171 0 0 0 0 1 0 0 0

pid %d : 해당 프로세스의 ID
comm %s : 실행 파일 이름              
state %c : "RSDZTW" 중 하나의 문자열 ( 상태를 나타냄 ) , R은 동작중, S는 인터럽트 가능한 슬립상태, D는 인터럽트 불가능한 슬립 상태, Z는 좀비, T는 트레이스중 혹은 시그널에 의하여 멈춤, W는 paging 중.
ppid %d   : 부모 PID
pgrp %d  :  프로세스의 구룹 ID
session %d : 프로세스의 세션 ID
tty_nr %d   : 현재 사용중인 tty의 넘버
tpgid %d  : 현재 연결되어 사용중인 프로세스의 tty의 소유자 프로세스의 구룹 ID
flags %lu : 프로세스의 커널 플래그
minflt %lu : 디스크로 부터 메모리에 로딩되고 난 후, 프로세스의 마이너 폴트 번호.
cminflt %lu : 기다리고 있는 자식에게서 발생된 마이너 폴트 번호.
majflt %lu : 디스크로 부터 메모리에 로딩되고 난 후, 프로세스의 중요 폴트 번호.
cmajflt %lu : 기다리고 있는 자식에게서 발생된 중요 폴트 번호.
utime %lu  : 사용자 모드에서 사용된 jiffies 값.
stime %lu  : 커널모드에서 사용된 jiffies 값.
cutime %ld  : 사용자 모드에서 자식에게서 사용된 jiffies 값.
cstime %ld  : 커널 모드에서 자식에게서 사용된 jiffies 값.
priority %ld : 표준 nice 값.  ( 항상 양수 값 )
nice %ld : nice 값의 범위
0 %ld :  "0" 으로 하드 코딩 되어 있으며 향후에는 없어질 필드 이다.
itrealvalue %ld : The time in jiffies before the next SIGALRM is sent to the process due to an interval timer.
starttime %lu  :  The time in jiffies the process started after system boot.
vsize %lu   : 바이트 단위의 가상 메모리 크기
rss %ld   :  Resident Set Size ( 프로세스가 가진 실제 메모리상의 페이지 숫자. 단지 text, data, stack 영역의 페이지 카운드 이다. )
rlim %lu  :  프로세스의 rss 의 현재 제한 바이트 수. ( i386 에서는 일반적으로 4294967295 이다.)
endcode %lu : 텍스트가 시작된 아래 부분 주소.
startstack %lu : 스텍의 시작 주소.
kstkesp %lu  : 커널 스텍 페이지로 부터 찾은 스텍 포인터의 현재 값.
kstkeip %lu   :  현재 EIP (instruction pointer).
signal %lu    :  펜딩된 시그널.
blocked %lu   :  블럭된 시그널.
sigignore %lu :  무시된 시그널.
sigcatch %lu  : 시그널 발생 원인.
wchan %lu   :  프로세스가 웨이팅 하고 기다리고 있는 동안의 "channel" .
nswap %lu   : 스왑된 페이지 숫자
cnswap %lu   : Cumulative nswap for child processes (not maintained).
exit_signal %d : 죽을때 부모에게 보내는 시그널                  
processor %d  : 실행 될때의 CPU number.
rt_priority %lu : 리얼타임 스케줄 프라이어티                    
policy %lu : 스케줄 정책 ( 상세 내용은 sched_setscheduler 함수 참고 )


proc man 페이지를 참고 하였다.