스레드프로세스

[ CS > 운영체제 ]

[운영체제] 프로세스와 스레드

 Carrot Yoon
 2025-07-15
 15

프로세스와 스레드

프로세스와 스레드를 설명하기 전에 프로그램(Program)에 대해서 알아야 한다. 프로그램은 "어떤 작업을 위해 실행될 수 있는 파일"로써 보조기억장치에 존재하여 실행되기를 기다리는 명령어와 정적 데이터 묶음이다.

1. 프로세스(Process)

프로세스란 프로그램이 실행되고있어 메모리(주기억 장치, 휘발성 메모리, RAM)에 올라온 인스턴스이다. 보조 기억장치(하드디스크, ROM)에 저장된 코드뭉치와 정적 데이터가 실행을 위해 메모리(RAM)에 할당된 것을 프로세스라고 보면 된다. 또는 프로세스는 운영체제로부터 시스템 자원을 할당받는 작업의 단위이며 실행된 프로그램을 의미한다.

image.webp

프로세스는 Code, Data, Stack, Heap 영역 4부분으로 나눌 수 있다.

  • 코드(Code): 함수 코드들이 존재

  • 데이터(Data): 전역 변수와 Static 변수 저장 공간

  • 스택(Stack): 코드 실행시 생성되는 지역 변수, 매개 변수, 리턴 주소등이 존재하는 영역(코드 실행을 위한 영역)

  • 힙(Heap): 런타임 중에 동적할당되는 메모리 영역

2. 스레드(Thread)

"프로세스 내에서 실행되는 흐름의 단위"로써 프로세스가 할당받은 자원을 이용하는 실행 단위이다. 각 프로세스는 최소 1개 이상의 스레드를 할당받고, 코드, 데이터, 힙 영역은 프로세스 내에서 공유하고, 스택은 스레드별로 가지게 된다.

image.webp

3. PCB와 TCB

프로세스와 스레드는 PCB(Process Control Block)와 TCB(Thread control Block)의 정보를 통해 제어 된다. PCB는 메모리의 커널 영역에 있고, TCB는 PCB에 포함되어 있다. 메모리는 커널 영역에 PCB를 테이블 형태로 관리를 하며, 이 PCB에는 다음 실행할 코드를 나타내는 PC(Program Counter), Process State(프로세스 상태), Pointer 정보 등이 담겨 있고, TCB는 부모 PCB 포인터, Stack 포인터, 스레드 상태, PC 등의 정보를 가지고 있다.

포인터

프로세스 상태

프로세스 구분자(Process State)

프로그램 카운터(PC)

프로세스 우선순위

레지스터 문맥

할당된 자원 정보

메모리 정보

PID, PPID, CPID

...

프로세스 PCB

포인터

쓰레드 상태

프로그램 카운터(PC)

레지스터 문맥

부모 PCB 주소

쓰레드 ID

...

쓰레드 TCB

위 표에서 CPU가 마지막 까지 실행 상태를 저장하는데 사용되는 중요한 부분은 Status(상태), PC, SP(포인터)이다. SP는 가장 최근까지 실행한 코드 부분의 마지막 주소 부분이라고 보면 되고, PC는 다음에 실행할 코드가 무엇인지를 나타내고, Status는 Blocked된 상태인지, 실행 중인 상태인지 등을 파악할 수 있는 값이다. 그래서 CPU는 실행도중 인터럽트가 발생하여 다른 프로세스를 처리해야할 경우 최근까지 실행한 정보를 PCB와 TCB에 담아두고 다시 해당 프로세스를 처리할 경우 사용하게 된다.

3.1 PCB, TCB 그리고 컨텍스트 스위칭

PCB와 TCB는 운영체제에서 CPU에 프로세스를 할당하는데 사용된다. 그리고 CPU에서도 CPU와 PCB의 정보를 통해 기존 처리 중이던 작업 정보를 가져와 작업을 이어 나가고 인터럽트가 생기면 다시 PCB나 TCB에 저장을 한다.

image.webp

