운영체제

02강-프로세스와 쓰레드

2026-03-04

프로세스란 무엇인가

  • 프로세스(Process): 실행 중인 프로그램
  • 프로그램(Program): 저장장치에 존재하는 정적·수동적 개체
  • 프로세스: CPU에서 명령어를 수행하며 자원을 사용하는 동적·능동적 개체

작업관리자(예시)로 보는 프로세스

  • 실행 중인 프로그램(한글, 파워포인트, 탐색기, 작업관리자 등)과 백그라운드 작업이 프로세스 목록으로 표시됨
  • 각 프로세스별로 CPU/메모리/디스크/네트워크 사용량 확인 가능
  • 같은 프로그램을 여러 번 실행할 수 있으므로, 프로세스는 이름 외에 PID(프로세스 ID) 로 구분한다

프로세스가 필요한 자원

프로세스는 운영체제로부터 자원을 할당받아 실행된다

  • CPU: 명령어 실행
  • 메모리: 코드/데이터 적재
  • 입출력 장치: 키보드/모니터/프린터 등
  • 파일/디스크: 저장 및 입출력
  • (필요 시) 네트워크

프로세스 관리자의 역할(프로세스 관리자)

  • 프로세스 생성/종료
  • CPU를 어떻게 나눠 쓸지 결정하는 스케줄링
  • 프로세스 상태 관리(실행/대기 등)

이번 강의는 생성/종료 및 상태 개념 중심, 스케줄링은 다음 강의에서 심화


프로세스의 기본 구성 요소

프로세스는 크게 다음 두 요소로 구성된다

  • 프로세스 메모리 구조
  • PCB(Process Control Block, 프로세스 제어 블록)

프로세스 메모리 구조

프로그램이 실행되려면 코드와 데이터가 메모리에 존재해야 한다

큰 틀

  • 코드(Code) 영역: 실행할 프로그램 명령(코드)
  • 데이터(Data) 영역: 실행 중 필요한 데이터

데이터 영역의 대표 구성

  • 정적 데이터 영역: 전역변수/정적변수 등 비교적 “지속”되는 데이터
  • 힙(Heap): 동적 할당 데이터(실행 중 필요에 따라 증가/감소)
  • 스택(Stack): 함수(서브프로그램) 호출 관계/지역 변수 등
    • 호출이 중첩되면 스택에 쌓이고, 반환되면 pop되는 구조

PCB(Process Control Block)

운영체제가 프로세스를 관리하기 위해 유지하는 “관리 정보 묶음”

PCB에 포함되는 대표 정보

  • PID(프로세스 ID): 프로세스 식별자
  • 프로세스 상태: 실행/준비/대기 등
  • 프로그램 카운터(PC): 다음에 실행할 명령어의 위치
  • 레지스터 값들: 문맥 교환 시 저장/복원해야 할 CPU 상태
  • 메모리 관리 정보: 프로세스가 사용하는 주소 공간 정보(베이스/리밋 등), 가상-물리 매핑 관련 정보 등
  • 우선순위 정보: 스케줄링에 활용
  • 기타(파일, I/O 상태 등)

PCB가 중요한 이유: 문맥 교환(Context Switch)

  • 실행 중인 프로세스 A에서 C로 CPU를 넘길 때,
    • A의 PC/레지스터 등 실행 문맥을 PCB에 저장
    • C의 PCB에서 문맥을 복원
  • 그래서 나중에 A가 다시 실행될 때 중단 지점부터 이어서 실행 가능

프로세스 상태(5-상태 모델)

대표적인 프로세스 상태를 5가지로 설명한다

  • 생성(New): 작업이 시스템에 들어와 프로세스가 만들어지는 중(메모리 구조/PCB 준비)
  • 준비(Ready): 실행할 준비 완료, CPU만 기다리는 상태(준비 큐에 대기)
  • 실행(Running): CPU를 할당받아 명령어를 실행 중
  • 대기(Waiting/Blocked): I/O 등 이벤트를 기다리는 상태(프린터 출력, 디스크 I/O, 페이지 교체 등)
  • 종료(Terminated): 실행 완료 또는 오류로 종료, 자원 반납

상태 전이(대표 흐름)

  • 생성 → 준비
  • 준비 → 실행 (디스패치: CPU 할당)
  • 실행 → 준비 (할당 시간 만료, 더 높은 우선순위에 의해 선점 등)
  • 실행 → 대기 (I/O 등 이벤트 대기)
  • 대기 → 준비 (이벤트 완료 후 준비 큐로 복귀)
  • 실행 → 종료 (정상 종료/오류 종료)

