프로세스
프로세스(process)란 운영체제로부터 CPU, 메모리, 파일 등의 자원을 할당받고, 메모리에 적재되어 실행 준비가 되었거나 실행 중인 프로그램이다.
PCB (Process Control Block)은 하나의 프로세스가 시스템에 존재할 때 프로세스에 대한 모든 것(아래 나오는 구성요소들)을 표현하며, 메모리에 저장된다.
프로세스 확인 명령어 ps
-e(-A) 모든 프로세스 출력
-f 유닉스 스타일로 출력
-a 세션 리더 제외하고 터미널에 종속되지 않은 모든 프로세스 출력
-C [process] 입력한 프로세스만 출력
-o [value] 출력 포맷 지정
a 터미널과 연관된 프로세스 출력
e 환경변수 정보 출력
f 프로세스 간 상속관계를 트리형식응로 출력
l 정보를 길게 출력
u 소유자를 기준으로 출력
x 터미널에 종속되지 않는 프로세스 출력
p 지정한 프로세스 출력
상태
프로세스는 단순히 코드의 집합인 프로그램과 달리 상태를 가진다.
- 생성 (New / Created) : PCB가 만들어졌지만 아직 실행 대기열에 올라가지 않음
- 준비 (Ready) : 실행할 준비는 되었으나 CPU를 받지 못해 대기 중
- 실행 (Running) : CPU를 점유하여 실제 실행 중
- 대기 (Waiting / Blocked) : I/O, 이벤트, 타이머 등 특정 작업 완료를 기다리는 중
- 종료 (Terminated / Exit) : 실행 완료 또는 오류로 종료됨 (Zombie 상태가 잠시 존재)
프로세스 상태 전이
[ 생성 ]
│
▼
[ 준비 ] ──(스케줄러 할당)──▶ [ 실행 ]
▲ │
│ │ (I/O 요청, sleep, wait)
│ ▼
└──────(타임슬라이스 만료)── [ 대기 ]
│
│ (I/O 완료, 이벤트 발생)
▼
[ 준비 ]
│
│ (exit, abort)
▼
[ 종료 ]
- 생성 -> 준비 : fork(), exec() 후 PCB 생성 / 메모리, 파일 디스크립터 준비 완료 후 Ready 큐 삽입
- 준비 -> 실행 : CPU 스케줄러가 Ready 큐에서 하나 선택 / Dispatch 되면서 Running 상태로 이동
- 실행 -> 준비 : 타임 슬라이스 만료, 선점 발생 / 우선순위 높은 프로세스 등장 시도 등..
- 실행 -> 대기 : I/O 요청 / sleep(), read(), mutex lock 등 블로킹 호출
- 대기 -> 준비 : I/O 완료 인터럽트 / semaphore, event, timer 만료
- 실행 -> 종료 : exit() 호출 / main 함수 종료, 치명적 시그널 수신했을 때
*fork() : 현재 프로세스를 그대로 복제해 자식 프로세스를 만드는 시스템콜
*exec() : 현재 프로세스를 완전히 다른 프로그램으로 덮어씀(PID 유지)
*파일 디스크립터 : 열린 파일, 소켓, 파이프를 가리키는 번호
*Dispatch디스패치 : 스케줄러가 준비 상태 프로세스를 CPU에 실제로 올리는 행위
*I/O : 입출력 작업 (느린)
*sleep() : 일정 시간 동안 스스로 대기 상태로 들어감
*mutex lock : 한 번에 하나의 스레드만 임계영역 접근 허용
*semaphore : 동시에 접근 가능한 개수를 제한하는 동기화 도구 (mutex lock과 달리 여러 개 가능)
구성

| 항목 | 의미 |
| UID | 소유자 이름 |
| PID | 고유 식별자 |
| PPID | 부모 프로세스의 고유 식별자 |
| C | 프로세서 사용률 (%) |
| STIME | 프로세스가 시작한 시간 |
| TTY | 터미널의 종류 |
| TIME | 총 CPU 사용시간 |
| CMD | 프로세스 실행 시 명령줄 |

| 항목 | 의미 |
| USER | 소유자 이름 |
| MEM | 메모리 점유율 |
| VSZ, RSS | 실제 메모리 사용량 |
| STAT | 현재 상태 |
| STARTED | 시작 시간 |
프로세스 종류
foreground
사용자와 직접 상호작용하며 화면에 나타나는 프로세스이다.
터미널이나 화면을 점유해 실행되는 동안 사용자가 다른 명령을 입력할 수 없다. (ex : vi, 웹브라우저, 게임..)
실행 중인 포그라운드 프로세스를 중단하려면 ctrl+c 입력
backgroud
사용자와의 상호작용 없이 뒤에서 실행되는 프로세스이다.
화면에 나타나지 않으며 프로세스가 실행되는 동안에도 다른 작업을 할 수 있다. (ex : 바이러스 백신 검사, 백업, 로깅..)
명령어 뒤에 & 기호를 붙여 실행한다. jobs 명령어로 목록 확인, fg 명령어로 포그라운드로 전환할 수 있다.