컨텍스트 스위칭은 크게 다음과 같은 인터럽트로 일어난다.

예시

설명

자발적 인터럽트

시스템 콜 (System Call)

사용자 프로세스가 OS의 기능을 요청할 때, 예: read(), write()

입출력 요청

CPU가 아니라 디스크나 네트워크 I/O를 기다리는 동안 CPU를 다른 프로세스에 양보

sleep(), wait() 등 대기 호출

명시적으로 블로킹 호출을 하는 경우

yield() 호출

명시적으로 CPU를 다른 스레드에게 양보함 (잘 안 씀)

비자발적 인터럽트

타이머 인터럽트 (Time Slice Expiry)

타임 슬라이싱 시간 끝나서 강제로 문맥 전환

페이지 폴트 (Page Fault)

접근하려는 메모리가 현재 RAM에 없어서 OS가 개입

예외 (예: 0으로 나누기, 불법 명령어)

CPU 실행 중 오류 발생, OS가 개입

외부 인터럽트 (하드웨어 인터럽트)

디스크, 네트워크, 키보드 등의 장치가 CPU에 알림

고우선순위 프로세스 등장 (Preemption)

더 중요한 프로세스가 생겨서 현재 프로세스 중단

그리고 PCB와 TCB는 큐에 담겨져서 OS가 큐에서 PCB의 정보를 꺼내고 CPU에서는 그 PCB의 정보를 토대로 처리하게 되는데, 이 큐가 2가지가 있다. 바로 Ready Queue와 Blocked Queue다. 여기서 Blocked Queue는 실행 도중에 자발적 문맥 교환일 경우에만 담겨지게 되고, 나머지의 경우에는 Ready Queue에 담겨지거나 종료상태가 될 수 있다.

항목

Ready Queue (준비 리스트)

Blocked Queue (대기 리스트)

상태

실행 준비 완료

이벤트(I/O 등) 대기 중

CPU 할당 가능성

곧 할당 가능

CPU 못 씀

트리거

CPU 시간 할당 시 실행

I/O 요청 등으로 대기

현재 상태

Ready

Blocked

다음 상태

Running

Ready (이벤트 완료 시)

4. 멀티 태스킹, 멀티 프로세스, 멀티 스레딩

우리는 멀티 프로세스, 멀티 스레팅, 멀티 태스킹같은 단어를 많이 듣는다. 그리고 각각 무슨 의미인지 정리해보고자 한다.

설명

특징

멀티 태스킹

하나의 CPU 코어에서 여러 작업을 빠르게 번갈아 실행하여 동시에 실행되는 것처럼 보이게 하는 기법

  • 사용자는 동시에 여러 작업을 하는 것처럼 느낌

  • 타임 슬라이싱 기법으로 오랜 시간이 걸리는 작업도 블록킹 하지 않음

  • 프로세스가 많으면 오버헤드가 증가

멀티 프로세스

여러 독립된 프로세스가 동시에 실행되는 것

  • 프로세스간 데이터 공유가 어려움

  • 컨텍스트 스위칭 비용이 더 큼

  • 하나의 프로세스가 죽어도 영향이 전파되지 않음

멀티 스레딩

하나의 프로세스 안에서 여러 개의 스레드가 동시에 작업하는 것으로 스레드들은 독립된 스택을 가지며 다른 자원은 공유함

  • 멀티 프로세스보다 컨텍스트 스위칭 비용이 적음

  • 하나의 스레드 문제시 영향이 전파됨

마무리

한번에 너무 많은 개념을 가져온 것 같기도 하다...

CPU의 작업을 위해 메모리에 존재하는 프로세스의 PCB, 스레드의 TCB의 정보를 활용하고 다시 저장한다. 그리고 이 PCB와 TCB가 작업을 중단 했다가 다시 이어서 할 수 있도록 만들어 주는 정보이고, 이러한 매커니즘으로 OS는 시분할 방식으로 CPU에 프로세스를 번갈아가면서 할당해준다. 그렇기에 멀티 태스킹, 멀티 프로세스, 멀티 스레딩이 가능하게된 것이다.