핵심: 대기에서 바로 실행으로 가지 않고, 준비 큐를 거친다


부모 프로세스와 자식 프로세스

  • 이미 실행 중인 프로세스가 시스템 호출을 통해 새로운 프로세스를 만들 수 있다
  • 이때
    • 생성 요청을 한 프로세스: 부모(Parent)
    • 새로 생성된 프로세스: 자식(Child)
  • 부모/자식은 절대적 관계가 아니라 관점에 따른 상대적 관계

프로세스 생성: UNIX/Linux vs Windows

운영체제마다 시스템 호출 방식이 다를 수 있다

UNIX/Linux: fork()exec()

  • fork():
    • 호출한 프로세스의 복제본(자식 프로세스) 생성
    • 자식은 PID만 새로 부여되고, 코드/데이터/PC 위치 등은 복제된 형태로 시작
    • 반환값 관점:
      • 부모: 자식 PID를 반환
      • 자식: 0을 반환 → “내가 자식이다” 판단에 활용
  • exec():
    • (주로 자식에서) 다른 프로그램을 실행하도록 프로세스의 실행 이미지(코드/데이터)를 교체
    • PID는 그대로 유지되지만, 수행할 프로그램이 바뀜

Windows: CreateProcess()

  • 처음부터 특정 프로그램(예: Program2)을 대상으로 새 프로세스를 생성
  • 부모는 생성된 자식의 PID 등을 반환받아 관리 가능

프로세스 종료 유형(대표 3가지)

  • 정상 종료: 프로세스가 할 일을 다 마침
  • 부모가 자식을 강제 종료: 필요 없어졌을 때 PID를 이용해 종료 요청
  • 부모 종료로 인한 자식 종료: 부모가 종료되면 운영체제가 자식을 정리하는 경우가 발생 가능

쓰레드(Thread) 소개: 왜 등장했나

전통적인 프로세스 모델은

  • 자원 소유 단위이면서
  • 디스패칭(실행) 단위이기도 했다

하지만 전통적 프로세스는 제어 흐름(PC) 이 하나라서,

  • 한 프로세스 내부에서 “여러 흐름의 동시 처리(다중 처리)”가 제한됨

그래서 나온 개념이 쓰레드(Thread):

  • 실행(디스패칭)의 기본 단위가 프로세스에서 쓰레드로 내려옴
  • 하나의 프로세스 안에 여러 쓰레드가 존재할 수 있음(멀티스레딩)

쓰레드 기반 구조에서 달라지는 점

프로세스는 자원을 공유하고, 쓰레드가 실행 흐름을 분리한다

프로세스가 공유하는 것(자원 소유 단위)

  • 코드 영역
  • 정적 데이터

쓰레드마다 독립적으로 필요한 것(실행 단위)

  • PC 포함 레지스터 집합
  • 상태 정보
  • 스택(Stack)
    • 쓰레드마다 함수 호출/지역변수 상태가 달라질 수 있으므로 스택은 반드시 분리

쓰레드가 하나면 전통적인 프로세스와 거의 유사하게 동작한다


멀티쓰레드 활용 예

  • 멀티코어/멀티CPU: 쓰레드를 각 코어에 배치하면 진짜 병렬 실행 가능
  • 단일 CPU에서도:
    • 계산 쓰레드 / 입력 처리 쓰레드 / 백업(출력) 쓰레드를 나누면
    • I/O 대기 동안 CPU를 다른 쓰레드에 주어 효율 향상 가능

정리

  • 프로세스는 실행 중인 프로그램을 의미
    • CPU, 메모리, 파일, 입출력장치 등 실행에 필요한 자원이 할당됨
  • 프로세스 제어 블록은 프로세스를 명시해주는 다양한 내용을 포함
  • 프로세스는 생성, 준비, 실행, 대기, 종료의 다섯 상태 중 하나로 존재
  • CPU의 스케줄링, 입출력 대기 등에 따라 상태가 변화되며 동작
  • 쓰레드는 프로세스에서 실행의 개념만 분리한 것으로 디스패칭의 단위
  • 하나의 프로세스 내에는 하나 이상의 쓰레드가 있을 수 있어, 다중 쓰레드를 생성하여 프로세스 내에서의 다중처리를 할 수 있음