← Blog로 돌아가기

2026년 4월 19일 · 조회수 3

CS / OS

[OS] 2. 프로세스와 쓰레드

본 글은 인프런 강의를 바탕으로 정리한 개인 학습 기록입니다.
출처: <그림으로 쉽게 배우는 운영체제>



목차

1. 프로그램과 프로세스
2. 멀티프로그래밍과 멀티프로세싱
3. PCB
4. 프로세스 상태
5. 컨텍스트 스위칭
6. 프로세스 생성과 종료
7. 쓰레드



1. 프로그램과 프로세스


1) 프로그램과 프로세스의 차이

  • 프로그램

    • 하드디스크 같은 저장장치에 저장된 파일
    • 실행 전의 수동적 존재
  • 프로세스

    • 프로그램이 메모리에 올라와 실행 중인 상태
    • CPU를 사용하고, 메모리를 차지하며, 운영체제의 관리를 받는 능동적 존재

2) 프로그램이 프로세스가 되는 과정

  • 저장장치에 있는 실행 파일을 실행함
  • 운영체제가 그 프로그램을 메모리에 적재
  • 메모리에 올라가 실행되면 프로세스가 됨

3) 프로세스 메모리 구조

  • 코드 영역

    • 실행할 명령어 저장
  • 데이터 영역

    • 전역 변수, static 변수 저장
  • 스택 영역

    • 지역 변수, 함수 호출 정보 저장
  • 힙 영역

    • 동적 메모리 할당에 사용
    • C에서는 malloc으로 할당하고 free로 해제

4) C 프로그램이 실행 파일이 되는 과정

예: test.c

  1. 전처리

    • 헤더 포함, 매크로 치환 수행
    • 결과: .i
  2. 컴파일

    • C 언어를 어셈블리어로 변환
    • 결과: .s
  3. 어셈블

    • 어셈블리어를 기계어로 변환
  4. 링킹

    • 라이브러리와 연결해 최종 실행 파일 생성
    • 결과: .exe

5) 실행 흐름

  • 완성된 실행 파일을 실행하면 운영체제가 메모리에 적재함
  • 이 순간 프로그램은 프로세스가 됨
  • CPU는 메모리에서 명령어를 읽고 실행함

6) CPU 관점의 실행

  • CPU는 직접 기계어만 실행함
  • 제어장치가 메모리의 값을 가져오고 저장을 지시함
  • 값은 레지스터에 잠시 저장됨
  • ALU가 연산을 수행함
  • 결과는 다시 레지스터나 메모리에 저장됨


2. 멀티프로그래밍과 멀티프로세싱


1) 유니프로그래밍

  • 메모리에 프로세스 1개만 올려 실행하는 방식
  • 실행 중 I/O 작업이 발생하면 CPU는 I/O가 끝날 때까지 기다림
  • 그동안 CPU가 놀게 되어 비효율적임

2) 멀티프로그래밍

  • 메모리에 여러 프로세스를 올려두는 방식
  • 한 프로세스가 I/O를 기다리는 동안 다른 프로세스 실행
  • CPU 유휴 시간이 줄어들어 효율이 높아짐

3) 멀티태스킹

  • 여러 프로세스를 짧은 시간 단위로 번갈아 실행하는 방식
  • 사용자 입장에서는 여러 작업이 동시에 실행되는 것처럼 보임
  • 시분할 시스템의 개념과 연결됨

4) 멀티프로세서

  • 컴퓨터에 CPU가 여러 개 있는 구조

5) 멀티프로세싱

  • 여러 CPU를 이용해 작업을 처리하는 방식
  • 실제로 여러 작업을 더 빠르게 처리할 수 있음


3. PCB


1) 프로세스

  • 실행 중인 프로그램
  • 운영체제는 여러 프로세스를 관리하며 CPU를 나누어 줌

2) PCB (Process Control Block)

  • 운영체제가 각 프로세스를 관리하기 위해 만드는 정보 묶음
  • 프로세스가 생성되면 PCB도 함께 생성됨
  • 프로세스가 종료되면 PCB는 제거됨

