[CS] 프로세스와 스레드

눈치없어·2025년 5월 7일

프로세스(process): 실행 중인 프로그램을 말하며, CPU 스케줄링의 대상

  • 실행 파일(exe 등)이 메모리에 올라가면 인스턴스화되어 프로세스가 됨
  • 하나의 프로그램은 여러 개의 스레드(thread)를 포함할 수 있음 → 스레드는 프로세스 내 작업 흐름

프로세스와 컴파일 과정

소스 코드 (.c)[전처리기]
전처리된 코드
  ↓ [컴파일러]
어셈블리 코드 (.s)[어셈블러]
목적 코드 (.o)[링커]
실행 파일 (.exe / .out)

1️⃣ 전처리 (Preprocessing)

  • #include, #define 등 매크로 치환
  • 주석 제거, 헤더 파일 포함 등

2️⃣ 컴파일 (Compiling)

  • 오류 검사, 최적화
  • 어셈블리어(저수준 코드)로 변환

3️⃣ 어셈블 (Assembling)

  • 어셈블리 코드를 기계어 목적 코드(.o)로 변환

4️⃣ 링킹 (Linking)

  • 여러 목적 코드 + 라이브러리 결합
  • 최종 실행 파일(.exe, .out) 생성

라이브러리 종류

종류설명장점단점
정적 라이브러리 (Static)빌드 시 코드에 포함됨 (.lib / .a)독립성 높음실행 파일 커짐, 메모리 낭비
동적 라이브러리 (Dynamic)실행 중 필요한 부분만 참조 (.dll / .so)메모리 효율성 높음외부 환경 의존도 높음


프로세스의 상태

[생성] → [대기] → [실행] → [종료]
           ↓         ↑
     [대기 중단]   [중단/일시중단]

1️⃣ 생성 상태 (Created)

  • 프로세스가 막 생성된 상태
  • fork( ): 부모 프로세스를 복사해 자식 프로세스를 생성
  • exec( ): 새로운 프로그램으로 프로세스를 덮어씀
  • PCB(Process Control Block) 생성됨

2️⃣ 대기 상태 (Ready)

  • CPU 할당을 기다리는 상태 (메모리 할당 O)

3️⃣ 대기 중단 상태 (Ready Suspended)

  • 메모리 부족 등으로 메모리에서 쫓겨나 일시 보류된 상태

4️⃣ 실행 상태 (Running)

  • CPU를 할당받아 명령어 수행 중인 상태
  • CPU burst 발생: CPU 집중 작업 구간

5️⃣ 중단 상태 (Blocked)

  • 입출력(I/O) 등 외부 이벤트를 기다리는 상태
  • 예시: 프린터 작업 중 I/O 대기

6️⃣ 일시 중단 상태 (Blocked Suspended)

  • 중단 상태였던 프로세스가 메모리 부족 등으로 디스크로 밀려남

7️⃣ 종료 상태 (Terminated)

  • 모든 작업 종료 후 자원 해제
  • 비자발적 종료(abort)도 포함됨 (부모 종료, 자원 초과, kill 명령 등)


프로세스의 메모리 구조

메모리 영역특징할당 시점저장되는 데이터 예시
Stack함수 호출 시 자동 생성/해제런타임(동적)지역 변수, 매개변수, 함수 호출 정보 등
Heap프로그래머가 직접 할당/해제런타임(동적)malloc(), new로 생성한 객체 등
BSS Segment초기값 없는 전역/정적 변수컴파일 시(정적)static int x;, int a;
Data Segment초기값 있는 전역/정적 변수컴파일 시(정적)int a = 5;, static int b = 1;
Code Segment실행 코드 (기계어 명령어 등)컴파일 시(정적)함수, if문, 반복문 등의 실행 코드

  • 스택(stack)
    - 함수 호출마다 스택 프레임 생성
    - 재귀 호출 시 독립적인 공간 제공
    - 후입선출(LIFO) 방식
  • (heap)
    - 동적 자료구조(vector, map, tree 등)
    - 직접 malloc/free, new/delete로 메모리 제어
    - 메모리 누수 가능성 있음
  • BSS 영역
    - 초기화되지 않은 정적/전역 변수 저장
    - 프로그램 시작 시 0으로 자동 초기화됨
  • Data 영역
    - 초기값 있는 정적/전역 변수 저장
  • Code 영역
    - CPU가 실행할 명령어 코드 저장
    - 보통 읽기 전용으로 설정됨 (보안상 이유)


