IT/OracleLinux-1Z0460

프로세스

알콩달콩아빠 2022. 5. 19. 19:11
728x90
반응형

안녕하세요

 

뚱보 프로그래머 입니다.

 

오늘은 프로세스에 대해서 살펴봅니다.

 

Process

1. Process 개요

프로그램은 프로세스가 될 가능성을 간직한 채 디스크에 잠들어 있는 정보를 의미하며 프로세스는 프로그램이 메모리상에서 활동하고 있는 상태를 의미한다. , 시스템 내에서 실행되는 모든 프로그램은 프로세스로 알려져 있다. 리눅스는 init과 같은 시스템 유형의 프로세스, 유틸리티나 쉘, 서드파티 제품의 응용 프로그램 프로세스를 구별하지 않는다. 모든 프로세스는 동등하게 cpu 시간, 메모리, 디바이스 등과 같은 자원을 할당받는다. 커널은 이러한 시스템 자원을 배분하고 중재하는 역할을 담당한다.

프로그램은 /bin/bash와 같은 실행될 수 있는 파일을 의미한다. 그리고 프로세스는 현재 실행되고 있는 또는 실행 큐에서 대기중인 프로그램으로 한 프로그램에서 다수의 프로세스가 생성될 수 있다. 또는 프로세스를 task라고 부르기도 한다. 리눅스는 멀티 태스킹 운영 체제이므로 동시에 여러 개의 프로세스가 실행될 수 있으며 현재 실행되는 프로그램에서 다른 프로그램으로 실행이 switching될 수 있다.

리눅스는 두가지 유형의 프로세스를 지원하는데, 하나는 시스템 프로세스이고 다른 하나는 표준 프로세스이다. 각 프로세스의 범주는 자신의 우선 순위 레벨을 가지고 있다. 커널은 모든 프로세스에게 공정하게 cpu 시간을 할당하려 한다. 실행 큐에 있는 프로세스들중 우선 순위를 참조하여 context switch를 실행한다. 우선 순위는 커널만이 변경이 가능하며 사용자는 nice renice 명령, 또는 top을 실행한 후 우선순위를 변경할 수 있다.

 

생성

하나의 프로세스가 다른 프로세스를 생성할 경우 원래의 프로세스가 더 이상 남아 있을 필요가 없다면 exec() 호출을 통하여 자신을 다른 프로그램을 실행하는 새로운 프로세스로 대치할 수가 있다.

원래의 프로세스가 계속 존재하려면 fork() 호출을 통하여 자신의 복사본 프로세스를 먼저 만들고 복사본 프로세스에서는 다시 exec() 호출을 통하여 자신을 다른 프로그램을 실행하는 새로운 프로세스로 대치한다.

 

[root @edu00 linux]#pstree

init 프로세스가 커널 이후에 실행되는 최초의 프로세스가 되고 그 밑으로 자식 프로세스들이 생성되게 된다. 하나의 프로그램이 다른 프로그램을 시작할 때  그 새로운 프로세스를 서브 프로세스 혹은 child 프로세스라고 한다. shell이 또 다른 shell을 시작할 때 그 새로운 shell을 서브 shell이라 한다.

자식 프로세스는 부모 프로세스의 환경을 물려받는다. 그리고 자식 프로세스가 자신의 환경을 변경할 때 그것은 부모 프로세스에게 전달되지 않는다.

 

다음은 프로세스의 생성 과정이다.

[root @edu00 linux]#bash

[root @edu00 linux]#ps

[root @edu00 linux]#bash

[root @edu00 linux]#ps

[root @edu00 linux]#exec ps

 

2. 프로세스 관리

1) ps

현재 실행되고 있는 프로세스들을 리스트로 보여준다.

옵션

-a : 전체 사용자의 모든 프로세스 출력

-e : 명령문 실행 후 프로세스 환경 변수 출력

-l : 자세히 출력

-u : 사용자 이름과 프로세스 시작 시간을 출력

