
프로세스의 개념 및 종류
# 프로세스의 정의
프로그램이란 어떤 문제를 해결하기 위해 사용되는 명령어나 유틸리티의 집합이다.
프로그램을 설치하면 하드 디스크에 저장되고, 프로그램을 실행하면 메모리에 상주하게 된다.
이렇듯 실행중인 프로그램을 프로세스라고 하고 실행시에 번호(PID)가 할당되어 관리된다.
프로세스는 크게 두 가지로 나눌 수 있는데, 사용자의 입력에 관계없이 실행되는 백그라운드 프로세스와 명령 입력 후 수행종료까지 기다려야 하는 포어그라운드 프로세스가 있다.
# 프로세스의 생성
하나의 프로세스가 다른 프로세스를 실행하기 위한 시스템 호출 방법에는 fork와 exec 가 있다.
fork 는 새로운 프로세스를 위해 메모리를 할당받아 복사본 형태의 프로세스를 실행하는 형태로 기존의 프로세스는 그대로 실행된다.
새롭게 생성된 프로세스는 원래의 프로세스와 똑같은 코드를 기반으로 실행된다.
exec 는 원래의 프로세스를 새로운 프로세스로 대체하는 형태로 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌운다.
즉, fork처럼 샛로운 프로세스를 위한 메모리를 할당하지 않고, exec에 호출된 프로세스만 메모리에 남겨둔다.
리눅스가 부팅을 시작하면 커널이 systemd라는 최초의 프로세스를 발생시키고 1번을 할당한다.
이후 시스템 운영에 필요한 데몬을 비롯한 다른 프로세스는 fork 방식으로 systemd 프로세스의 자식 프로세스로 생성된다.
pstree 명령으로 확인해보면 systemd라는 프로세스가 가장 왼쪽에 위치하고 있는데, 모든 프롯세스의 부모 프로세스임을 나타낸다.
보통 명령어를 실행하면 fork 형태로 수행된다. 사용자가 로그인하면 bash라는 프로세스를 할당받고 명령어를 내리면 fork 형태로 수행된다.
명령어 앞에 exec를 붙이면 기본 프로세스가 교체되면서 새로운 프로세스가 할당된다.
# 프로세스의 종류
보통 셸에서 명령을 실행하면 해당 프로셋스가 종료될때 까지 기다려야 하는데, 이러한 프로세스를 포어그라운드 프로세스라 한다.
백그라운드 프로세스는 말 그대로 눈에 보이지 않게 뒤에서 실행시키는 방식이다. 실행시키는 방법은 기존의 포어그라운드 프로세스 실행 명령 뒤에 '&'만 추가로 붙여서 실행하면 되고, 다중 작업을 수행할 때 유용하다.
# 멀티태스킹과 작업 전환
멀티태스킹이란 동시에 하나 이상의 프로그램을 실행하는 것을 말한다.
다수의 프로그램들을 백그라운드 프로세스로 실행시킨 상태에서 추가로 포어그라운드 프로세스로 다른 작업을 수행한다.
사용자는 프로세스를 중간에 중지시킬 수도 있고, 백그라운드 프로세스를 포어그라운드 프로세스로 전환하거나 포어그라운드 프로세스를 백그라운드 프로세스로 전환할 수 있다.
# 포어그라운드 프로세스 -> 백그라운드 프로세스
[ctrl] + [z]
# 일시중지 상태가 된다. job 명령으로 자업의 상태를 확인할 수 있다.
$ job
# 일시중지 상태에서 'bg' 라는 명령어를 입려하면 배그라운드 프로세스로 전환한다.
$ bg
# 백그라운드 프로세스를 포어그라운드 프로세스로 전환하기 위해서는 'fg'라는 명령어를 사용한다.
# 다수의 작업이 백그라운드로 수행중인 겨웅 'jobs'라는 명령으로 작업 내용을 확인한 후
# 'fg %작업번호' 또는 'fg 작업번호' 명령으로 원하는 작업을 전환한다.
$ vi a.txt &
$ vi b.txt &
$ jobs
$ fg %2
프로세스 관리의 이해
# IPC
IPC(프로세스 간 통신)란 프로세스들 사이에 서로 데이터를 주고받는 행위나 그에 대한 방법이나 경로를 통칭하는 말이다.
IPC 방식에는 파일,신호,소켓,공유메모리,메시지큐, 세마포, 파이프, Desktop BUS 등이 존재한다.
# 시그널
리눅스에서는 프로세스끼리 서로 통신할 때 시그널을 사용한다.
즉, 특정 프로세스가 다른 프로세스에게 메시지를 보낼 때 시그널을 이용한다. 시그널의 목록은 명령행에서 'kill -l' 로 확인 할 수 있다.
# 1(SIGHUP)
# Hangup의 약어로 로그아웃과 같이 터미널에서 접속이 끊겼을 때 보내지는 시그널이다.
# 데몬 관련 환경 설정 파일을 변경시키고 변화된 내용을 적용하기 위해 재시작할때 이 시그널을 사용한다.
# 2(SIGINT)
# 키보드로부터 오는 인터럽트 시그널로 실행을 중지시킨다. Ctrl + c 입력시 보내지는 시그널이다.
# 3(SIGOUT)
# 키보드로부터 오는 실행 중지 시그널이다. Ctrl + ₩ 입력시에 보내지는 시그널이다.
# 9(SIGKILL)
# 무조건 종류, 즉 프로세스를 강제로 종료시키는 시그널이다.
# 15(SIGTERM)
# Terminate의 약자로 가능한 정상 종료시키는 시그널로 kill 명령의 기본 시그널이다.
# 18(SIGCONT)
# Continue 시그널로 STOP 시그널 등에 의해 정지된 프로세스를 다시 실행 시킬때 사용한다.
# 19(SIGSTOP)
# 터미널에 입력된 정지 시그널이다.
# 20(SIGTSTP)
# 실행 정지 후 다시 실행을 계속하기 위하여 대기시키는 시그널이다.
# Ctrl + z 를 입력했을때 보내지는 시그널이다.
# 데몬(deamon)
데몬은 주기적이고 지속적인 서비스 요청을 처리하기 위해 계속 실행되는 프로세스로 백그라운드로 실행된다.
리눅스에서 서버역할을 하는 프로그램들이 이에 해당하고 보통 이름 뒤에 데몬을 뜻하는 d를 붙인다.
데몬 프로세스를 실행하는 방법에는 standalone 과 inet 방식이 있다.
standalone 방식은 보통 부팅 시에 실행되어 해당 프로세스가 메모리에 상주하면서 클라이언트 서비스 요청을 처리하는 방식이다.
inetd 방식은 관련 프로세스가 메모리에 항상 상주하는 것이 아니라, 클라잉언트 서비스 요청이 들어왔을때 기본적으로 inetd 데몬만 메모리에 상주하면서 inetd 데몬이 관리하는 서비스에 대한 요청이 들어왔을때 관련 프로세스를 실행하여 메모리에 상주시키고 작업이 종료되면 프로세스를 종료시킨다.
최근에는 리눅스 시스템의 메모리 용량이 커지면서 단독 데몬으로 실행하는 겨우가 늘어났다.
# 데몬의 실행
CentOs7 버전부터는 systemd 기반으로 동작하므로 systemctl 명령을 이용해서 데몬을 제어한다.
# 데몬 관련 유틸리티
# ntsysv
텍스트 환경에서 커서를 이용해 부팅 중 자동으로 실행되는 서비스를 설정할 수 있는 유틸리티.
# ntsysv [option]
# option
# --level : 특정 실행레밸을 편집한다.
# 현재 구동중인 레벨의 서비스 데몬을 설정한다.
$ ntsysv
# 실행레벨 5의 서비스 데몬을 설정한다.
$ ntsysv --level 5
# chkconfig
System V 기반의 일부 서비스와 xinetd 기반 서비스의 실행 레벨에 따른 서비스 on/off 설정리스트를 출력하거나 설정한다.
# chkconfig option [service]
# option
# --list : 각 실행레벨에서의 서비스 설정 상태를 보여준다.
# --add 서비스 : 서비스를 추가한다
# --del 서비스 : 서비스를 삭제한다.
# --level 레벨 서비스 on/off/reset : 해달 레벨에서 특정서비스의 상태를 설정한다.
# 각 실행레벨에서의 서비스 설정 상태를 보여준다.
$ chkconfig --list
# named 서비스의 상태를 본다
$ chkconfig --list network