3) PCB 저장 방식

  • PCB들은 보통 연결 리스트 형태로 관리됨
  • 프로세스가 추가되거나 제거될 때 관리하기 쉬움

4) PCB에 들어 있는 주요 정보

  • 프로세스 상태

    • 생성, 준비, 실행, 대기, 완료
  • 프로세스 ID(PID)

    • 각 프로세스를 구별하는 고유 번호
  • 프로그램 카운터(PC)

    • 다음에 실행할 명령어의 위치
    • 중단된 후 다시 이어서 실행할 때 필요함
  • 레지스터 정보

    • 실행 중 사용하던 레지스터 값 저장
  • 메모리 정보

    • 프로세스가 사용하는 메모리 위치 정보
    • 보호 관련 정보 포함
  • CPU 스케줄링 정보

    • 우선순위
    • 실행 시간
    • CPU 사용 관련 정보

5) PCB가 중요한 이유

  • 시분할 시스템에서는 프로세스가 번갈아 실행됨
  • 따라서 운영체제는 중단된 프로세스를 다시 실행할 때 어디까지 실행했는지, 어떤 상태였는지 알아야 함
  • 이 역할을 PCB가 담당함


4. 프로세스 상태


프로세스 상태

1) 생성 상태

  • 프로그램을 실행하면 프로세스가 생성
  • 이때 운영체제는 PCB를 만들고 메모리에 적재를 준비함
  • 메모리에 올라가면 준비 상태로 이동함

2) 준비 상태

  • CPU를 할당받기 위해 기다리는 상태
  • CPU 스케줄러가 이 상태의 프로세스들 중 하나를 선택함
  • 많은 프로세스가 주로 이 상태에 머묾

3) 실행 상태

  • CPU를 할당받아 실제로 실행 중인 상태
  • CPU가 1개면 한 순간에 실행 상태인 프로세스도 1개뿐임
  • 할당된 시간이 끝나면 CPU를 반납하고 다시 준비 상태로 돌아감

4) 대기 상태

  • 프로세스가 입출력(I/O) 작업을 요청하면 들어가는 상태
  • I/O가 끝날 때까지 기다림
  • 이 동안 CPU는 다른 프로세스를 실행함
  • I/O가 끝나면 다시 준비 상태로 돌아감

5) 완료 상태

  • 프로세스 실행이 끝난 상태
  • 메모리에서 제거되고, PCB도 함께 제거됨

상태 전이 흐름

생성 → 준비 → 실행
실행 중 시간이 끝나면 실행 → 준비
실행 중 I/O 요청 시 실행 → 대기
I/O 완료 시 대기 → 준비
작업이 끝나면 실행 → 완료


5. 컨텍스트 스위칭


1) 컨텍스트 스위칭

  • CPU가 한 프로세스를 실행하다가 다른 프로세스로 바꾸는 작업
  • 현재 실행 중인 프로세스의 정보를 저장하고
  • 다음에 실행할 프로세스의 정보를 복원함

2) PCB에 저장되는 정보

  • 프로세스 상태
  • 프로그램 카운터(PC)
    • 다음에 실행할 명령어 위치
  • 레지스터 값
    • CPU가 사용하던 값들

3) 동작 과정

  1. 현재 실행 중인 프로세스를 중단함
  2. 그 프로세스의 현재 상태를 PCB에 저장
  3. 다음에 실행할 프로세스의 PCB를 읽음
  4. 저장된 값들을 CPU에 복원
  5. 그 프로세스의 다음 명령어부터 실행함

4) 예시

  • 프로세스 A가 실행 중임
  • 타임 슬라이스가 끝나면 인터럽트가 발생함
  • 운영체제가 A의 상태를 PCB A에 저장
  • 이어서 PCB B의 상태를 CPU에 복원
  • CPU는 프로세스 B를 실행함
  • 이후 다시 시간이 지나면 같은 방식으로 전환이 반복됨

컨텍스트 스위칭

5) 컨텍스트 스위칭이 발생하는 경우

  • CPU 사용 시간 만료
  • I/O 요청 발생
  • 인터럽트 발생


