나만의 학습 기록

최종 목적은 기술 블로그💩

백엔드 공부

OS에 대한 전반적인 지식 (3) - 프로세스•스레드•동시성

밈밍민믹 2026. 3. 31. 16:13

안녕하세요. 요즘 날씨가 완전히 봄날씨가 되었더라고요? 벚꽃도 예쁘게 피어가고 날도 좋으니 즐거운 마음으로 열심히 공부해봅시다.

저번시간에는 운영체제와 터미널 명령어에 대해서 학습을 하였습니다. 이번시간에는 프로세스•스레드•동시성, 메모리 관리를 두 편에 나눠서 설명해보도록 하겠습니다.

 


프로세스

  • 보조기억장치에 저장된 프로그램이 메모리에 적재되어 CPU를 할당받고 실행 중인 상태
  • 작업 중인 프로그램을 의미한다.
  • 프로그램의 경우 어떤 작업을 하기 위해 실행할 수 있는 파일을 얘기하지만, 프로세스의 경우 실행되어 작업중인 컴퓨터 프로그램으로 둘은 다른 용어이다.
  • 과거에는 한 번에 하나의 작업만 처리하는 방식이 일반적이었기에 다운로드가 완료될 때까지 다른 작업을 수행하기 어려웠습니다. 오늘날에는 프로세스와 스레드를 활용하여 여러 작업을 동시에 처리하는 방식으로 한계를 보완하였습니다.

프로세스의 메모리 구조

프로세스는 독립적인 가상 주소 공간을 가지며, 이 공간은 code, data, heap, stack 영역으로 구성된다.

  1. code 영역
    • 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
    • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only로 되어있다.
  2. data 영역
    • 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
    • 전역 변수가 변경 될 수 있어 Read-Write로 되어있다.
  3. stack 영역
    • 호출된 함수 시 생성되는 지역 변수, 매개변수, 복귀 주소 등을 임시로 저장하는 영역
    • LIFO 방법을 따른다.
    • 크기가 결정되기에 제한되었기에 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 많이 가지고 있을 경우 stack overflow가 발생한다.
  4. heap 영역
    • 프로그램 실행 중 동적으로 메모리를 할당받는 영역
    • 런타임에 의해 결정되며 자바에서는 객체가 heap 영역에 생성되고 GC에 의해 정리된다.

 

프로세스의 상태 변화

프로세스는 실행하면서 상태가 변화하기에 운영체제는 프로세스 제어에 필요한 상태를 점검하고 프로세스를 제어한다.

프로세스 상태

프로세스의 상태는 크게 실행/비실행 상태로 구분할 수 있다.

  1. 운영체제가 프로세스를 생성하면 비실행 상태로 초기화하여 실행을 기다린다.
  2. 실행 중인 프로세스가 종료되거나 새로운 자원을 할당 받고자 할 때 또는 인터럽트가 발생하면 비실행 프로세스 중에서 선택한 프로세스를 실행 상태로 바꾼다.(디스패치)
  3. 인터럽트된 프로세스는 비실행 상태가 된다.

 

프로세스의 상태는 더욱 세부적으로 분류할 수 있으며, 이러한 프로세스의 상태 변화는 운영체제의 스케줄러에 의해 관리된다.

  1. 생성  준비 
    • 프로세스가 메모리에 적재되어 실행 준비를 마친 상태
  2. 준비 실행
    • 스케줄러에 의해 CPU가 할당되어 프로세스가 실제로 동작(디스패치 수행)
  3. 실행 준비 
    • 할당된 CPU 시간 만료 혹은 인터럽트에 의해 다시 대기 상태로 전환
  4. 실행 대기
    • 입출력 연산 발생 또는 자ㅝㄴ 요청을 위해 스스로 프로세서를 양도한다.
  5. 대기 준비
    • 입출력 완료 등 대기 원인이 제거되어 다시 실행을 위해 대기하는 상태
  6. 실행 → 종료
    • 프로세스 수행이 모두 완료된다.

 

프로세스 관리

  • 컴퓨터 환경에서 운영체제가 실행중인 프로그램(프로세스)의 생성, 스케줄링, 동기화, 종료를 처리하는 핵심 기능

1. 프로세스 생성과 종료 관리

운영체제는 프로그램이 실행되면 이를 프로세스로 생성하고, 작업이 끝나면 종료시킵니다. 이 고정에서 프로세스마다 고유한 정보(PID, 상태, 메모리 정보 등)를 관리합니다.

 

2. 스케줄링

CPU는 한 번에 제한된 작업만 처리할 수 있으므로 운영체제는 여러 프로세스 중 어떤 것을 먼저 실행할지 결정합니다.