PCB

PCB(Process Control Block): 운영체제가 프로세스를 관리하기 위해 생성하는 구조체

  • 프로세스의 상태, 자원 정보, 실행 흐름 등 메타데이터를 담고 있음
  • 사용자 접근 불가, 커널 영역에서만 접근 가능

메타데이터
데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터
대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터


항목설명
프로세스 상태Ready, Running, Blocked 등 현재 상태
프로세스 ID고유한 PID, 부모/자식 PID
권한 정보파일 접근 권한, 사용자 정보
프로그램 카운터다음 실행 명령어 주소
레지스터 정보CPU 수행 중 저장된 값들
스케줄링 정보우선순위, 스케줄링 알고리즘 관련 데이터
계정 정보누적 CPU 사용 시간, 실행자 정보
I/O 상태열린 파일, 할당된 I/O 장치 목록

컨텍스트 스위칭

  • 현재 실행 중인 프로세스의 PCB 저장
  • 다른 프로세스의 PCB 불러오기 → CPU에 할당
  • 단일 CPU 코어에서 다중 프로세스를 동시 실행처럼 보이게 함
  • 비용(Cost)
    - 캐시 미스 발생 → 주소 공간이 달라 캐시 무효화
    - 레지스터 저장/복원 비용
    - 유휴 시간 (idle time) → 스위칭 중 CPU는 대기 상태

  • 스레드 vs 프로세스

비교 항목프로세스 컨텍스트 스위칭스레드 컨텍스트 스위칭
메모리 공유X (독립된 주소 공간)O (스택만 별도, 나머지 공유)
전환 비용높음낮음
사용 목적독립 실행 단위경량 실행 단위 (병렬 처리 등)


멀티프로세싱

  • 여러 개의 프로세스를 동시에 실행하는 구조
  • 각 프로세스는 독립된 메모리 공간 사용
  • 특정 프로세스에 문제가 생겨도 다른 프로세스에 영향 X → 안정성↑
  • 병렬 처리 가능, 특히 멀티코어 CPU 환경에서 성능 향상

예: 크롬 브라우저
브라우저 프로세스: UI, 주소창 등
렌더러 프로세스: 웹 콘텐츠 처리
GPU 프로세스: 화면 렌더링
플러그인 프로세스: Flash 등


IPC

프로세스 간 데이터를 주고받기 위한 통신 방식

방식특징장점제한점
공유 메모리여러 프로세스가 하나의 메모리 블록 공유빠름, 복사 없음동기화 필수 (Race condition 위험)
파일파일 기반 데이터 공유구조 단순디스크 입출력 → 느림
소켓네트워크 기반 통신 (TCP/UDP)원격 프로세스와도 통신 가능네트워크 프로그래밍 지식 필요
익명 파이프부모-자식 간 단방향 통신간단관계 있는 프로세스만 가능
명명된 파이프이름 있는 파이프, 양방향도 가능다중 클라이언트 지원속도 느림, OS 의존성
메시지 큐커널에서 큐 구조로 메시지 전송비동기, 구조 명확커널 리소스 사용 → 크기 제한


스레드와 멀티스레딩


스레드

  • 프로세스 내 실행 단위
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
  • 코드, 데이터, 힙은 공유, 스택은 개별 할당


📌 스레드 구조 (vs 프로세스)

항목프로세스스레드
독립성서로 독립하나의 프로세스 내에서 동작
메모리코드, 데이터, 힙, 스택 모두 독립코드, 데이터, 힙 공유 / 스택만 분리
통신 방식IPC 필요공유 메모리 통해 쉽게 통신
생성 비용높음낮음
하나가 죽으면?영향 없음다른 스레드도 영향을 받음

멀티스레딩

  • 하나의 프로세스에서 여러 작업(스레드)을 동시에 실행
  • 자원 공유로 오버헤드 감소, 응답성 증가, 동시성 처리 강화
  • 예: 웹 서버, 게임 엔진, GUI 프로그램

동시성: 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것


