ASHD Dev_Blog

3.3 프로스세와 스레드 [OS-study]

이재룡
이재룡Jul 2, 2025

[ 1. 프로세스 컴파일 ]

  • 프로그램(Program)

    ⇒ HDD/SDD 등의 디스크에 존재하는 실행 가능한 파일 (코드)

  • 프로세스(Process)
    = CPU 스케쥴링의 대상 = Task

    메모리로 프로그램을 가져와 실행 중인 상태

컴파일 : 고수준언어(친-인간)를 저수준언어(친-기계)로 변환 하는 작업

  1. 전처리 과정 (Pre-processing)
    • 주석 제거
    • 헤더 병합
  1. 컴파일 과정 (Compliation) : 전처리된 소스코드를 어셈블리어로 바꾸는 과정
    • 언어의 문법 검사
    • Static 영역의 메모리 할당
  1. 어셈블리 과정 (Assembly) : 어셈블리 코드를 오브젝트 파일(순수 기계어)로 변경
  1. 링킹 과정 (Linking) : 현재 코드의 오브젝트 파일과, 필요한 라이브러리 파일을 링크 하여 최종 실행 파일 생성

[ 2. 프로세스 상태 ]

  1. 활동 상태 (Create → Ready → Running or Blocked → Terminated)
    • Created (생성) : PCB가 만들어져 프로세스가 만들어진 상태 (exec or fork[상속])
      • → Ready : 메모리 공간을 검사 및 공간 할당
      • → Suspended Ready : 공간이 없으면 보류 준비
    • Ready (준비) → 책에서는 대기

      CPU만 할당 되면 바로 실행

      • → Running (Dispatch) : CPU를 할당 받고 실행
      • → Suspended Ready : CPU가 할당되지 못해 주어진 메모리를 뺏긴 상태
    • Running (실행) : CPU를 할당 받아 실행 중인 상태
      • → Ready (Timeout) : 시간 할당량을 소진하여 CPU를 뺏긴 상태
      • → Blocked : 입출력 처리가 필요해 호출 하고 결과를 기다리는 상태
        • CPU는 바로 다음 준비 상태 프로세스 실행
    • Blocked (대기) → 책에서는 중단

      입출력 처리, 자원 요구 등으로 인해 CPU를 양도하고 대기

      • → Ready : 조건이 충족되어 CPU 할당을 기다리는 상태
      • → Suspended Blocked : 메모리를 뺏겨 보류 대기
    • Terminated (종료)
      • 모든 자원이 회수 및 PCB 삭제

중단 상태 (Suspended Ready & Suspended Block)

  • Suspended Ready : 바로 메모리를 받지 못할 때
    • 준비 또는 실행 상태에서 메모리를 잃게 될 때
  • Suspended Blocked : 대기 상태일 때 메모리 공간을 잃은 상태
    • 입출력을 대기 할 때
    • 필요한 자원을 기다릴 때

👉
Suspended Ready와 Suspended Blocked 모두 현재 메모리를 반납한 Swap-out 상태이지만,
→ Suspended Ready는
메모리 할당
→ Suspended Blocked는
필요한 작업 + 메모리 할당을 모두 완료 해야 복구

[ 3. 메모리 할당 및 PCB ]

동적 영역 : Stack & Heap (in Runtime)

정적 영역 : Data & Code (in Compile)

  • 데이터 영역 : BSS segment & Data segment
    👉
    데이터 영역은 둘 다 전역 변수, static, const 등을 저장하지만,

    → BSS에는 0 또는 초기화되지 않은 값을 static int x;, int y;

    → Data에는 0이 아닌 초기값이 있어야 저장 static int x = 10;
  • 코드 영역 : Code segment

PCB(Process Control Block) : 프로세스의 상태 정보를 저장하는 자료구조

  • 메타데이터 : 어떠한 정보를 설명하는 데이터 정보
    • 파일에서의 이름, 크기, 생성/수정 날짜 등…
    • PCB는 그 자체로 프로세스를 설명하는 메타 데이터 정보

컨텍스트 스위칭 (Context Swtiching)

⇒ 인터럽트나 시스템 호출 등으로 실행 중인 프로세스의 제어를 다른 프로세스에 넘겨주는 것

트리거

  • 주어진 Time Slice(Time Quantum)를 전부 소비
  • I/O 작업
  • 다른 리소스 대기
  • 인터럽트(Interrupt)

Dispatcher Latency (with cache miss)

⇒ P1에서 P2로 컨텍스트 스위칭이 발생할 때, P1 상태는 PCB1에 저장해야하고, P2의 상태를 PCB2에서 불러와야하기 때문에 발생하는 latency

[ 3. 멀티 프로세스 및 멀티 스레드 ]

