[ 프로세스란 ? ]
실행중인 프로그램을 구성하는 메모리,cpu 그리고 I/O 자원들을 관리하는 유닉스의 추상개 념이다. 동시에 많은 일들이 일어난다는 느낌을 줄지라도, 실제로는 특정한 순간에 단 하 나의 프로세스만 실행된다. 동시에 실행되는것 같은 착각은 시간 쪼개기로 불리는 기술에 의해서 일어난다.
[ 프로세스의 구성 ]
프로세스는 커널의 내부에서 주소공간과 데이터 구조의 집합으로 이루어져있다. 주소공간은 커널이 프로세스를 사용하려고 표시를 해놓은 메모리 페이지들의 집합이고, 프 로세스가 실행중인 프로그램 코드의 한부분과, 프로세스가 사용하는 변수들, 프로세스 스택, 그리고 프로세스가 실행되는 동안 커널이 필요로 하는 여러가지 정보를 담고있다.
커널 내부 데이터 구조는 각각의 프로세스에 과한 여러 가지의 정보를을 기록한다.
PID : 프로세스 아이디 주민등록 번호처럼 고유한 프로세스 식변번호이다. PID는 프로세스가 생성된 순서되로 지정된다. 커널이 PID들을 다 써버렸을때 0 부터 다시 시작하고, 여전히 사용중인 PID들은 건너 뛴다. PPID : 부모프로세스의 PID 유닉스는 특정한 프로그램을 실행하기 위해 새로운 프로세스를 생성하는 시스템호 출을 제공하지않는다. 대신에 존재하는 프로세스는 새로운 프로세스를 생성하기 위해서 그 자신을 복제시켜야한다. 복제된 프로세스를 자식프로세스라 한다. UID : 프로세스를 생성한 사람을 나타내는 사용자 식별번호 생성자 , 슈퍼유저만이 그 프로세스에대한 변경을 할수있다.
EUID : 프로세스의 유효한 UID 이다 이 번호는 프로세스가 접근허가권을 가진 자원과 파일을 결정하는데 사용된다. SETUID 프로그램만 제외하고는 대부분의 프로세스들에서는 UID 와 EUID 값이 같다
GID : 프로세스에 대한 그룹 식별번호. 유효한 그룹번호는 /etc/group 와 /etc/passwd 의 GID 영역 안에 열거되어있다. EGID : 프로세스의 유효한 GID 이다.
프로세스의 우선순위와 나이스 값 ( NICE VALUE ) : 프로세스의 우선순위는 cpu 시간을 얼마나 많이 얻을 것이가를 결정한다. 커널이 한 프로세스를 실행시키려고 할때 커널은 가장높은 내부우선순의를 가진 프로세스를 선정한다. 내부 우선순위를 직접 설정하는것은 불가능하지만, 내부 우선순위에 중요한 영향을 미치는 프로세스의 NICE 값을 설정하는것이 가능하다. 내부 우선순위에 영향을 미치는 다른 요소는 프로세스가 최근에 사용한 cpu 시간과 실행되기 위해서 기다린 시간이다.
[ 프로세스의 생명주기 ]
새로운 프로세스는 다른 프로세스에 의해서 생겨난다. 새로운 프로세스를 생성하기위해서 프로세스는 fork 시스템 호출을 사용하여 그 자신을 복 제한다. fork 후에 새로운 프로세스는 새로운 프로그램을 실행시키기 위하여 exec 시스템 호출 중 하나를 사용한다.
시스템이 부팅되면 , 커널은 자동적으로 여러개의 프로세스를 생성한다. 가장 주목한것은 항상 PID 1 을 가지는 init 프로세스다. init 프로세스는 부팅되면서 가장 먼저 실행되는 프로세스이며, 커널이 생성하는 모든 프 로세스는 init 의 자식 프로세스가 되는셈이다. init 는 프로세스를 관리하는데 또한 중요한 역활을 한다. 하나의 프로세스를 종료하기 위한 메시지를 보내면 그 메시지는 해당 프로세스의 보모 프 로세스에게 제공되고, 부모가 wait시스템 호출을 요청할때까지 커널은 종료 코드를 저장한 다. 종료하는 프로세스의 주소공간을 해제하고, 프로세스에 더 이상의 cpu 시간을 할당하 지 않는다. 만약 부모프로세스가 자식프로세스 보다 먼저 죽었을경우, 커널은 wait 호출이되지 않음 을 인식하고, init 에게 프로세스 제어를 양도한다.
[ 프로세스의 상태 ]
process states
- Runnable - 프로세스가 실행될수있다. - Sleeping - 프로세스가 어떠한 자원을 기다리고있다. - Swapped - 프로세스가 메모리에 존재하지 않는다. - Zombie - 프로세스가 소멸되려한다. - Stopped - 프로세스가 중지되었다.
[ 프로세스 모니터링하기 ]
ps : 프로세스들을 모니터링하기 위해 시스템관리자가 주로 사용하는 도구이다. PID,UID,우선순위 프로세스의 제어 터미널을 보기위해 사용될수있다. 또한 얼마나 많은 cpu,메모리를 사용하고있는지도 확인할수있다.
[root@soma] ps aux
USER PID %cpu %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 1416 512 ? S Apr17 0:06 init [3] root 2 0.0 0.0 0 0 ? SW Apr17 0:00 [keventd] root 3 0.0 0.0 0 0 ? SWN Apr17 0:00 [ksoftirqd_cpu0] root 4 0.0 0.0 0 0 ? SW Apr17 0:00 [kswapd] root 5 0.0 0.0 0 0 ? SW Apr17 0:00 [kreclaimd] root 6 0.0 0.0 0 0 ? SW Apr17 0:00 [bdflush] root 7 0.0 0.0 0 0 ? SW Apr17 0:00 [kupdated] root 8 0.0 0.0 0 0 ? SW< Apr17 0:00 [mdrecoveryd] root 433 0.0 0.2 1480 616 ? S Apr17 0:00 syslogd -m 0 root 438 0.0 0.4 2088 1140 ? S Apr17 0:00 klogd -2 root 11912 0.0 0.7 3632 2028 ? S 10:03 0:07 /usr/sbin/sshd soma 11913 0.0 0.5 2480 1292 pts/0 S 10:03 0:00 -bash root 12086 0.0 0.7 3544 2012 ? S 15:44 0:00 /usr/sbin/sshd sako 12087 0.0 0.4 2452 1264 pts/1 S 15:44 0:00 -bash root 12180 0.0 0.3 2372 1012 pts/0 S 16:17 0:00 su - root 12181 0.0 0.5 2500 1312 pts/0 S 16:17 0:00 -bash sako 12317 0.0 0.3 2152 1012 pts/1 S 17:42 0:00 vi lib/function.inc root 12322 0.0 0.2 2660 732 pts/0 R 18:00 0:00 ps aux
[설명]
USER : 프로세스 소유주의 사용자이름 PID : 프로세스 아이디 %CPU : 사용중인 cpu 의 백분율 %MEM : 사용하는 실제 메모리의 백분율 VSZ : 이 프로세스의 가상크기 RSS : 주재하는 세트의 크기(즉 메모리에서 1K 크기의 페이지의 수) TTY : 제어 터미널 번호 STAT : 현재 프로세스의 상태
- R : Runnable - I : Sleeping ( < 20 sec ) - T : Stopped - D : in disk ( or short-term ) wait - S : Sleeping ( > 20 sec ) 추가 플래그
- L : 페이지들이 코어에서 잠겨있음 - S : 프로세스가 세션 리더임 ( 제어터미널의 처음이있음 ) - W : 프로세스가 스와프되었음
START : 프로세스의 시작시간 TIME : 프로세스가 소비한 cpu 시간 COMMAND : 프로세스의 명령어 및 인자
[root@soma] ps alx
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 100 0 1 0 8 0 1416 512 do_sel S ? 0:06 init [3] 040 0 2 1 9 0 0 0 contex SW ? 0:00 [keventd] 040 0 3 0 19 19 0 0 ksofti SWN ? 0:00 [ksoftirqd_cpu0] 040 0 4 0 9 0 0 0 kswapd SW ? 0:00 [kswapd] 040 0 5 0 9 0 0 0 krecla SW ? 0:00 [kreclaimd] 040 0 6 0 9 0 0 0 bdflus SW ? 0:00 [bdflush] 040 0 7 0 9 0 0 0 kupdat SW ? 0:00 [kupdated] 040 0 8 1 -1 -20 0 0 md_thr SW< ? 0:00 [mdrecoveryd] 040 0 433 1 9 0 1480 616 do_sel S ? 0:00 syslogd -m 0 140 0 438 1 9 0 2088 1140 do_sys S ? 0:00 klogd -2 040 0 529 1 9 0 1528 632 pipe_w S ? 0:00 /usr/sbin/automount --timeout 60 /misc file /etc/auto.misc 140 0 541 1 9 0 2648 1184 do_sel S ? 0:16 /usr/sbin/sshd 040 0 593 1 9 0 1592 656 nanosl S ? 0:00 crond 100 0 911 1 9 0 2256 1004 wait4 S ? 0:00 /bin/sh /usr/local/mysql/bin/safe_mysqld --language=korean 100 500 929 911 9 0 11932 1572 do_sel S ? 0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --da 040 500 931 929 9 0 11932 1572 do_pol S ? 0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --da 040 500 932 931 9 0 11932 1572 rt_sig S ? 0:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --da 140 0 933 1 8 0 7500 2864 do_sel S ? 0:00 /usr/local/apache/bin/httpd alx 는 aux 보다 보다 많은 기술정보를출력한다.
NI : nice 값 WCHAN : 프로세스가 기다리고있는 자원
[ 프로세스 관찰 더 잘하기 - TOP ]
PS 는 단지 한순간의 시스템정보를 출력하기 때문에 종종 무슨일이 일어나고있는지를 모를 수가있다.
[root@soma] top
6:15pm up 8 days, 23:26, 2 users, load average: 0.00, 0.00, 0.00 48 processes: 47 sleeping, 1 running, 0 zombie, 0 stopped cpu states: 0.1% user, 0.3% system, 0.0% nice, 99.4% idle Mem: 255128K av, 163748K used, 91380K free, 184K shrd, 10968K buff Swap: 525288K av, 0K used, 525288K free 94188K cached
PID USER PRI NI SIZE RSS SHARE STAT %cpu %MEM TIME COMMAND 12332 root 14 0 1020 1020 816 R 0.5 0.3 0:00 top 1 root 8 0 512 512 444 S 0.0 0.2 0:06 init 2 root 9 0 0 0 0 SW 0.0 0.0 0:00 keventd 3 root 19 19 0 0 0 SWN 0.0 0.0 0:00 ksoftirqd_cpu0 4 root 9 0 0 0 0 SW 0.0 0.0 0:00 kswapd 5 root 9 0 0 0 0 SW 0.0 0.0 0:00 kreclaimd 6 root 9 0 0 0 0 SW 0.0 0.0 0:00 bdflush 7 root 9 0 0 0 0 SW 0.0 0.0 0:00
top 명령어는 10초 간격의로 갱신된다. 가장 왕성하게 활동하는 프로세스들은 처음에 위치하 게된다.
top 명령어로는 cpu 사용량, 메모리 사용량, cpu 상태, 프로세스들을 상태등을 전반적으로 체크가 가능하다.
| |