-w : 출력 결과가 한 줄을 넘어도 모두 출력

-x : 제어하는 터미널이 없는 프로세스 출력

 

1] 상태보기

user(BSD)           프로세스 소유자의 username

uid(sys V)           프로세스 소유자의 username

pid                      프로세스 식별 번호

%cpu                  cpu 사용 비율의 추정치

%mem                메모리 사용 비율의 추정치

SZ                      K 단위 혹은 페이지 단위의 가상 메모리 사용량

RSS                     사용중인 실제 메모리 사용량

TTY                    프로세스와 연결된 터미널 포트

STAT                  프로세스의 현재 상태

R           실행 중 혹은 실행될 수 있는 상태

S           sleep

I             idle (비활동 상태:BSD, 중간적 상태:sys V)

T           정지된 상태(suspend)

Z           좀비(zombie) 프로세스

D           디스크 관련 대기 상태

P           페이지 관련 대기 상태

X           메모리 확보를 위해 대기중(sys V)

K           사용 가능한 커널 프로세스(aix)

W           스왑 out된 상태

N           nice되어진 상태

<           우선 순위가 인위적으로 높아진 상태

TIME                    CPU 사용 시간

COMMAND          프로세스의 실행 명령행

STIME(sys V)     프로세스가 시작된 시간 혹은 날짜

C(sys V), CP(BSD)           짧은 기간동안의 CPU 사용율

F                         프로세스의 플래그들

PPID                    부모 프로세스

PRI                      실제 실행 우선 순위

NI                        nice

WCHAN               프로세스를 기다리는 이벤트, 커널 레벨의 특별한 프로세스

 

2]  command

[root @edu00 linux]#ps aux

[root @edu00 linux]#ps -ef

[root @edu00 linux]#ps aux | grep httpd

 

2)  top

프로세스를 모니터할 수 있는 유틸리티로 프로세스의 활동을 실시간으로 모니터링한다.

CPU와 메모리 등에 대한 시스템 정보를 보여준다.

1]  top 실행시 각 항목의 의미 (라인별)

1> 현재 시간, 시스템 부팅 후 경과 시간, 로그인한 사용자의 수, 세 개의 부하 평균값

(1, 5, 15분 동안의 프로세스 수의 평균)

 

2> 실행되고 있는 프로세스의 통계 값,

실행 중인 프로세스의 총 갯수, 프로세스 상태(sleeping, running, zombie, stopped)

 

3> CPU 상태

사용자, 시스템, nice, idle 프로세스가 사용한 CPU 시간의 비율을 %

 

4> 메모리 상태

총 메모리, 사용 중인 메모리, 사용 가능한 메모리, 공유 메모리, 버퍼에 사용되고 있는 메모리의 양

 

5> 스왑 상태

사용 가능한 총 스왑, 사용 중인 스왑, 사용 가능한 스왑, 캐쉬에 사용되고 있는 스왑 공간

 

6> 프로세스 상태

PID        Process ID

PPID      parent Process ID

UID

USER

PRI         현재 지정된 우선순위이며 자동으로 바뀐다.

NI          nice 값은 특별히 지정하지 않으면 0이며, 범위는 –20에서 19까지, 값이 작을수록 우선순위가 높다.

SIZE      프로세스의 코드와 데이타의 크기(KB)

TSIZE    프로세스의 코드 사이즈

DSIZE    프로세스의 데이타 사이즈

SWAP   

RSS       프로세스가 사용하는 실제 메모리 양(여러 라이브러리 등에 사용하는 메모리 총량)

SHARE  

STAT     S : sleeping, D : uninterruptable sleeping, R : running, Z : zombie, T : stop or trace

à 위 상태코드 뒤에 <, N, W  < : 음수의 nice 

                   N : 양수의 nice 

                   W : 현재 메모리에서 디스크로 스왑되어 있는 상태

LIB        라이브러리 페이지 크기

