프로그램, 프로세스, 스레드

김동한·2025년 4월 4일
0

CS

목록 보기
11/13
post-thumbnail

프로그램

  • 디스크에 저장된 정적인 상태실행가능한 파일(명령어들의 집합)
  • 메모리 로드 전
  • 아직 실행되기 전
    ex) .exe .py .class .js 파일

프로세스

  • 프로그램이 실행되어 돌아가고 있는 동적인 상태의 프로그램
  • OS가 메모리에 프로그램 적재
  • 각 프로세스는 고유한(독립된) 메모리 공간(code, data, stack, heap 가짐)
    • 서로 다른 프로세스의 변수나 자료구조에 접근할 수 없음
    • 그래도 하려면, IPC 통신 사용해야 함.
+-------------------+  ← 높은 주소
|      Stack        |  ← 함수 호출, 지역 변수
+-------------------+
|      Heap         |  ← 동적 메모리 할당 (new, malloc 등)
+-------------------+
|     Data (변수)   |  ← 전역 변수, static 변수
+-------------------+
|     Code (Text)   |  ← 프로그램의 명령어 (기계어)
+-------------------+  ← 낮은 주소

# 메모리 구조**(프로세스 기준)**
  • 프로세스마다 하나 이상의 스레드를 포함

CPU(프로세서)의 작업 실행

이전과 다르게 멀티 태스킹, 멀티 프로세싱, 멀티코어 기술 덕분에 여러 작업이 동시에 또는 거의 동시에 돌아가는 것처럼 보인다. 이로인해, 동시성과 병렬성을 가진다.

구분설명예시
멀티 태스킹하나의 CPU에서 여러 프로그램을 교대로 빠르게 실행크롬 켜두고 노래 들으면서 워드작업
멀티 프로세싱여러개의 CPU나 코어가 각각 다른 작업을 동시에 수행쿼드코어 CPU에서 4개의 프로세스를 병렬로 실행

※ 멀티 태스킹의 교대로 빠르게 실행하는 방법엔 멀티 프로그래밍 방식, 시분할 방식, 실시간 시스템 방식이 있음

멀티 프로그래밍 방식

A: 계산 작업 중 → IO 요청 → 대기
→ B: 계산 시작
→ B 끝나면 다시 A로 복귀
  • CPU가 놀지 않게 여러 프로그램을 메모리에 올려두고, 하나가 입출력(IO) 등으로 대기 중이면 메모리의 다른 작업을 실행하는 방식
  • 동시 실행처럼 보이지만 실제로는 순차 처리하는 것이고 효율이 높지만 실시간 반응은 보장되지 않는다.

시분할 방식

프로세스 A에게 50ms → 프로세스 B에게 50ms → 다시 A ...
  • 여러 작업에 CPU 시간을 조금씩 나눠줌 (시간 조각=time slice)
  • OS가 스케줄러를 통해 빠른 속도로 스위칭하니까 동시에 실행되는 것처럼 느껴짐
  • Window,Linux OS 등의 기반이 되는 방식

실시간 시스템 방식

구분설명
하드 실시간마감 시간 반드시 지켜야 함 (안 지키면 시스템 장애)
소프트 실시간마감 시간 지키는게 중요하지만 유연함
  • 정해진 시간 안에 반드시 작업을 끝내야 하는 시스템
  • 결과보다 반응 속도와 마감시간(deadline)이 중요

동시성

  • CPU가 하나, 하지만 여러 작업을 번갈아가며 처리
  • Context Switching을 통해 순간적으로 작업 전환
    • 해당 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 됨
    • 프로세스 사이에 공유하는 메모리 없어, Context Switching 발생하면 캐쉬에 있는 모든 데이터 모두 리셋하고 다시 정보 불러와야함
  • 실제로는 동시에 하는 게 아님 → 하지만 사람 눈엔 동시에 보임

병렬성

  • CPU 코어가 여러 개 (듀얼코어, 쿼드코어 등)
  • 여러 작업이 진짜 동시에 수행됨 (코어별로 하나씩 처리)

스레드

  • 프로세스 내에서 실제로 작업을 수행하는 실행 단위
  • 한개의 프로세스 안에서 여러 작업을 동시에 처리하기 위해 등장
    • 프로세스는 각 작업마다 OS로부터 자원을 할당받기 위해 시스템 콜을 하는 부담이 생기지만 멀티 스레드는 시스템 콜을 한번만 해도 되기에 효율적
항목프로세스스레드
정의실행 중인 독립 프로그램프로세스 내부의 실행 흐름 단위
메모리 공간각자 공유한 메모리 공간같은 프로세스 안에서 메모리 공간 공유
안정성프로세스 끼리 독립적임스레드는 메모리를 공유하기에 동기화 이슈 존재함
커뮤니케이션IPC 필요메모리를 공유하기에 빠름

멀티 스레드

  • 응용프로그램 안의 작은 실행단위(스레드)로 나누는 것
  • 자원 공유가 빠르고, 가볍고, 통신도 쉬움

멀티스레딩의 단점

  1. 디버깅 어렵다: Race condition, 데드락 발생 시 원인 찾기 힘듦

    • Race condition : 여러 스레드가 공유 자원에 동시에 접근할때 실행 순서에 따라 결과가 달라지는 현상
    • 데드락(Deadlock) : 둘 이상의 스레드/프로세스가 서로가 가진 자원을 기다리느라 아무 일도 못하고 멈추는 상황
      ex)
      스레드 A스레드 B
      자원 X확보자원 Y확보
      자원 Y요청 및 대기자원 X요청 및 대기

      ✅ Deadlock 발생 4조건 (모두 충족해야 발생):

      • 상호 배제(Mutual Exclusion) – 자원은 한 번에 하나만 사용 가능
      • 점유 대기(Hold and Wait) – 자원을 점유한 채 다른 자원을 기다림
      • 비선점(No Preemption) – 다른 스레드가 자원을 강제로 뺏을 수 없음
      • 환형 대기(Circular Wait) – A → B → C → A 같은 대기 구조 존재

    1-a. 해결 방법으로 Race Condition은 Lock,Mutex,Semaphore,Atomic 변수 등이 있고, Deadlock은 락 순서 정하기, 타임아웃, 교착 상태 탐지 및 회복, 자원 순환 방지 등이 있다.

  2. 동기화 필요: 메모리를 공유하기 때문에 충돌 가능

  3. 스레드 하나가 죽으면 전체 프로세스 영향 → 스레드는 독립성이 낮음

  4. 단일코어 환경에서는 오히려 효율 떨어질 수도 있음

    • CPU의 동시성은 사실 Context Switching을 통해 순차적으로 실행되는 것이기 때문에 진짜로 동시에 실행되는 것은 아니다. 따라서, 코어 하나당 스레드 한개를 실행할 수 있는건데, 멀티 쓰레딩을 하게되면, 어차피 병렬 실행이 안되기 때문에 성능이 오르지 않고, 스레드의 공유 자원 보호를 위해 락(lock)을 거는데, 이것이 병목이 될 수 있으며, 스레드 전환마다 레지스터,캐시 상태 저장/복원 과정이 들어가 CPU가 부담된다.
profile
(●'◡'●)

0개의 댓글