본문 바로가기

Linux

프로세스

프로세스의 개요

 

1) 개념

 

1. 정의

- 디스크의 프로그램을 메모리에 적재하고 실행한 상태.

- 프로세스는 프로그램의 인스턴스라고 정의할 수 있다.

 

2. 특징

- 생성, 실행, 대기, 중지, 좀비, 종료 등의 라이프사이클.

- 프로세스는 고유의 아이디 PID 를 갖고 부모-자식 관계를 맺으며 실행 우선순위와 상태를 가짐.

- 생성시간, 시스템 실행기간, 사용자 실행기간 등의 시간정보와 타이머를 가질 수 있음.

- 사용 가상 메모리, 프로세스 컨텍스트, 파일 핸들 정보 등 리소스 정보를 가짐.

 

2) 프로세스 유형

 

1. Init 프로세스

모든 프로세스의 부모 프로세스

부트 로더에 의해 리눅스 초기화를 위해 가장 먼저 실행하는 프로세스 커널이 직접 시작.

Init 프로세스의 부모 프로세스는 존재하지 않고 프로세스 ID(PID)는 항상 1

 

2. 부모 프로세스와 자식 프로세스

- 현재 실행중 프로세스A가 특정 실행파일을 실행하여 프로세스B가 생성되었다면, A는 부모, B는 자식.

- 자식프로세스의 프로세스 아이디는 PID. 부모프로세스의 PID는 PPID

 

3. 고아 프로세스와 좀비 프로세스

- 자식 프로세스가 부모 프로세스를 잃어버렸을때 고아 프로세스가 된다. 고아 프로세스의 부모 프로세스는 Init 프로세스로 변경됨.

- 자식프로세스가 종료될 때 부모프로세스가 wait() 시스템 콜 등으로 자식 프로세스의 종료코드를 회수하지 못한경우 좀비 프로세스가 됨.

  프로세스가 사용하던 리소스는 반환되었지만 테이블상 자식 프로세스가 지워지지않은 상태로 남아있음.

  부모 프로세스가 wait() 시스템 콜을 통해 자식 프로세스 종료코드를 회수하면 프로세스 테이블에서도 PID 삭제됨.

 

4. 데몬

- 시스템 부팅시 자동으로 시작되며 백그라운드로 실행

- 데몬은 사용자가 직접 제어하지 않고 보통 특정 이벤트나 상태와 같은 주기적이고 지속적인 서비스 요청을 처리하기 위해 데몬의 관련 핸들러가 실행하는 방식

- 작업 예약 cron, 파일 전송 ftpd, 프린터 lpd, 원격 접속 rlogind, 원격 명령 rshd, 텔넷 telned 등이 데몬의 좋은 예

 

3) 프로세스와 식별자

 

1. PID Process Identifier

- 시스템에서 실행중인 프로세스를 구분하기 위해 시스템에서 부여한 유일한 아이디.

 

2. PPID Parent Process Identifier

- 생성된 프로세스의 부모 프로세스의 아이디

 

3. UID UserI dentifier 또는 GID Group Identifier

- 생성된 프로세스가 속한 사용자 또는 그룹의 아이디. 보통 부모프로세스로부터 상속.


프로세스의 동작 원리

1) 프로세스 생성하기

 

1. exec 방식

- exec() 시스템 콜은 현재 프로세스의 이미지를 새로운 프로세스의 이미지로 교체

- 셸에서도 명령어 앞에 exec를 붙여서 exec 방식으로 프로세스 실행

$exec ls -l

 

2. fork 방식

- fork()를 호출하여 프로세스 생성.

- 프로세스를 생성할 때 호출한 프로세스를 복제하는 방식으로 새로운 프로세스를 생성.

- 부모프로세스의 메모리 락과 세마포어와 비동기 I/O 등은 상속되지 않음.

 

3. fork()와 exec()를 통한 프로세스 생성 과정

fork()를 통해 부모 프로세스를 복제하여 자식 프로세스 생성

exec() 호출을 통해 자식 프로세스의 프로그램으로 교체

자식프로세스가 exit()를 호출하면 부모프로세스는 wait() 시스템 콜을 통해 자식 프로세스의 종료코드 회수

 

2) 프로세스 제어하기

 