%CPU    CPU 사용량의 비율

%MEM  

TIME      프로세스가 시작하여 사용한 총 CPU 시간

COMMAND          프로세스를 실행한 명령어 라인

 

2]  top 실행시 키워드

SPACE   화면 갱신

h, ?       

k            kill

I             zombie, idle 프로세스들의 출력을 on/off

n, #        출력할 프로세스의 수를 지정

q           종료

r            nice 값 변경

s           화면을 갱신하는 시간을 변경

F, f        보여줄 항목을 추가하거나 삭제

O, o       보여줄 항목의 순서를 변경

l             첫 라인(uptime) on/off

m           메모리 관련 항목 on/off

t            프로세스와 CPU 항목을 on/off

c           command line의 항목을 on/off

M           프로세스를 RSS 값으로 정렬

P           %CPU 값으로 정렬(default)

T           time 값으로 정렬

W           설정을 저장   

 

3. signal 보내기(kill)

 

1) 개념

프로세스간 통신 수단인 signal은 하나의 프로세스가 다른 프로세스에게로 메시지를 보내기 위한 수단이다. 이때 사용하는 명령어인 kill은 프로세스를 죽이라는 명령이 아니라 signal을 보내라는 명령이다.

만일 의도하지 않은 프로세스가 있다면 그 프로세스를 처리하여야 할 것이다. 해당 프로세스를 처리하기 위해서 사용하는 신호가 있으며, 일반적으로 프로세스를 정지시키거나(STOP), 계속(CONT), 종료(KILL), 설정파일을 다시 읽어들이는(HUP) 등의 신호가 있다.

 

2)  종류

이러한 신호의 유형은 명령행에서 kill –l로 신호의 종류를 확인할 수 있다.

이름       번호     의미

HUP       1            Hangup  (실행 종료, 로그 아웃하거나 모뎀 접속을 끊을 때 보내진다.)

INT        2            Interrupt (실행 종료, Ctrl+c를 누르면 보내진다.)

QUIT     3            Quit         (실행 종료, Ctrl-\를 누르면 보내진다.)

KILL       9            Kill           (무조건 종료)

SEGV    11          Segmentation Violation(허가되지 않은 메모리 영역에 접근 하였다.)

TERM    15          Terminate (가능한 정상 종료)

CONT    18          Continue  (Stop이나 TSTP에 의해 정지된 프로세스가 다시 실행을 계속한다.)

STOP     19        무조건적으로 그리고 즉각적으로 정지

TSTP    20          Stop (실행을 정지시킨 후 다시 실행을 계속하기 위하여 대기, Ctrl+z)

 

3)  사용법

kill

신호를 받을 프로세스를 PID로 지정한다.

[root @edu00 linux]#kill <pid>

[root @edu00 linux]#kill -<signal> <pid>

[root @edu00 linux]#ls -lR / > tt 2 > /dev/null &

[root @edu00 linux]#ps

[root @edu00 linux]#kill -9 <pid>

[root @edu00 linux]#ps

 

killall

해당 프로세스의 pid를 일일이 알지 못하더라도 프로세스의 이름만으로 해당 프로세스를 처리할 수 있다. 이 명령어는 작업을 손쉽게 할 수 있는 반면에 자신의 권한을 남용하여 다른 사용자의 작업을 종료시킬 수 있기 때문에 주의할 필요가 있다.

[root @edu00 linux]#killall httpd

[root @edu00 linux]#killall –HUP xinetd

   

4. 프로세스 자원의 한도 제한

대규모의 서비스를 처리하는 경우에는 동시에 열 수 있는 파일 개수나 한 프로세스가 열 수 있는 파일의 개수 등을 확인해야 한다. 예를 들어 웹 서비스를 할 경우 동시 접속자 수를 지정하기 위해 /etc/httpd/conf/httpd.conf 파일을 열어 MaxKeepAliveRequests 100, MaxClients 150 등으로 설정하는 것과 같은 개념이다.

