공부/CS 스터디

[CS 스터디] 1주차 프로세스와 스레드

Kongjak 2026. 4. 26. 21:45

CS 스터디 1주차 - 프로세스와 스레드

프로세스란

프로세스를 간단하게 설명하면, 컴퓨터에서 실행 중인 프로그램 이라고 설명할 수 있다.

프로그램을 실행하면 먼저 메모리에 프로그램이 적재되고, CPU가 실행 가능한 상태가 된다.

이때 메모리에 올라간 이 프로그램 (혹은 커널에 등록된 프로그램)을 프로세스라고 할 수 있다.

프로세스의 구조

프로세스는 다음곽 같이 총 4개의 영역으로 구성되어있다.

  • Stack
  • Heap
  • Data
  • Text

아래 표와 같은 순서로 나타낼 수 있으며, 아래로 갈 수록 메모리 주소가 낮아진다.

Stack
Heap
Data
Text

그렇다면, 각 구조별 특징에 대해 알아보자

Stack

임시 데이터 (지역 변수, 함수 호출 등)가 저장되는 영역으로, 가장 높은 메모리 주소를 가진다.

함수 호출 시에 생성되며, 함수가 끝나면 소멸된다.

컴파일 타임에 크기가 결정되기 때문에, 동적으로 할당할 수 없다.

또한, Stack은 높은 주소에서 낮은 주소 방향으로 자라난다.

Heap

코드에서 동적으로 생성되는 데이터가 저장되는 영역으로, 메모리 주소값에 의해서만 참조되고 사용되는 영역이다.

Stack과 다르게 런타임에 크기가 결정되며, 낮은 주소에서 높은 주소 방향으로 자란다.

Data

전역 변수 및 초기화된 데이터가 저장되는 영역으로, 프로그램이 종료되면 사라지는 변수들이 들어있는 영역이다.

다음과 같은 두가지 형태의 영역이 존재한다.

Uninitialized Data (bss): 초기화되지 않은 변수가 저장되는 곳

Initialized Data: 초기화 된 변수가 저장되는 곳

Text

실행할 프로그램의 소스코드가 저장되는 영역으로, Code라고도 불린다.

읽기 전용 (Read-Only)이다.

PCB

또한, 프로세스가 실행되면, 프로세스의 정보를 관리할 필요가 생길 것이다.

여기서 사용하는 것이 PCB (Process Control Block)이다.

이 PCB 안에는 다음과 같은 정보가 포함된다.

  • PID: 프로세스를 구분하는 ID
  • 프로세스 상태: 각 프로세스의 상태. Create, Ready, Running, Waiting, Terminated 등
  • Program Counter: 프로세스가 다음에 실행할 명령어의 주소
  • 레지스터
  • 스케줄링 정보
  • 계정 정보: 프로세스의 소유자, 부모 등
  • 입출력 상태 정보: 프로세스에 할당된 입출력 장치 목록, 열린 파일 등

Context Switching

그런데, 우리가 사용하는 컴퓨터는 이런 프로세스가 한두개만 존재하지 않는다.

이때, 운영체제는 정해진 자원 내에서 여러 프로세스들을 동시에 실행되는 것 처럼 보이기 위해 Context Switching이라는 방법을 사용한다. (물론 인터럽트 등의 다른 이유로도 발생한다.)

Context Switching에 대해 알기 전에 먼저 Context가 뭔지를 알아봐야 한다.

Context

Context는 프로세스 실행에 필요한 현재 상태 정보(레지스터, Program Counter 등)들의 집합을 뜻한다.

앞에서 설명한 프로세스의 구조에 있는 데이터들이 바로 이 Context에 해당한다.

Context Switching

결국, Context Switching은 Context를 저장하고, 다시 불러오는 일련의 과정 (Switching)을 말한다.

한정된 자원으로 여러 프로세스가 동시에 실행되는 것 처럼 보이게 하기 위한 방법이지만, 매우 무겁다.

그래서 이런 프로세스의 Context Switching을 해결하기 위해, 우리는 후술할 스레드를 사용한다.

(물론, 스레드 또한 Context Switching이 존재한다. 이를 해결하기 위해서는 Coroutine과 같은 Light Weight Thread를 사용하는데, 여기서는 다루지 않는다.)

스레드

스레드는 Light Weight Process라고도 부르며, 프로세스 내부에서 실행되는 작은 작업 단위이다.

따라서, 하나의 프로세스는 여러개의 스레드를 가질 수 있다.

프로세스 내부에 존재하는 만큼, 스레드는 프로세스의 데이터 영역에 접근이 가능하고, 같은 프로세스 내의 다른 스레드끼리 서로 데이터 접근이 가능하다는 특징이 있다. (Stack 영역은 독립적으로 가진다.)

또한, 후술할 멀티 스레드 기법을 통해, 병렬로 여러 작업을 처리할 수 있다.

멀티 프로세스

멀티 프로세스는 하나의 프로그램에서 여러 프로세스를 실행하는 방식이다.

하나의 부모 프로세스가 여러개의 자식 프로세스를 생성하고, 이렇게 생성된 프로세스들은 모두 독립적인 프로세스가 된다.

멀티 프로세스의 장점

멀티 프로세스의 특징으로는 독립적인 메모리 공간이 있다.

모든 프로세스는 독립적인 메모리 공간을 가지는데, 이는 멀티 프로세스도 예외는 아니다.

이런 점으로 인해 멀티 프로세스는 하나의 프로세스에 문제가 생기더라도 다른 프로세스들는 영향을 받지 않는 높은 안정성을 가진다.

다만, 이는 장점이 되기도 하고 단점이 되기도 한다.

멀티 프로세스의 단점

프로세스마다 독립적인 메모리 공간을 가진다는 점은 높은 메모리 사용량을 뜻하기도 한다.

또한, 독립적인 메모리 공간을 가짐으로 인해, 같은 프로그램이라고 하더라도 상호간의 메모리 공간에 접근할 수 없어 자원을 효율적으로 사용할 수 없어진다.

추가로, 프로세스가 많아짐에 따라 앞에서 말한 Context Switching 비용이 증가한다는 단점이 있다.

멀티 스레드

멀티 스레드는 하나의 프로세스에서 여러 스레드를 실행하는 방식이다.

하나의 프로세스에서 여러 스레드를 실행시킴에 따라, 멀티 프로세스와 달리 프로세스의 메모리 공간을 공유할 수 있다.

멀티 스레드의 장점

멀티 프로세스와 달리 메모리 공간을 공유할 수 있다는 점에서, 멀티 스레드는 자원을 더욱 효율적으로 사용할 수 있으며, 비교적 적은 메모리 사용량을 가진다.

또한, 프로세스보다 가벼워 생성 및 삭제가 빠르고, Context Switching 비용이 감소하는 특징이 있다.

멀티 스레드의 단점

물론, 메모리 공간을 공유한다는 점에서 멀티 프로세스의 장점이었던 안정성이 단점이 된다.

또한, 메모리 공간을 공유함에 따라 여러 스레드가 동일한 자원에 접근하는 동기화 문제가 발생할 수 있다. (이는 이후에 다룰 예정이다.)