멀티 프로세싱 : 프로세스의 병렬처리

  • IPC(Inter Process Communication) : 프로세스간 통신 메커니즘

    Process는 독립된 실행 객체이므로 서로 통신 하기 위해서는 다른 설비가 필요

    (for 데이터 통신 및 공유 데이터 관리)

    • 공유 메모리 : 메모리 접근 권한을 공유
    • 소켓 : 네트워크를 이용한 프로세스간 통신 데이터 (TCP/UDP)
    • Unnamed Pipe : Half-Duplex 반 이중 통신

      ⇒ 두 개의 프로세스를 연결하되 한쪽은 쓰기만, 한쪽은 읽기만 가능

      • 같은 PPID(부모)를 가지는 프로세스끼리만 통신 가능
    • Named Pipe : Half-Duplex 반 이중 통신

      ⇒ 서로 다른 모든 프로세스 사이에서의 통신이 가능하나, 단방형성

멀티 스레딩 : 프로세스 내 작업을 여러 스레드로

  • 스레드(Thread) : 프로세스의 가장 작은 실행 단위
    • 멀티 스레드들은 다른 모든 영역을 공유하되, Stack 영역은 각자 가짐
👉
결국 thread는 자원을 공유 → 경쟁 상태(Race Condition) 발생

  • 임계 영역 (Critical Section)

    ⇒ 둘 이상의 프로세스나, 스레드가 동시 접근 할 때, 실행 순서 등에 따라 결과가 바뀔 여지가 있는 영역

    • Mutex (Lock을 관리하는 객체) Lock/Unlock - 잠금 메커니즘
    • Semaphore (일반화된 Mutex) INT+Wait/signal (P/V) - 신호 메커니즘
      👉
      Mutex는 스레드에 Lock/Unlock 권한이 있음 : 본인이 들어가서 잠구고 작업이 끝나면 해제하는 방식
      Semaphore는
      메커니즘에 제한이 있음 : 정해진 인원 제한이 있고, 새 인원이 들어오기 전에 현재 몇 명이 들어 있는지를 확인, 제한 인원 보다 낮으면 출입 가능

심화 질문 1 : 아래와 같은 방식으로 wait/signal 함수를 작성할 경우 CPU가 계속해서 세마포어의 INT 값을 주기적으로 확인해주어야 하는 busy-waiting 방식으로 인한 낭비가 발생한다. 어떤 방식으로 구현해야, 낭비를 없앨 수 있을까?
wait(S) {
    while (S <=0 ); /* busy waiting*/
    S--;
}

signal(S) {
    S++;
}
javascript
struct semaphore {
    int value;
    Queue list;
};

wait(S):
    S->value--;
    if (S->value < 0) {
        add this process to S->list;
        sleep();
    }

signal(S):
    S->value++;
    if (S->value <= 0) {
        remove a process P from S->list;
        wakeup(P);
    }
javascript
  • 교착 상태 (DeadLock)

    둘 이상의 프로세스가 각자 자원을 점유했지만 작업을 위해서 해당 자원 모두가 필요해, 무한정 기다리는 상황

    • 상호 배제 : 한 프로세스의 자원 독점
    • 점유와 대기 : 점유한 자원을 다른 프로세스가 요청
    • 비선점 : 강제로 가져오기 불가
    • 순환대기 : 서로가 서로에게 자원 요청

    은행원 알고리즘 : DeadLock 회피 방법

    1. 자원을 일부 분배
    1. 남은 자원의 일부를 이용해서 가능성에 추가 분배
    1. 예시로 B에 1달러 부여
    1. B가 완료 → 은행에 5달러
    1. 남은 자원으로 C에 3달러 더 해서 총 6달러 부여 = 은행에 2달러

    1. 교착 상태 해결

    1. 3, 3, 3.5를 분배 = 은행에 0.5달러
    1. 0.5달러로는 어느 한 개의 프로세스도 만족 시킬 수 없음

      교착 상태

심화 질문 2 : 자원 A,B,C에 대한 프로세스 p1, p2, p3, p4에 대한 현재 상태가 아래 표와 같다. 은행원 알고리즘을 기반하여, 현재 상태에서 교착상태가 발생하지 않는 process 작업 순서 경로 1개를 구하시오 (실제로는 여러 개)
(Ex P1→P4→P3→P2)
  • Allocated : 각 프로세스가 현재 소유하고 있는 자원의 수
    Maximum : 프로세스가 정상 작동하기 위해 필요한 자원의 수
    Available : 시스템이 소유한 남은 자원 (A,B,C)의 각 수 : p1과는 무관
  • Tip1 : Maximum - Allocated > Available이면 은행이 줄 수 있는 자원으로 해당 프로세스를 작동시킬 수 없음 ⇒ Fail
  • Tip2 : 해당 프로세스가 완료되면 사용 완료된 자원이 모두 Available로 변한다.

https://baebalja.tistory.com/340

Tags