프로세스의 자원에 대한 제한을 설정하는 명령어는 ulimit이다.

 

사용방법

#ulimit [-Shacdflmnpstuv [limit]]

limit 부분이 생략되면 자원의 현재 soft limit 값이 출력된다.

 

옵션

-a : soft 제한값을 보여준다. 새로운 프로세스가 만들어졌을 때 기본값으로 적용되는 자원의 한계이다.

-H : 커널 차원에서 지원하는 hard 제한값을 보여준다. 슈퍼유저만이 확장 가능하다.

 

사용 예

[root @edu00 linux]#ulimit –a

core file size (blocks)                   1000000

data seg size (Kbytes)                  unlimited

file size (blocks)                           unlimited

max locked memory (kbytes)        unlimited

max memory size (kbytes)            ulimited

open files                                      1024

pipe size (512 bytes)                    8

stack size (kbytes)                       8192

cpu time (seconds)                       unlimited

max user processes                     4095

virtual memory (kbytes)                 unlimited

 

file size는 쉘에서 생성되는 파일의 최대 크기이다.

open files는 파일 디스크립터의 최대 숫자이다.

virtual memory는 쉘에서 사용 가능한 가상 메모리의 최대 용량이다.

 

5. 파일 및 프로세스의 수 변경

[root @edu00 linux]#vi /usr/src/linux-2.4/include/linux/fs.h

………..

#define NR_OPEN (1024*1024)  /* Absolute upper limit on fd num */

한 프로세스가 열 수 있는 최대 파일 수

 

#define NR_FILE 8192 /* this can well be larger on a larger system */

동시에 리눅스 시스템에서 열 수 있는 파일 수

…………….

이 파일을 수정한 후 커널 컴파일을 하여 새로운 커널로 부팅을 시키면 된다.

 

6. 프로세스 accounting

프로세스 accounting은 시스템에서 실행되는 모든 프로세스에 관한 정보를 기록(log)하는 커널 기능으로 사용자 로그인, CPU 사용, 메모리 사용, I/O 전송 명령 등에 대한 자세한 정보를 기록하고 유지하게 된다. 프로세스가 종료될 때마다 로그파일에 기록된다.

 

1) 활성화

일반적으로 시스템의 init script(/etc/rc.d/rc.sysinit)에 다음을 추가하면 accounting이 활성화된다.

 

#Turn process accounting on.

If [ -x /sbin/accton ]

Then

                           /sbin/accton /var/log/pact

                           echo “Process accounting turned on.”

fi

 

2) accounting 명령어

ac

/var/log/wtmp 파일을 근거로 하여 사용자의 접속시간을 출력한다.

 

사용 예

[root @edu00 linux]#ac –p

test                     0.16

edu                     0.11

root                    81.46

ftp                       0.02

total       81.76

 

accton

프로세스 account를 활성화시키거나 비활성화 시킨다.

보통 부팅시에 수행되도록 init 스크립트(/etc/rc.d/rc.sysinit)에 포함시킨다.

[root @edu00 linux]#accton

 

last

/var/log/wtmp 파일을 참고하여 사용자의 접속시간에 관한 정보를 출력한다.

 

sa

실행되었던 명령, I/O 동작, CPU 시간 등에 대한 요약 정보를 /var/log/pacct를 참고하여 출력한다.

 

lastcomm

/var/log/pacct에 기록되어 있는, 이미 실행된 모든 명령에 대한 정보를 출력한다.

 

7. Multitasking

동시에 하나 이상의 프로그램을 실행시킬 수 있는 multitasking linux의 장점중 하나이다.

   

1) foreground, background & suspend

linux에서는 프로그램을 foreground background로 구별한다. 이 기능으로 하나 이상의 작업을 console에서 사용할 수 있다.

foreground : 화면에 출력시키면서 실행되는 상태(입력 불가능)

background : 화면에 보여주지 않으면서 실행되는 상태(입력 가능)