1. 포어그라운드 Foreground 프로세스

- 사용자 명령어나 프로그램을 실행하면서 셸을 블록하면서 실행하는 프로세스 

 

2. 백그라운드 Background 프로세스

- 명령어 수행 결과를 받을때까지 오랜 시간이 걸릴경우 백그라운드에서 프로세스를 실행.

- 백그라운드 프로세스를 실행하려면 명령어 뒤에 &를 붙임.

[작업번호] PID

$ls ch*.ppt &

[1] 12131

 

3. 포어그라운드 프로세스와 백그라운드 프로세스 전환

Ctrl + z를 입력하여 프로세스를 서스펜드 한후 bg 명령어로 백그라운드로 실행

$find / -ctime -1 > /tmp/changed-file-list.txt

$[CTRL^Z]
[2]+ Stopped      find/ -ctime -1 > /tmp/changed-file-list.txt

$bg

 현재 실행중인 작업의 정보를 보기위해 jobs 명령어 사용.

$job

 

백그라운드 프로세스를 다시 포어그라운드 스로세스로 돌리기 위해 fg 명령어

$fg %1

 

4. 우선순위의 설정

- 리눅스 커널에 의해 관리되고 설정되는 PR (priority)사용자가 우선순위를 조절할 수 있는 NI (Nice)

- nice 명령어를 통해 프로세스 시작 시 설정. renice 명령어를 통해 프로세스 실행 중 조절.

- PR은 0부터 139의 값을 가지고 그 중 0부터 99는 실시간 태스크에게 할당되고 사용자를 위해 100부터 139 값이 할당

- NI는 -20부터 19까지 할당될 수 있지만 음수값은 root 사용자만 설정

 

3) 프로세스 중지하기

 

1. 키보드 단축키 Ctrl + C

SIGINT 시그널을 해당 프로그램에 보내는 동작. 프로세스 종료시킴.

 

2. kill 명령어 사용하기

- kill 명령어 인자에 프로세스 PID 지정하면 해당 프로세스 종료

- 사용자가 직접 생성한 프로세스만 kill 가능

- root 사용자만 시스템 프로세스를 kill 가능

- 해당 프로세스가 다양한 수준으로 적절히 종료할수 있도록 kill 명령어의 특정 시그널을 옵션으로 지정

$kill -SIGKILL 50123

 

시그널 이란?

- 프로세스가 다른 프로세스에게 어떤 의미를 담은 신호를 주기 위한 방식

- kill -l 옵션을 통해 확인

시그널 번호 시그널 이름 설명
1 SIGHUP 터미널 접속이 연결이 끊어질 때 보내는 시그널
2 SIGINT Ctrl + C 통해 인터럽트 발생시
3 SIGQUIT Ctrl+\ 입력시
9 SIGKILL 프로세스 강제 종료시
15 SIGTERM 프로세스 정상 종료시. 소프트웨어 종료 시그널.
18 SIGCOUT STOP 시그널을 통해 정지된 프로세스를 다시 재개할 때 
19 SIGSTOP 프로세스를 중지할 때
20 SIGTSTP 프로세스를 대기 하기위해 Ctrl+Z 입력

 

4) 프로세스의 상태

- 프로세스는 실행해서 종료할 때까지 다양하나 프로세스 상태 코드를 갖음.

- 상태코드는 ps 명령어나 top 명령어를 통해 프로세스의 상태를 확인할 수 있음.

 

프로세스 상태코드

R 프로세스가 현재 실행중

D I/O와 같은 인터럽트할 수 없는 슬립 상태

S 특정 이벤트가 시그널될 때까지 기다리기 위한 인터럽트 가능한 슬립 상태

Z 좀비 프로세스

T 중지 상태

 

5) 프로세스의 구조

 

1. PCB Process Control Block

- 프로세스를 실행하고 스케줄링하고 상태가 변경될 때마다 그 정보를 저장하기 위해

커널에서 PCB라고 불리는 자료구조로 프로세스에 대한 정보를 관리

 

Pointer 프로세스의 스택 포인터
Process State 프로세스의 상태
Process Number 프로세스의 PID
Program Counter 프로세스가 실행할 다음 명령어의 주소
Registers CPU 레지스터
Memory Limits 메모리 관리에 대한 정보
Open File Lists 프로세스가 열고 있는 파일 목록
Misc. Accounting and Status Data  

 

