Process와 Thread

허세진·2026년 1월 30일

backend

목록 보기
14/20

Process

Process는 실행중인 프로그램이다.

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영체제는 프로세스 제어 블록을 이용한다.

프로세스 제어 블록 (PCB)

프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료구조다.

운영체제는 많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단한다.

PCB에 담기는 정보는 아래와 같다.

  • 프로세스 ID (PID)
    특정 프로세스를 식별하기 윟해 부여하는 고유한 번호다.

  • 레지스터 값
    프로세스는 자신의 실행 차례가 돌아오면 이전에 사용했던 레지스터의 중간값들을 모두 복원해서 이전까지 진행했던 작업들을 그대로 이어 실행한다.

  • 프로세스 상태
    입출력장치를 사용하기 위해 기다리고 있는 상태인지. CPU를 사용하기 위해 기다리고 있는 상태인지 등 프로세스 상태 정보가 저장된다.

  • CPU 스케줄링 정보
    프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 저장된다.

  • 메모리 관리 정보
    베이스 레지스터, 한계 레지스터 값과 같은 정보들도 저장된다. 그리고 프로세스의 주소를 알기 위해서 페이지 테이블 정보도 저장한다.

  • 사용한 파일과 입출력장치 목록
    프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다. (어떤 입출력장치가 이 프로세스에 할당됐는지, 어떤 파일들을 열었는지)

문맥 교환

(프로세스 A에서 프로세스 B로 실행 순서가 넘어갔다고 가정)

위 상황에서 프로세스 A는 프로그램 카운터를 비롯한 레지스터 값, 메모리 정보, 등 지금까지의 중간 정보를 백업해야한다. (다음에 차례가 오면 다시 사용해야 하니까)

이런 중간 정보를 문맥이라고 한다.

그래서 자기 차례가 끝난 프로세스는 PCB에 문맥을 백업하고 다시 차례가 오면 복구한다.

이렇게 프로세스 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구해서 새로운 프로세스를 실행하는 것을 문맥 교환이라과 한다.

프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB가 생성된다. 사용자 영역에는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나눠서 저장된다.

각 영역에 대해서 알아보자

코드 영역

코드 영역은 말 그대로 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장된다.

코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지 되어 있다. (읽기 전용 공간)

데이터 영역

데이터 영역은 프로그램이 실행되는 동안 유지할 데이터(전역 변수)가 저장되는 공간이다.

코드 영역과 데이터 영역은 크기가 고정된 영역이라서 정적 할당 영역이라고도 부른다.
힙 영역과 스택 영역은 프로세스 실행 과정에서 크기가 변할 수 있는 영역이기 때문에 동적 할당 영역이라고 부른다.

힙 영역

힙 영역은 프로그래머가 직접 할당할 수 있는 저장 공간이다.

스택 영역

스택 영역은 데이터를 일시적으로 저장하는 공간이다.

힙 영역과 스택 영역에 데이터가 쌓여도 새로 할당되는 주소가 겹치지 않게,

일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고 스택 영역은 높은 주소에서 낮은 주소로 할당된다.

프로세스 상태

여러 프로세스들이 빠르게 번갈아 가면서 실행 되는 과정에서 프로세스는 여러 상태를 거치며 실행된다. 그리고 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.

프로세스 상태를 알아보자

생성 상태

생성 상태는 말 그대로 프로세스를 생성 중인 상태다.

(메모리에 적재되어 PCB를 할당 받은 상태)

생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 되어 CPU할당을 기다린다.

준비 상태

준비 상태는 지금 바로 CPU를 할당받아 실행할 수 있지만, 자기 차례가 아니어서 기다리고 있는 상태다.

준비 상태 프로세스는 차례가 되면 CPU를 할당받아 실행 상태가 되는데, 이 전환되는 것을 디스패치라고 한다.

실행 상태

실행 상태는 CPU를 할당받아 실행 중인 상태다.

프로세스가 할당된 시간을 모두 사용하면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용해서 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.

대기 상태

대기 상태는 입출력장치의 작업을 기다리는 상태다.

입출력 작업이 완료되면 프로세스는 다시 준비 상태로 CPU 할당을 기다린다.

종료 상태

종료 상태는 프로세스가 종료된 상태다.

프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.

이 때 새 프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 한다.

운영체제는 이렇게 프로세스가 프로세스를 낳는 계층적인 구조로 프로세스들을 관리한다. (이 과정을 도표로 그리면 트리 구조를 띄는데, 이를 프로세스 계층 구조라고 한다.)

프로세스 생성 기법

부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성하고, 만들어진 복사본은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

Thread

Thread는 프로세스를 구성하는 실행의 흐름 단위다.

하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 그리고 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.

프로세스와 스레드

전통적인 관점에서 보면 하나의 프로세스는 한 번에 하나의 일만을 처리했다.
실행의 흐름 단위가 하나 라는 점에서 이렇게 실행되는 프로세스들은 단일 스레드 프로세스라고 할 수 있다.

하지만, 스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.

스레드 구성 요소
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. -> 이 때문에 스레드마다 각기 다른 코드를 실행할 수 있다.

프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.

멀티프로세스와 멀티스레드

여러 프로세스를 동시에 실행하는 것을 멀티프로세스, 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고 한다.

단일 스레드 프로세스 여러 개를 실행하는 것과 하나의 프로세스를 여러 스레드로 실행하는 것은 무엇이 다른가?

-> 매우 큰 차이가 있다.

프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.

프로세스를 fork해서 같은 작업을 하는 동일한 프로세스 두 개를 동시에 실행하면 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제되어 메모리에 적재된다.
이렇게 되면 메모리 낭비가 발생하게 된다. (메모리에 동일한 내용이 중복해서 존재하기 때문)

스레드들은 프로세스가 가지고 있는 자원을 공유한다. 같은 프로세스 내의 모든 스레드는 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고 열린 파일과 같은 프로세스 자원을 공유한다. (여러 프로세스를 병행 실행하는 것보다 효율적)

하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있어서 프로세스의 자원을 공유한다는 특성이 단점이 될 수도 있다.

Thread와 process는 어떤 차이가 있는지

그래서 Thread와 process는 어떤 차이가 있는지 정리해보면,

  • 자원 소유 여부
    프로세스는 실행에 필요한 자원을 독립적으로 소유하고, 스레드는 프로세스의 자원을 공유하며 사용한다.

  • 주소 공간과 메모리 구조
    프로세스는 서로 독립된 주소 공간을 가지지만, 스레드는 같은 주소 공간을 공유하고 스택만 개별적으로 가진다.

  • 안정성과 비용
    프로세스는 하나가 종료돼도 다른 프로세스에 영향을 주지 않아 안정성이 높지만 비용이 크고, 스레드는 생성·전환 비용이 적은 대신 하나의 오류가 전체 프로세스에 영향을 줄 수 있다.

이러한 차이가 있다.

profile
로그를 파고드는 시간을 즐기는 백엔드 개발자, 허세진입니다.

0개의 댓글