1. 프로그램, 프로세스, 쓰레드
프로그램 | 프로세스 | 쓰레드 |
- 파일이 저장장치에 있지만 메모리에는 올라가 있지 않은 정적인 상태 - 출력하기전 파일 형태로 있는 시험지 |
- 메모리에 적재되고 운영체제로 부터 CPU 자원을 할당받아 프로그램이 실행되고 있는 작업의 단위 - 출력된 시험지가 수험생에게 배포된 상태 |
- 프로세스가 할당 받은 자원을 이용하는 실행 흐름의 단위 - 시험지 과목의 흐름이 담겨있는 문제들 |
프로세스와 스레드의 내부 동작방식은 어떻게 될까 ?
2. 프로세스 & 쓰레드 메모리

- 프로세스의 메모리 구조
- 코드 (Code / Text) 영역 : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU 가 해석 가능한 기계어 형태로 저장
- 데이터 영역 (Data) : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다
- 스택 영역 (Stack) : 지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간이다. Stack 은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 Stack 영역을 초과하면 stack overflow 에러가 발생한다
- 힙 영역 (Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자의 의해 메모리 공간이 동적으로 할당되고 해제된다
- Stack 과 Heap 영역이 위아래로 화살표가 쳐져있는 이유는 코드 영역과 데이터 영역은 선언할 때 그 크기가 결정되는 정적 영역이지만, 스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기가 변하는 동적 영역이기 때문이다

- 쓰레드의 메모리 구조
- 쓰레드는 프로세스가 할당 받은 자원을 이용하는 실행 흐름의 단위로써, 쓰레드가 여러개 있으면 파일을 다운받으며 동시에 웹서핑을 할 수 있게 해준다
- 쓰레드끼리 프로세스의 자원을 공유 하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것이다
- 위 사진은 하나의 프로세스 내에 여러개의 쓰레드가 들어있는 상태이다
- 프로세스의 4가지 메모리 영역 (Code, Data, Heap, Stack) 중 Stack 만 할당 받아 복사하고 나머지 3개의 영역은 프로세스 내의 다른 쓰레드들과 공유된다.
3. 프로세스 & 쓰레드의 생명주기
프로세스 상태 전이

- Admitted (new -> ready) : 프로세스 생성을 승인 받음
- Dispatch (ready -> running) : 준비 상태에 있는 여러 프로세스들 중 하나가 스케줄러에 의해 실행됨
- Interrupt (running -> ready) : Timeout, 예기치 않은 이벤트가 발생하여 현재 실행 중인 프로세스를 준비 상태로 전환하고, 해당 작업을 먼저 처리
- I/O or event wait (running -> waiting) : 실행중인 프로세스가 입출력이나 이벤트를 처리해야 하는 경우, 입출력이나 이벤트가 끝날 때까지 대기 상태로 전환
- I/O or event completion (waiting -> ready) : 입출력이나 이벤트가 모두 끝난 프로세스를 다시 준비상태로 만들어 스케줄러에 의해 선택될 수 있는 상태로 전환
PCB (Process Control Block)

- PCB (프로세스 제어 블록) 는 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있는 자료구조 (커널상의 문맥이라고 할 수 있다)
- PCB 는 프로세스 Context switching 할때 기존 프로세스의 상태를 어딘가에 저장해두고 다음작업을 이어서 할수있게 즉, 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 저장하는 임시 저장소
- 포인터 (Pointer) : 프로세스의 현재 위치를 저장하는 포인터 정보
- 프로세스 상태 (Process state) : 프로세스 상태전이의 상태를 저장
- 프로세스 아이디 (Process number, PID) : 프로세스 식별자를 지정하는 고유한 ID
- 프로그램 카운터 (Program counter) : 프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장
- 레지스터 (Register) : 누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보
- 메모리 제한 (Memory Limits) : 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보
- 열린 파일 목록 (List of open file) : 프로세스를 위해 열린 파일 목록
프로세스 Context switching

- CPU 는 process P1 을 실행 (Executing)
- 일정 시간이 지나 Interrupt 또는 systeml call 이 발생 (CPU 는 idle 상태)
- 현재 실행 중인 process P1 의 상태를 PCB1 에 저장한다 (Save state into PCB1)
- 다음으로 실행 할 process P2 를 선택한다 (CPU 스케줄링)
- process P2 의 상태를 PCB2 에서 불러온다 (Reload state from PCB2)
- CPU 는 process P2 를 실행한다 (Executing)
- 일정 시간이 지나 Interrupt 또는 systeml call 이 발생 (CPU 는 idle 상태)
- 현재 실행 중인 process P2 의 상태를 PCB2 에 저장 (Save state into PCB2)
- 다시 process P1 을 실행할 차례가 된다 (CPU 스케줄링)
- process P1 의 상태를 PCB1 에서 불러온다 (Reload state from PCB1)
- CPU 는 process P1 을 중간 시점부터 실행한다 (Executing)
이러한 Context Switching 과정은 사용자로 하여금 빠른 반응성과 동시성을 제공하지만, 실행되는 프로세스의 변경과정에서 프로세스의 상태, 레지스터 값 등이 저장되고 불러오는 등의 작업이 수행되기 때문에 Context Switching Overhead 가 발생하여 시스템에 많은 부담을 주게 된다.
프로세스 Context Switching 은 PCB 를 저장하고 복원하는데 많은 비용이 발생하여 이를 개선하기 위해 프로세스 뿐만 아니라 쓰레드 에서도 Context Switching 이 일어난다.
쓰레드 Context Switching

- 쓰레드 Context Switching 은 멀티 쓰레딩 환경에서 쓰레드 간의 실행을 전환하는 기술이다
- 프로세스 Context Switching 과 다른점은 쓰레드 컨텍스트 스위칭은 하나의 프로세스 내의 쓰레드들을 교환한다는 점이다

- PCB 처럼 TCB (Thread Control Block) 는 각 쓰레드마다 운영체제에서 유지하는 쓰레드에 대한 정보를 담고 있는 자료구조이다
- 즉 TCB 는 PCB 안에 들어가 있으며, 쓰레드의 상태정보, 쓰레드 ID, 쓰레드 우선순위, 스케줄링 정보 등 다양한 정보를 저장한다
- 쓰레드간의 자원 공유와 동기화도 TCB 를 사용하여 관리되는데, TCB 에서 해당 쓰레드의 뮤텍스나 세마포어 정보를 관리하고, 쓰레드가 해당 자원에 대한 접근 권한을 획득하거나 반납할 때 TCB 의 정보를 업데이트 하게 된다
- 뮤텍스 (Mutex) : 임계 구역에 1개의 쓰레드만 들어갈 수 있는 동기화 기법
- 세마포어 (Semaphore) : 임계 구역에 여러 쓰레드가 들어갈 수 있고, counter 를 두어서 허용 가능한 쓰레드를 제한하는 기법
- 결론적으로 쓰레드 Context Switching 이 프로세스 Context Switching 보다 더 빠르다 (TCB 가 더 가볍기 때문)
- CPU 와 RAM 사이에 위치한 CPU Cache Memory 는 프로세스 컨텍스트 스위칭이 일어날 경우 초기화되고, 쓰레드 컨텍스트 스위칭의 경우 다른 CPU 코어에서 실행되지 않는 이상 캐시 메모리를 초기화 하지 않는다
사용자 수준 Thread | - Thread 를 관리하는 라이브러리로 인해 사용자 단에서 생성 및 관리되는 Thread 장점 : Context Switching 이 없어서 커널 쓰레드 보다 오버헤드가 적음 단점 : 프로세스 내의 한 Thread 가 커널로 진입하는 순간, 나머지 Thread 들도 전부 정지됨 |
커널 수준 Thread | - 커널 레벨에서 생성되는 쓰레드로 운영체제 시스템 내에서 생성되어 동작하는 Thread 장점 : 커널 Thread 를 쓰면 멀티 프로세서를 활용할 수 있어 사용자 수준 쓰레드보다 효율적임 단점 : Context Switching 이 발생함 이 과정에서 프로세서 모드가 사용자 모드와 커널 모드 사이를 움직이기 때문에 많이 돌아다닐수록 성능이 떨어짐 |
👩💻 완전히 정복하는 프로세스 vs 스레드 개념
한눈에 이해하는 프로세스 & 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아
inpa.tistory.com
참고 : https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-process-multi-thread
👩💻 멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리
멀티 프로세스와 멀티 스레드는 한 어플리케이션에 대한 처리방식 이라고 보면 된다. 단순히 프로그램을 여러개 띄워놓는 것이 멀티 프로세스가 아니라 이 둘은 언제 어느때에 어떤 방식으로
inpa.tistory.com
참고 : https://www.youtube.com/watch?v=1grtWKqTn50
참고 :
'운영체제' 카테고리의 다른 글
운영체제 - 프로세스 동기화 (2) | 2025.04.03 |
---|---|
운영체제 - CPU 스케줄링 (0) | 2025.03.27 |
운영체제 - 입출력 I/O 제어 (폴링, 인터럽트, DMA) (0) | 2025.03.13 |
운영체제 - 컴퓨터 시스템 자원관리 (0) | 2025.03.13 |
운영체제 (Operation System) (1) | 2025.03.13 |