2. 프로세스 테이블

- 시스템에 실행하고 있는 모든 프로세스를 관리하기 위한 프로세스 테이블이 존재

- 현재 실행중인 프로세스의 PID와 프로세스의 정보를 담고 있는 PCB를 담고 있음.

- 프로세스가 종료하면 프로세스 테이블에서 삭제.

 


데몬

 

1) 데몬의 실행 방식

 

1. standalone 방식

- 시스템 시작시 /etc/init.d 에 의해 실행하는 데몬. 사용자가 서비스 사용여부에 관계없이 항상 시스템에 로드

- 항상 실행되고 있으므로 사용자의 요청에 즉각적으로 응답. 시스템 메모리를 점유하고 있기 때문에 비효율적.

- 서비스 요청이 빈번할 때 적합

 

2. xinetd 방식

- 시스템 시작시 xinetd를 standalone 방식으로 실행하고 사용자의 요청이 있을때만 관련 데몬을 시작하여 서비스를 제공.

사용자의 접속이 종료되면 데몬도 자동으로 종료.

- 데몬이 필요할 때 로드되므로 자원효율이 좋음. 서비스 요청 응답이 상대적으로 느림.

- 커널 2.4 부터 xinetd데몬이 역할 수행.

 

2) 데몬 시작하기

 

1. /etc/rc.d/init.d를 통한 데몬 시작하기

데몬을 시작하고 중지 재시작 할 수 있는 데몬 스크립트가 위치.

$ls -l /etc/rc.d/init.d

 

데몬의 실행을 중지

$/etc/init.d/httpd stop

데몬을 시작

$/etc/init.d/httpd start

데몬을 중지했다가 다시 시작

$/etc/init.d/httpd restart

데몬의 환경설정 파일을 다시 로드하여 갱싱

$/etc/init.d/httpd reload

데몬을 시작

$service httpd start

 

2. init 프로세스 실행레벨에 따른 데몬 시작하기

- 실행레벨에 따라 실행할 데몬 설정

/etc/rc.d/rc0.d ~ /etc/rc.d/rc6.d 의 디렉터리 이용.

만약 실행레벨 5의 데몬설정을 위해서는 /etc/rc.d/rc5.d 필요

S로 시작하는 파일은 실행하는 데몬,

K는 실행하지 않음을 의미.

먼저 시작해야 할 의존성 있는 데몬이라면 두자리 숫자를 앞선 값으로 설정.

$ls /etc/rc5.d/*

 

3) 데몬 실행 설정 도구

 

1. ntsysv

- 터미널에서 부팅 중 실행할 데몬을 설정할 수 있는 유틸리티

- 키보드 커서를 움직여 항목으로 이동 후 스페이스 바로 설정 및 해제.

- 관리자 권한으로 실행해야 하며 -back 옵션을 주면 Cancel 대신 Back 버튼을 보여줌.

--level 옵션으로 실행레벨을 지정하면 해당 레벨에서 실행할 데몬을 설정

#ntsysv [--back][--level<levels>]

실행레벨 3의 서비스 실행 설정을 변경

#ntsysv -level3

실행레벨 0,1,6의 서비스 실행 설정을 변경

#ntsysv -level 016

 

2. chkconfig

chkconfig 를 통해 실행 설정 목록을 보거나 실행할 데몬을 추가 삭제.

실행여부

#chkconfig --list

특정 데몬의 설정을 확인. httpd 데몬의 설정 상태 확인

#chkconfig -list httpd

특정 실행레벨에서 특정 데몬 삭제

#chkconfig -level5 -del httpd

특정 데몬의 실행을 off 설정

#chkconfig httpd off

특정 데몬의 실행을 on

#chkconfig  httpd on

 

3. system-config-services

터미널에서 system-config-services 입력하여 UI방식으로 데몬 설정.

 

 

 

 

'Linux' 카테고리의 다른 글

네트워크의 설정  (0) 2020.08.19
네트워크 기초  (0) 2020.08.16
셸 Shell  (0) 2020.08.13
리눅스와 하드웨어, 리눅스의 구조  (0) 2020.08.09
운영체제, 리눅스 기초  (0) 2020.08.06