종류 스케줄링 방식 설명 특징
선점형
스케줄링
라운드로빈 각 프로세스에 일정한 시간 할당량을 주고 순서대로 CPU 배분하는 방식 응답성이 좋아 시분할 시스템에 적합하지만 문맥 교환이 자주 발생할 수 있다.
SRT 실행 중인 프로세스보다 남은 실행 시간이 더 짧은 프로세스가 도착하면 CPU를 선점하여 실행하는 방식  짧은 작업에 유리하지만 긴 작업은 계속 밀릴 수 있다.
다단계 큐 프로세스를 여러 큐로 나누고 각 큐에 서로 다른 우선순위와 스케줄링 방식을 적용하는 방식 작업 성격에 따락 관리할 수 있지만 큐 간 이동이 어렵거나 불가능하다.
비선점형
스케줄
다단계 피드백 큐 프로세스가 큐 사이를 이동할 수 있도록 하는 방식 유연성이 높고 응답성이 좋지만 구조가 복잡하다.
우선순위 우선순위가 높은 프로세스를 먼저 실행하는 방식 중요한 작업을 먼저 처리할 수 있지만 낮은 우선순위 작업이 기아 상태에 빠질 수 있다.
기한부 정해진 기한이 가까운 작업을 우선 실행하는 방식 실시간 처리에 적합하지만 일반적인 운영체제 설명에서는 자주 다루지 않는다.
FCFS 먼저 도착한 프로세스를 먼저 실행하는 방식 구현이 단순하지만 긴 작업이 앞에 오면 대기 시간이 길어질 수 있다.
SJF 실행 시간이 가장 짧은 프로세스를 먼저 실행하는 방식 평균 대기 시간을 줄일 수 있지만 실행 시간을 미리 알아야 한다.
HRN 대기 시간과 서비스 시간을 함께 고려하여 우선순위를 계산하는 방식 긴 대기 작업의 기아 현상을 완화할 수 있다.

 

3. 상태 관리

생성, 준비, 실행, 대기, 종료 상태를 오가며 운영체제는 해당 상태 변화를 관리하며 프로세스가 적절한 시점에 실행되도록 합니다.

 

4. 문맥 교환

실행 중이던 프로세스를 멈추고 다른 프로세스를 실행할 때, 기존 작업 정보를 저장하고 새 작업 정보를 불러오는데 이를 문맥 교환이라고 합니다. 이를 통해 프로세스를 관리합니다.

 

5. 자원할당 및 회수

운영체제는 각 프로세스에 CPU, 메모리, 파일, 입출력 장치 같은 자원을 배분하고, 종료 시 회수합니다.

 

⭐ 6. 프로세스 간 통신(IPC)

여러 프로세스가 서로 데이터를 주고 받아야 할 때, 운영체제는 파이프, 메시지 큐, 공유 메모리 같은 IPC 방식을 제공한다.

 

스레드 간 통신보다 프로세스 간 통신이 어려운 이유

  • 프로세스는 생성되면서 PC를 포함하여 메모리 공간 등을 복사하여 별도의 자원을 할당하지만, 스레드는 메모리 공간과 자원을 공유하기 때문입니다.
  • 즉, 프로세스는 통신할 수 있는 공간이 없기에 통신을 위한 별도의 공간을 만들어줘야하기에 스레드 간 통신보다 어렵다고 할 수 있습니다.

1. 공유 메모리

  • 여러 프로세스가 동일한 메모리 공간을 공유하여 데이터를 주고 받는 방식
  • 복사 과정이 적어 속도가 빠르지만 동기화 문제가 발생할 수 있다.
  • 대용량 데이터 공유, 빠른 프로세스 간 통신에 이용된다.

 

2. 파이프

  • 한 프로세스의 출력 데이터를 다른 프로세스의 입력으로 전달하는 방식
  • 구현이 단순하지만 보통 단방향 통신에 적합하다.
  • 쉘 명령어 연결에 활용된다.

 

3. 소켓

  • 네트워크를 통해 프로세스 간 통신하는 방식
  • 다른 시스템과 통신이 가능하지만 구현이 복잡하다.
  • 클라이언트-서버에 활용된다.

 

4. 메시지 큐

  • 메시지 단위로 데이터를 주고받는 방식
  • 구조적 통신이 가능하지만 오버헤드 발생할 수 있다.
  • 비동기 처리에 활용된다.

 

5. 메모리 맵

  • 파일을 메모리에 매핑하여 접근하는 방식
  • 파일 입출력에 효율적이지만 관리에 주의가 필요하다.
  • 파일 기반 데이터 처리에 활용된다.

 

6.RPC

  • 원격 시스템의 함수를 로컬처럼 호출하는 방식
  • 분산처리에 유용하지만 네트워크 의존도가 크다.
  • 마이크로서비스에 활용된다.

스레드

  • 프로세스 내부에서 실행되는 작은 작업 단위
  • 하나의 프로세스는 내부에 여러개의 스레드가 포함될 수 있다.

 

