CS

[운영체제] 프로세스와 스레드

hskkkk 2026. 7. 4. 15:43

프로세스

포그라운드 프로세스 (foreground process)

  • 사용자가 볼 수 있는 공간에서 실행되는 프로세스

백그라운드 프로세스 (background process)

  • 사용자가 볼 수 없는 공간에서 실행되는 프로세스
  • 사용자와 상호작용 가능한 백그라운드 프로세스 / 사용자와 상호작용하지 않고 정해진 일을 수행하는 백그라운드 프로세스 (데몬, 서비스)

프로세스 제어 블록

  • 모든 프로세스는 실행을 위해 CPU가 필요하나, CPU 자원은 한정되어 있음
  • 프로세스들은 돌아가며 한정된 시간만큼만 CPU 이용 -> 타이머 인터럽트가 발생하면 차례 양보
  • 빠르게 번갈아 수행되는 프로세스들을 관리해야 함 -> 프로세스 제어블록 알고리즘을 사용 (PCB, 커널 영역에 적재)
    • 프로세스 관련 정보를 저장하는 자료 구조
    • 마치 상품에 달린 태그와 같은 정보
    • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기
  • PCB에 담기는 대표적인 정보
    • 프로세스 ID (=PID) -> 특정 프로세스를 식별하기 위해 부여하는 ID
    • 레지스터 값 -> 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 -> 실행 재개
    • 프로세스 상태
    • CPU 스케줄링 정보 -> 프로세스를 언제, 어떤 순서로 CPU를 할당 받을지에 대한 정보
    • 메모리 정보 -> 프로세스가 어느 주소에 저장되어 있는지에 대한 정보, 페이지 테이블 정보
    • 사용한 파일과 입출력장치 정보 -> 할당된 입출력장치, 사용 중인(열린) 파일 정보

 

문맥 교환 (Context Switch)

  • 한 프로세스에서 다른 프로세스로 실행 순서가 넘어가면?
  • 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업
    • 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등
    • 이러한 중간 정보 == 문맥, 다음 차례가 왔을 때 실행을 재개하기 위한 정보
  • 뒤이어 실행할 프로세스 B의 문맥을 복구

 

프로세스의 메모리 영역

  • 코드 영역 (= 텍스트 영역)
    • 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장
    • 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read-only)
  • 데이터 영역
    • 잠깐 썼다가 없앨 데이터가 아닌, 프로그램이 실행되는 동안 유지할 데이터 저장 (ex-전역 변수)
  • 힙 영역 - 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간
  • 스택 영역
    • 데이터가 일시적으로 저장되는 공간
    • (데이터 영역에 담기는 값과는 달리) 잠깐 쓰다가 말 값들이 저장되는 공간 (ex-매개 변수, 지역 변수)

  • 힙 영역과 스택 영역의 크기는 가변적 (동적 할당)
    • 일반적으로 힙 영역은 낮은 주소 -> 높은 주소로 할당
    • 일반적으로 스택 영역은 높은 주소 -> 낮은 주소로 할당

프로세스의 상태

  • PCB에 기록되는 프로세스 상태
  • 생성 상태
    • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태
    • 준비가 완료되었다면 준비 상태로
  • 준비 상태
    • 당장이라도 CPU를 할당받아 실행할 수 있지만 자신의 차례가 아니기에 기다리는 상태
    • 자신의 차례가 된다면 실행 상태(=디스패치)
  • 실행 상태
    • CPU를 할당받아 실행 중인 상태
    • 할당된 시간 모두 사용 시(타이머 인터럽트 발생 시) 준비 상태로
    • 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로
  • 대기 상태
    • 프로세스가 실행 도중 입출력장치를 사용하는 경우
    • 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬
    • 입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비상태로
  • 종료 상태
    • 프로세스가 종료된 상태, PCB, 프로세스의 메모리 영역 정리

프로세스 계층 구조

  • 프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능
  • 새 프로세스를 생성한 프로세스 : 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스 : 자식 프로세스

프로세스 생성 기법

부모 프로세스는 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까?

  • 복제와 옷 갈아입기
    • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
    • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
  • fork 시스템 호출
    • 복사본(=자식 프로세스) 생성
    • 부모 프로세스의 자원 상속
  • exec 시스템 호출
    • 메모리 공간을 새로운 프로그램으로 덮어쓰기
    • 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화

 

스레드

  • 프로세스를 구성하는 실행 흐름의 단위
  • 하나의 프로세스는 하나 이상의 스레드를 가질 수 있음
    • 멀티 스레드 프로세스 : 실행 흐름이 여러 개인 프로세스

스레드의 구성 요소

  • 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등 실행에 필요한 최소한의 정보
  • 모든 스레드들은 프로세스의 자원을 공유하면서 실행이 됨

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

  • 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내 자원을 공유함
  • 멀티 프로세스
    • 프로세스를 fork 하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨
    • 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재
    • 남남처럼 독립적으로 실행 -> 프로세스 간 통신(IPC)으로 자원을 주고받을 수 있음
    • 파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신
  • 멀티 스레드
    • 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가짐
    • 프로세스가 가지는 자원을 공유 -> 협력과 통신에 유리

 

'CS' 카테고리의 다른 글

[운영체제] 프로세스 동기화  (0) 2026.07.06
[운영체제] CPU 스케줄링  (0) 2026.07.04
[운영체제] 커널, 시스템 콜, 이중 모드  (0) 2026.07.03
[컴퓨터 구조] 입출력장치  (0) 2026.07.03
[컴퓨터 구조] 메모리  (0) 2026.06.29