suspend : 메모리에 올라가 있지만 정지되어진 상태

 

2) foreground로 실행

일반적인 작업은 모두 여기에 해당된다.

[root @edu00 linux]#ls -lR / > ls.txt 2> /dev/null

 

3)  background로 실행

foreground로 실행하는 것과 비슷하지만 뒤에 &를 붙이면 화면 뒤에서 실행된다.

동시에 다른 작업을 할 수 있지만 background로 할 수 있는 작업은 제한되어 있다.

예를 들면 vi background로 실행한다면 suspend될 것이다.

[root @edu00 linux]#ls -lR / > ls.txt 2> /dev/null &

[root @edu00 linux]#ps

[root @edu00 linux]#jobs

 

4)  foreground suspend

foreground로 실행되는 프로그램을  suspend시킬 수 있다.

Ctrl+Z를 누르면 실행 중이던  프로그램이 suspend된다.

Ctrl+C와 비교하면 좋을 것이다.

[root @edu00 linux]#ls -lR / > tt 2> /dev/null

Ctrl+Z

[1]+ Stopped

 

[root @edu00 linux]#ps

[root @edu00 linux]#jobs

 

Suspend된 것을 다시 foreground로 하기 위해서는 "fg %<작업번호>를 사용한다.

위에서 [1]이 작업 번호이다.

[root @edu00 linux]#fg %1

 

Suspend된 것을 다시 background로 하기 위해서는 "bg %<작업번호>를 사용한다.

[root @edu00 linux]#bg %1

[root @edu00 linux]#jobs

 

5)  daemon zombie

process들 중에서 특별한 이름을 가지고 있는 것들이 있다. 그 중에서 daemon background로 실행되면서 server의 역할을 하거나 그 기능을 도와주는 process를 말한다. 일반적으로 데몬은 특정한 지시가 있을 경우 종료가 되거나 재가동되는 프로세스이다. 데몬의 중요한 특성 중 하나는 터미널에 종속되어 있지 않다는 것이다. 일반 프로세스는 연관된 터미널이 사라질 때 SIGTERM 신호를 받게 되지만 데몬은 이 신호를 받지 않는다.  ps명령으로 확인하면 해당 TTY 필드가 “?”로 나타나는 경우가 이에 해당된다.

 

데몬은 시그널과 같은 사건을 기다리다가 사건이 발생하면 깨어나서(wake up) 사건을 처리하고 다시 잠자는(sleep) 상태가 된다. 어떤 경우는 자식 프로세스를 생성(fork)하여 사건을 처리하게 하고 자신은 다음의 사건을 기다린다. 좀비 프로세스는 사건을 처리하여 자신의 임무를 완성하였지만 정상적으로 종료하지 못하고 남아있는 프로세스이다. 일반적으로 상위의 프로세스가 자식 프로세스를 거두지만 미처 거두어들이지 못한 프로세스를 좀비 프로세스라고 한다. 보통 소프트웨어의 버그로 인하여 생성되며 이런 프로세스들은 cpu의 자원을 점유하지는 않지만 테이블의 용량을 차지하여 시스템 crash의 원인이 될 수 있다. 이런 좀비 프로세스는 상위의 프로세스를 kill이나 killall 명령으로 종료시키고 해당 응용프로그램을 다시 실행해서 제거한다. 프로세스를 시스템 자원이 한계에 이르기까지 실행시키는 시스템에서 좀비 프로세스가 많아지면 시스템에 문제가 발생할 수 있다.

 

 

참쉽죠잉

728x90
반응형

'IT > OracleLinux-1Z0460' 카테고리의 다른 글

X윈도우  (0) 2022.05.19
프로그래밍  (0) 2022.05.19
리눅스 계정  (0) 2022.05.19
여러가지 etc 명령어  (0) 2022.05.19
프로세스 상태 확인 and 텍스트 프로세싱  (0) 2022.05.19