6. 프로세스 생성과 종료


1) fork

  • 기존 프로세스를 복사해서 자식 프로세스 생성
  • 원본은 부모 프로세스, 복사본은 자식 프로세스
  • 반환값:
    • 부모 프로세스: 0이 아닌 값
    • 자식 프로세스: 0

2) exec

  • 자식 프로세스가 새 프로그램으로 자신의 코드 내용을 교체하는 함수
  • fork만 하면 부모와 자식이 같은 코드를 실행하므로, 자식은 보통 exec를 사용해 다른 프로그램을 실행함

3) wait

  • 부모 프로세스가 자식 프로세스가 끝날 때까지 기다리는 함수
  • 자식이 종료되면 부모는 자식의 종료 상태를 회수함

4) exit

  • 프로세스가 작업을 마치고 종료하는 것
  • 종료하면서 부모에게 종료 상태를 전달함

5) 좀비 프로세스

  • 자식 프로세스는 종료했지만
  • 부모가 wait로 종료 상태를 회수하지 않은 상태
  • 프로세스 정보가 남아 있어 자원을 차지함

실행 흐름 예시

bash에서 vim 실행

사용자가 터미널에서 `vim` 입력
bash가 fork() 호출
자식 프로세스 생성
자식 프로세스는 exec()로 vim 프로그램 실행
부모 프로세스인 bash는 wait()로 자식 종료 대기
vim이 종료되면 부모가 종료 상태를 회수하고 다시 실행 계속
fork로 자식 생성 → exec로 새 프로그램 실행 → 부모가 wait로 종료 회수


7. 쓰레드


1) 프로세스

  • 운영체제가 관리하는 독립적인 실행 단위
  • 프로세스마다 PCB가 생성됨
  • 각 프로세스는 자신만의 코드, 데이터, 스택, 힙 구조를 가짐
  • 그래서 프로세스가 많아질수록 메모리 사용량과 관리 부담이 커짐

2) 스레드

  • 프로세스 내부에서 실행되는 단위
  • 한 프로세스 안에 여러 개의 스레드가 존재할 수 있음
  • 스레드는 작업을 나누어 처리하기 위해 사용됨

3) 스레드의 메모리 구조

  • 공유하는 것
    • 코드 영역
    • 데이터 영역
    • 힙 영역
  • 공유하지 않는 것
    • 스택 영역
  • 스레드마다 구별을 위해 스레드 IDTCB가 필요함

4) 왜 스레드를 쓰는가

  • 프로세스는 각각 독립된 메모리 구조를 가져서 무거움
  • 프로세스 수가 많아지면 메모리 낭비와 관리 오버헤드가 커짐
  • 스레드는 같은 프로세스 안에서 자원을 공유하므로 메모리를 절약하고 더 가볍게 작업을 처리할 수 있음

5) 브라우저 예시

  • 프로세스 방식

    • 탭마다 프로세스를 하나씩 만들면
    • 탭이 많아질수록 메모리 사용량이 크게 증가함
  • 스레드 방식

    • 하나의 프로세스 안에서 탭마다 스레드를 만들면
    • 코드, 데이터, 힙을 공유하므로 메모리를 아낄 수 있음

6) 장단점 비교

프로세스의 장단점

  • 장점

    • 서로 독립적이라 안정성이 높음
    • 한 프로세스가 문제를 일으켜도 다른 프로세스에 영향이 적음
  • 단점

    • 메모리를 많이 사용함
    • 생성, 전환, 통신 비용이 큼
    • 프로세스 간 통신은 IPC가 필요해 오버헤드가 큼

스레드의 장단점

  • 장점

    • 자원을 공유하므로 메모리 사용량이 적음
    • 생성, 전환, 통신 비용이 작음
    • 같은 프로세스 안에서 협력 작업이 쉬움
  • 단점

    • 자원을 공유하므로 한 부분의 문제가 전체에 영향을 줄 수 있음
    • 공유 데이터 때문에 동기화 문제가 생길 수 있음

댓글

댓글을 불러오는 중...