프로세스의 개념과 유형
쉽게 말하면
디스크에 저장된 프로그램을 실행하면, 메모리에 올라와 '지금 일하는 중'인 상태가 돼요. 이것이 프로세스예요. 프로세스마다 번호(PID)가 있고, 자기를 실행한 부모가 있어요. 요리책(프로그램)과 그 책을 보고 요리 중인 요리사(프로세스)의 차이예요.
시험용 정의
프로그램은 디스크에 있는 실행 파일이고, 그것이 메모리에 올라 실행 중인 상태가 프로세스다. 각 프로세스는 고유 번호 PID와 부모 번호 PPID를 가지며, 모든 프로세스의 조상은 PID 1(systemd 또는 init)이다.
비유로 이해하기
프로그램은 요리책, 프로세스는 그 책을 보고 지금 요리하는 중인 요리사다. 같은 요리책으로 요리사 여러 명(프로세스)이 동시에 일할 수 있다.
자세히
그림으로 보기: 프로세스 상태
- 생성fork 로 만들어짐
- 준비(Ready)CPU 를 기다림
- 실행(Running)CPU 를 받음(디스패치), 시간이 끝나면 준비로
- 대기(Waiting)입출력을 기다림, 끝나면 준비로
- 종료부모가 거두지 않으면 좀비(Z)
프로세스의 종류
| 포그라운드 | 터미널을 차지하고 실행, 끝날 때까지 다른 명령 불가 |
| 백그라운드 | 명령 뒤 &. 터미널을 쓰면서 뒤에서 실행 |
| 데몬 | 터미널 없이 계속 떠서 서비스 제공 (sshd, httpd, crond) |
| 좀비 (Z) | 종료됐지만 부모가 종료 상태를 거두지(wait) 않아 목록에 남음. 이미 죽은 상태라 kill -9도 소용없고, 부모가 거두거나 부모를 끝내야(그러면 PID 1이 거둠) 사라진다 |
| 고아 | 부모가 먼저 종료. PID 1이 새 부모가 되어 거둬 준다 |
생성 방식 fork와 exec
fork: 부모가 자신을 복제해 새 PID의 자식을 만든다. exec: 현재 프로세스를 다른 프로그램으로 교체한다(PID 유지). 셸에서 ls를 치면 셸이 fork → 자식이 exec(ls). exec ls를 직접 치면 셸 자체가 ls로 바뀌어 끝나면 로그아웃된다.
데몬을 띄우는 두 방식: standalone과 inetd
| standalone(단독형) | inetd·xinetd(슈퍼 데몬 방식) | |
|---|---|---|
| 동작 | 데몬이 항상 메모리에 떠서 요청을 기다림 | 슈퍼 데몬(inetd, xinetd) 하나만 떠 있다가 요청이 오면 해당 서비스를 그때 실행 |
| 응답 속도 | 빠름 | 요청마다 실행하므로 느림 |
| 메모리 | 많이 씀 | 적게 씀(자원 효율적) |
| 어울리는 서비스 | 요청이 잦은 서비스(웹 httpd, 메일 sendmail, DB) | 가끔 쓰는 서비스(telnet, 옛 ftp) |
| 최근 | 대부분의 서비스 | systemd의 소켓 활성화가 비슷한 역할 |
PID 1의 변천
예전 배포판(CentOS 6 등)은 init, CentOS 7 이후는 systemd가 PID 1이다. 부팅할 때 커널이 가장 먼저 실행하는 초기화 프로세스로, 이후 모든 서비스를 띄운다.
/proc에서 보기
각 프로세스는 /proc/PID/ 디렉터리로 보인다(cmdline, status, fd 등). ps·top도 여기서 정보를 읽는다.
시험에 이렇게 나와요
- 자식 프로세스를 만드는(복제) 방식 → fork, 현재 프로세스를 다른 프로그램으로 교체 → exec
- PID 1(초기화 프로세스) → CentOS 7 이후 systemd, 이전 init
- 메모리에 늘 상주하며 요청을 기다리는 방식 → standalone, 요청이 오면 슈퍼 데몬이 실행해 주는 방식 → inetd(메모리 효율적)
- 터미널 없이 백그라운드에서 계속 도는 서비스 프로세스 → 데몬, 좀비 프로세스 상태 코드 → Z
확인 문제
Q1. 부모 프로세스가 자식의 종료 상태를 거둬 가지 않아, 이미 끝났는데도 프로세스 목록에 <defunct>로 남아 있는 프로세스를 무엇이라 할까?
- 대기 프로세스
- 고아 프로세스
- 데몬 프로세스
- 좀비 프로세스
정답 보기
4번 좀비 프로세스
실행은 끝났지만 부모가 wait로 종료 상태를 받아 가지 않아 목록에만 남은 것이 좀비(Z)다. 반대로 부모가 먼저 죽어 PID 1(systemd)이 새 부모가 된 것은 고아 프로세스다.
Q2. 웹 서버처럼 요청이 잦은 서비스를 항상 메모리에 띄워 두고 요청을 기다리게 하는 실행 방식은?
- standalone 방식
- inetd 방식
- cron 방식
- nohup 방식
정답 보기
1번 standalone 방식
standalone(단독형). 빠르지만 메모리를 계속 쓴다.
Q3. inetd 방식에 대한 설명으로 옳은 것은?
- 슈퍼 데몬이 요청이 올 때 해당 서비스를 실행해 메모리를 아낀다
- 모든 서비스가 항상 메모리에 떠 있다
- standalone보다 응답이 항상 빠르다
- 웹 서버에 가장 적합하다
정답 보기
1번 슈퍼 데몬이 요청이 올 때 해당 서비스를 실행해 메모리를 아낀다
요청 시 실행 → 메모리 효율, 대신 느림.
Q4. 모든 프로세스의 조상으로 PID가 1인 프로세스는?
- kernel
- sshd
- bash
- systemd(init)
정답 보기
4번 systemd(init)
PID 1 = systemd (예전엔 init).
Q5. 현재 프로세스를 복제해 새 자식 프로세스를 만드는 것은?
- wait
- fork
- exec
- nohup
정답 보기
2번 fork
fork. exec는 다른 프로그램으로 교체.
Q6. 터미널과 관계없이 백그라운드에서 계속 실행되며 서비스를 제공하는 프로세스는?
- 좀비
- 고아
- 데몬
- 작업(job)
정답 보기
3번 데몬
데몬이다. 터미널 없이 뒤에서 계속 돌며 서비스(웹·메일 등)를 제공한다. 이름 끝에 d가 붙는 경우가 많다(httpd, sshd).
헷갈리기 쉬운 O·X
exec로 명령을 실행하면 새 PID를 가진 자식 프로세스가 생긴다.
정답 보기
X exec는 현재 프로세스를 교체한다(PID 그대로). 새 프로세스는 fork.
부모 프로세스가 먼저 종료된 자식은 PID 1이 새 부모가 된다.
정답 보기
O 고아 프로세스.
좀비 프로세스는 kill -9로 바로 없앨 수 있다.
정답 보기
X 이미 죽은 상태라 신호가 소용없다. 부모가 거두거나 부모를 종료해야 한다.