실행 중인 프로그램이고, 자기만의 주소 공간을 갖습니다. 커널은 각 프로세스의 상태를 PCB 에 담아 관리합니다.
프로세스 (Process)
프로세스란?
실행 중인 프로그램의 인스턴스. OS가 관리하는 작업 단위.
메모리 구조
높은 주소에서 낮은 주소 순으로 이렇게 놓입니다.
| 영역 | 담는 것 | 자라는 방향 |
|---|---|---|
| 스택 (Stack) | 지역변수, 매개변수 | 아래로 |
| 빈 공간 | 두 영역이 만나면 넘침이다 | |
| 힙 (Heap) | 동적 할당 (malloc, new) | 위로 |
| 데이터 (Data) | 전역변수, static | 고정 |
| 코드 (Code) | 실행 명령어 | 고정 |
프로세스 상태
[생성] → [준비] ⇄ [실행] → [종료]
↕
[대기/블록]
| 상태 | 설명 |
|---|---|
| 준비 (Ready) | CPU 대기 중 |
| 실행 (Running) | CPU에서 실행 중 |
| 대기 (Blocked) | I/O 완료 대기 |
왜 상태가 여러 개인가
돌고 있는 것과 멈춘 것으로 나누면 부족합니다. 왜 멈췄는지가 처방을 바꿉니다.
| 상태 | 무엇을 기다리나 | 그때 CPU 는 |
|---|---|---|
| 실행 준비 | 차례를 기다린다 | 부족하다 |
| 대기 | 디스크나 네트워크를 기다린다 | 한가하다 |
| 중지 | 외부 신호를 기다린다 | 무관하다 |
둘째가 많은데 CPU 사용률이 낮은 것이 흔한 오해의 원인입니다. 서버가 한가해 보여도 느린 것은 대개 기다림 때문입니다. 그때 CPU 를 늘리면 아무것도 나아지지 않습니다.
죽은 뒤에 남는 것
프로세스가 끝나도 그 결과를 부모가 받아 가기 전까지는 기록이 남습니다.
부모가 받아 가지 않으면 기록만 남은 것이 쌓인다
부모가 먼저 죽으면 남은 자식은 다른 부모에게 넘겨진다
첫째는 프로세스를 계속 만드는 서비스에서 자원이 새는 모양으로 나타납니다. 만들었으면 끝을 확인해 거둬야 합니다.
실무 포인트
fork(): 부모 프로세스 복사하여 자식 프로세스 생성exec(): 현재 프로세스를 새 프로그램으로 교체- 좀비 프로세스: 종료됐지만 부모가 회수 안 한 상태
- 고아 프로세스: 부모가 먼저 종료된 자식 (init이 입양)