📌 멀티스레딩 장단점

  • 장점
    - 자원 공유 → 메모리 효율성 ↑
    - 컨텍스트 스위칭 비용 ↓ → 속도 향상
    - 하나의 스레드가 블록돼도 나머지 수행 가능 → 응답성 ↑
  • 단점
    - 공유 자원 충돌 발생 가능 → 동기화 필요
    - 하나의 스레드 오류 시 전체 프로세스 영향
    - 디버깅이 어려움


공유 자원과 임계 영역

공유 자원

  • 여러 프로세스나 스레드가 동시에 접근할 수 있는 자원 (예: 파일, 메모리, 변수 등)
  • 동시 접근 시 경쟁 상태(Race Condition) 발생 가능
  • 예시: 하나의 변수에 동시에 쓰기 작업이 일어날 경우, 의도치 않은 결과 발생

임계 영역

  • 공유 자원에 접근하는 코드 영역
  • 이 영역은 동시에 하나의 스레드 또는 프로세스만 접근해야 함
  • 해결을 위해 상호 배제(Mutual Exclusion) 필요

📌 임계 영역 해결 조건

상호 배제: 한 번에 하나만 접근 가능
한정 대기: 무한히 기다리는 스레드 없어야 함
진행: 임계 영역을 사용 중이 아니면 대기 중인 프로세스가 진입할 수 있어야 함


임계 영역 해결 메커니즘

1️⃣ 뮤텍스 (Mutex)

  • lock()으로 잠그고, unlock()으로 해제
  • 오직 1개 스레드만 진입 가능
  • 0 또는 1 상태 (이진적)
  • 간단하지만, 데드락 주의

2️⃣ 세마포어 (Semaphore)

  • 정수 값을 가지며 wait(P), signal(V) 함수로 접근 제어
  • 1 이상의 자원 관리 가능 (카운팅 세마포어)
  • 이진 세마포어는 뮤텍스와 유사
종류특징
바이너리 세마포어0 또는 1만 가짐 (뮤텍스와 유사)
카운팅 세마포어여러 개의 자원에 대한 접근 제어

3️⃣ 모니터 (Monitor)

  • 공유 자원에 대한 접근을 자동으로 상호 배제
  • 내부에 큐(모니터 큐) 를 두고 요청 순서대로 처리
  • 세마포어보다 구현 쉽고 안정적
  • 대부분의 고급 언어에서 synchronized, lock 키워드로 지원

뮤텍스와 세마포어는 데드락(Deadlock) 발생 위험이 있음
→ 자원 순서 설정, 타임아웃 전략 등으로 방지 가능



교착 상태

두 개 이상의 프로세스가 서로의 자원을 기다리며 영원히 블로킹된 상태


발생 조건

조건설명
상호 배제 (Mutual Exclusion)자원은 한 번에 하나의 프로세스만 사용 가능
점유 대기 (Hold and Wait)자원을 점유한 채로 다른 자원을 기다림
비선점 (No Preemption)자원을 강제로 회수할 수 없음
환형 대기 (Circular Wait)각 프로세스가 다음 자원을 기다리는 원형 대기 상태

교착 상태의 해결 방법

1️⃣ 예방 (Prevention)
교착 상태 발생 조건 자체를 없앰
→ ex) 자원 점유 전에 모든 자원 요청하게 함 (→ 점유 대기 방지)

2️⃣ 회피 (Avoidance)
교착 상태 발생 가능성 있는 상황을 회피
대표 알고리즘: 은행원 알고리즘 (Banker’s Algorithm)
→ 안정 상태일 때만 자원 할당
→ 각 프로세스가 요구할 수 있는 최대 자원량을 기준으로 판단

3️⃣ 탐지 및 복구 (Detection & Recovery)
교착 상태가 이미 발생한 후 감지하여 해결
→ 사이클 감지: 자원 할당 그래프에서 사이클 여부 탐색
→ 복구 방법: 프로세스 강제 종료, 자원 회수 등

4️⃣ 무시 (Ignore)
현대 운영체제가 실제 사용하는 방식
교착 상태는 드물기 때문에, 그냥 두고 사용자에게 종료 권유
→ ex) “응답 없음”, “강제 종료하시겠습니까?”




참고: 북스터디 - 면접을 위한 CS 전공지식 노트 (Chapter 3-3)

profile
dock 사이즈 다르잖아

0개의 댓글