스레드의 특징

  1. 스레드는 프로세스 내부에 존재하기에 프로세스의 데이터 영역에 접근 가능하며, 스레드들끼리 서로의 데이터에 접근 가능하다.
  2. 스레드도 프로세스처럼 작업을 병렬로 처리해서 속도를 높일 수 있다.
  3. 각 스레드는 자신만의 스택 영역을 별도로 가진다.
  4. 하나의 프로세스는 내부에 여러 개의 스레드를 가질 수 있다. 

 

프로세스와 스레드의 차이

구분 프로세스 스레드
정의 실행중인 프로그램 단위 프로세스 내부에서 실행되는 작업 단위
메모리 각각 독립적인 메모리 공간을 가짐 같은 프로세스의 메모리 공간을 공유함
자원 공유 다른 프로세스와 자원을 직접 공유하지 않음 같은 프로세스 내 스레드끼리는 자원을 공유함
생성 비용 비교적 크다 비교적 작다
문맥 교환 비용 크다 프로세스보다 작다
안정성 하나가 문제 생겨도 다른 프로세스에 영햐이 적음 하나의 스레드 오류가 전체 흐로세스에 영향을 줄 수 있다.
통신 방식 IPC가 필요함 같은 메모리 공간을 공유하므로 직접 접근 가능

 

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

 

멀티 스레드

  • 하나의 프로세스 내부에서 여러 개의 스레드가 동시에 실행되는 것
  • 같은 스레드까리 메모리 공간을 공유하고 접근하기에 통신 속도가 빠르다

멀티 프로세스

  • 여러 개의 독립적인 프로세스가 동시에 실행되는 것
  • 서로에게 접근하려면 IPC 기법을 사용해야한다.

 

멀티스레드의 장점

  1. 응답성 향상
    • 하나의 스레드가 오래 걸리는 작업을 수행하는 동안에도 다른 스레드가 작업을 계속 처리할 수 있어 사용자 응답성이 좋아진다.
  2. 자원 공유 효율
    • 같은 프로세스 내 스레드들은 메모리를 공유하므로, 프로세스보다 자원 공유가 쉽고 효율적이다.
  3. 생성 및 전환 비용 감소
    • 스레드는 프로세스보다 생성 비용과 문맥 교환 비용이 적어 비교적 가볍게 관리할 수 있다.
  4. 동시 작업 처리
    • 여러 작업을 동시에 수행할 수 있어 작업 처리 효율을 높일 수 있다.
  5. 시스템 자원 활용 향상
    • CPU 작업과 입출력 작업을 나누어 처리하면서 시스템 자원을 더 효율적으로 활용할 수 있다.

동시성

  • 여러 작업이 동시에 진행되는 것처럼 보이도록 처리하는 방식
  • CPU가 아주 짧은 시간 단위로 작업을 번갈아 수행하면서 여러 작업이 함께 실행되는 것 처럼 보인다.

 

동시성과 병렬성의 차이

구분 동시성 병렬성
의미 여러 작업을 번갈아 처리하여 동시에 실행되는 것처럼 보이게 하는 것 여러 작업을 실제로 같은 시점에 동시에 실행하는 것
실행 방식 하나의 CPU 코어에서도 가능 보통 여러 CPU 코어가 필요
목적 작업 흐름을 효율적으로 관리 작업 처리 속도를 실제로 높임
예시 한 코어가 여러 작업을 빠르게 번갈아 수행 여러 코어가 각각 다른 작업을 동시에 수행

 

동시성 문제

  1. 경쟁 상태
    • 여러 작업이 동시에 같은 데이터에 접근하면서 실행 순서에 따라 결과가 달라지는 문제
  2. 임계 영역
    • 여러 작업이 동시에 접근하면 안되는 공유 자원 접근 구간
  3. 교착 상태
    • 두 개 이상의 작업이 서로 자원을 기다리며 무한히 멈춰있는 상태
  4. 기아 상태
    • 우선 순위가 낮은 작업이 계속 실행되지 못하고 무한히 기다리는 상태

 


오늘은 프로세스, 스레드, 동시성에 대해서 학습해보았어요. CS 공부 카테고리에 작성했던 글이랑 겹치는 부분이 많았지만 백엔드 로드맵에 존재하는 내용들이라서 자세히까지는 아니여도 간략하게 설명해보았습니다. 특히 동시성 문제를 보면서 개인 프로젝트로 백엔드 프로젝트를 진행하면서 동시성 문제로 경쟁 상태가 발생하고 이를 비관적 락을 통해서 해결했던 경험이 떠오르네요.하지만 오늘 정리한 내용은 제가 프로젝트에서 발생한 문제보다는 넓은 범위의 동시성이라는 차이점이 존재하네요. 이처럼 프로젝트 내용도 결국 이론과 많은 연관성이 있다는 걸 유의하면서 학습해주시면 좋겠습니다.

다음에는 메모리 관리에 대한 내용을 정리해보도록 하겠습니다.