프로세스는, 현재
실행 중인 프로그램
이라고 생각하면 된다. 스레드는, 프로세스 내에서 실제로 작업을 수행하는 실행 흐름(작업 단위) 프로세스: “회사(건물)” 스레드: “회사 안에서 일하는 직원(일꾼)” 회사는 여러 명의 직원(스레드)이 동시에 일할 수 있고, 회사(프로세스)마다 자원(방, 컴퓨터, 서류 등)은 독립적으로 관리
포그라운드 프로세스
와 백그라운드 프로세스
로 나눠지게 된다.익스플로어
나, 게임
등등은 모두 포그라운드 프로세스 이다.백그라운드 프로세스
라고 지칭한다.
백그라운드 프로세스
중, 사용자와 상호작용 없이 주어진 작업만 수행하는 프로세스를데몬
혹은서비스
(윈도우 환경) 이라고 한다.
코드 영역
, 힙 영역
, 데이터 영역
, 코드 영역
4가지 영역으로 관리되고, 커널 영역에는 프로세스 제어 블록(PCB)
라는 정보가 저장되게 된다.코드 영역
- 코드 영역은 실행 가능한 명령어가 저장되는 공간으로
텍스트 영역
이라고도 부른다.- CPU 가 읽고 실행할 명령어가 담겨 있기 때문에, 읽기 전용 공간
데이터 영역
- 데이터 영역은 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간.
- 주로,
정적 변수
나전역 변수
등이 저장되는 공간.
정적 할당 영역
이라고 부른다.힙 영역
- 힙 영역은, 프로그램 사용자(개발자)가 직접 할당 가능한 저장 공간.
- 사용하지 않을 때는, 할당 취소(반납)을 진행해야 하는데, 계속 점유해서 메모리 공간을 낭비하는 경우, 문제를
메모리 누수
문제라고 한다.- EX) C에서,
malloc()
으로 할당 후,free()
를 통해 반납 진행- JAVA 등 에서는, 가비지 컬렉션(GC) 가 자동으로 메모리를 해제하는 기능을 제공
스택 영역
- 스택 영역은 일시적으로 사용할 값들이 저장되는 공간
- 함수의 실행이 끝나면 사라지는
매개변수
,지역변수
,함수 복귀 주소
등이, 스택 영역에 저장되는 데이터들 이다.
동적 할당 영역
이라고 부른다.커널 영역의 PCB
- 프로그램이 실행되려면 결국 메모리에 있는 코드 영역등을 CPU 가 읽고 실행해야된다.
- 이때, 다양한 작업들이 대기 중 인데,
PCB
는 이 작업들의 정보를 나타낸다.PCB
내부에는 프로세스를 식별하기 위한프로세스 ID(PID)
, 프로세스가 실행 과정 중 사용한레지스터 값
, 프로세스가 어떤 상태인지 나타내는프로세스 상태
, 어떤 순서로 CPU를 할당 받을지 나타내는CPU 스케줄링(우선순위) 정보
등이 저장된다.- 이러한 데이터는 PCB에서는
프로세스 테이블
의 형태로 관리되는 경우가 많다.- 새롭게 실행되는 프로세스는 PCB를
프로세스 테이블
에 추가하고, 종료되는 프로세스는프로세스 테이블
에서 삭제된다.- 즉,
프로세스 테이블
은 현재 실행 중인 PCB의 모음을 의미합니다.
좀비 프로세스
라고 한다.A -> B -> A -> B .... -> A -> B
와 같이 엄청 빠른속도로 작업을 바꿔가며 진행하게 된다.정확 하게 프로세스가 실행의 단위가 아니고 추후에 나올
스레드
가 실행의 단위가 된다. 아직 설명하지 않았기 때문에 간단히,작업
이 번갈아 가며 동작한다, 라고 기억하자.
얼만큼 실행할지
, 어디서 부터 실행할지
를 알아야 한다.얼만큼 실행할지
는, 사실 한 작업이 얼만큼 CPU를 사용할 수 있는 지? 에 대한 내용이고, 이는 타이머 인터럽트
에 의해 제한됩니다.타이머 인터럽트
가 발생하면 자신의 차례를 반납하고 CPU를 놓아줍니다.백업
하고 불러와야 한다.문맥(context)
라고 한다.프로그램 카운터
, 레지스터 값
, 메모리 정보
, 실행을 위해 열었던 파일
, 사용한 입출력 장치
등 여러가지 내용을 포함한다.PCB
에 저장되어 있다.시분할 시스템
이라고 부른다.생성
, 준비
, 실행
, 대기
, 종료
등이 있다.생성(new)
: 프로세스를 생성 중인 상태. 메모리에 적재되어 PCB를 할당 받은 상태준비(ready)
: CPU 할당을 받아 실행될 수 있지만, 대기하고 있는 상태.실행(running)
: CPU 할당을 받아 실행되는 상태대기(blocked)
: 프로세스가 실행 도중, 바로 실행이 불가능한 상태일 경우. 외부 입출력 장치를 사용하여 입출력 장치의 작업이 끝날때 까지 기다려야 되는 경우 등종료(terminated)
: 프로세스가 종료된 상태디스패치(Dispatch)
: 준비 상태에서, CPU 할당을 받아 실행 상태로 변경되는 것시간 종료(Timeout)
: 실행중인 프로세스가 할당된 시간을 모두 사용하여 타이머 인터럽트
되어 준비 상태로 변경되는 것블록(Block)
: 실행중인 프로세스가 입출력 완료 대기 등을 위해 대기 상태로 들어가는 것Wakeup
: 대기 중인 프로세스가 입출력 등이 완료되어 준비 상태로 들어가 CPU 할당 대기를 받으러 가는 것실행
상태의 프로세스는, 입출력 작업 등을 처리해야 되는 경우 (외부 작업), 대기
상태로 들어가, 입출력 작업이 완료되기를 기다린다.준비
상태로 돌입하게 되는데, 이를 블로킹 입출력(Blocking I/O)
라고 한다.저장 결과를 확인해야 하는 반례의 케이스가 있을 수 있지만, 결과 확인에 따라 분기가 되지 않는 단순한 작업이었다고 생각하자.
Chrome
을 여러개 띄워가며 웹서핑을 즐기려면 어떻게 해야 할까?멀티 프로세스
, 멀티 스레드
프로세스
로 분리해서 동시에 실행하는 구조Chrome
등 브라우저의 탭이 가장 대표적인 예시이다.멀티 프로세스
라고 한다.PCB
가 각각의 프로세스마다 다르게 가지고 있고, 그에 따라 PID(프로세스 ID)
또한 다 다르다.실행 흐름(작업)
만 독립적으로 관리한다.스레드ID
, 프로그램 카운터
, 레지스터 값
등은 별도로 구분되어 공유되지 않는다.스택 영역
에 저장된다.전역 변수
, 정적 변수
등, 공유할 수 있는 프로세스 자원
은 공유하여 사용된다.구분 | 멀티프로세스 | 멀티스레드 |
---|---|---|
실행 단위 | 여러 개의 프로세스 | 하나의 프로세스 내 여러 스레드 |
PID/PCB | 각각 고유(PID, PCB 따로) | 동일한 PID, 각 스레드는 TCB(스레드제어블록) |
메모리 공간 | 완전히 분리된 메모리 공간(코드/데이터/힙/스택) | 코드/데이터/힙 공유, 스택만 분리 |
자원 공유 | 공유 불가(IPC 필요) | 전역/정적 변수, 힙 등 공유 가능 |
안정성 | 한 프로세스 종료 시 다른 프로세스 영향 X | 한 스레드 문제 시 전체 프로세스 영향 가능 |
데이터 교환 | 느림(IPC: 소켓, 파이프 등 별도 통신 필요) | 빠름(메모리 직접 접근) |
장점 | 안정성, 격리성 높음 | 자원 효율적, 협업/데이터 공유 쉬움 |
단점 | 메모리 많이 사용, 통신 복잡/느림 | 동기화/경쟁 조건, 오류 전파 가능성 |
예시 | 크롬 탭, 서버 프로세스 | 워드 자동저장+입력, 서버에서 요청 다중처리 |
멀티프로세스
로 구성하고, 자원 활용/데이터 공유
를 통해 빠른 데이터 교환이 중요한 서비스라면 멀티스레드
로 구성하는 등 다양한 경우가 될 수 있을 것 이다.둘의 가장 큰 핵심 차이는, 자원의 공유 여부!!
join
이라는 명령어가 표준적으로 사용된다.join
은, 해당 스레드가 종료될 때 까지 대기해야 함을 의미한다.Main
쓰레드에서 Sub
쓰레드의 실행이 완료 된 후, Main 쓰레드가 완료되어야 한다면, 다음과 같이 작성하여 동기 시킨다. (자바 예시)join
을 제공하고 있으니, 자신이 사용하는 언어의 공식 문서를 확인하여 확인해보자.public class JoinExample {
public static void main(String[] args) throws InterruptedException {
Thread subThread = new Thread(() -> {
System.out.println("Sub thread 시작");
try {
Thread.sleep(2000); // 2초간 대기 (작업하는 척)
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Sub thread 종료");
});
subThread.start(); // Sub 스레드 실행
System.out.println("Main thread: subThread가 끝날 때까지 대기");
subThread.join(); // Main은 subThread가 끝날 때까지 대기
System.out.println("Main thread 종료(모든 작업 완료)");
}
}
Main thread: subThread가 끝날 때까지 대기
Sub thread 시작
Sub thread 종료
Main thread 종료(모든 작업 완료)
프로세스 간 통신(IPC)
라고 한다.공유 메모리
, 메시지 전달
)공유 메모리
는 말 그대로, 데이터를 주고 받는 프로세스가 공통적으로 사용할 메모리 영역을 두는 방식이다.메시지 전달
방식은, 프로세스 간에 주고 받을 데이터가 커널을 거쳐 송수신 되는 통신 방식 입니다.send()
시스템콜과, 받는 recv()
시스템 콜을 통해서 송수신 하게 된다.파이트
시그널
, 소켓
, 원격 프로시저 호출(RPC)
등이 사용된다.파이프
시그널
이벤트
가 발생했음을 알리는 비동기적인 신호이다.시그널 핸들러
를 실행한 뒤 하던 일을 진행 한다.시그널
방법이다.시그널은, IPC를 위해 존재하는 개념이 아니고, 시그널을 사용하여 IPC 를 수행할 수 있다.
메시지 큐(message queue)
소켓(socket)
원격 프로시저 호출(RPC)