본문 바로가기

[병행성 #1] 개요, 쓰레드 vs 프로세스 본문

Fundamentals/OS

[병행성 #1] 개요, 쓰레드 vs 프로세스

SJ_Repsect 2025. 7. 4. 17:07

쓰레드 vs 프로세스

  • 쓰레드는 어디서 명령어들을 불러 들일지 추적하는 프로그램 카운터(PC) 와 연산을 위한 레지스터들을 가지고있다.
  • 두 개의 쓰레드가 하나의 프로세서에서 실행 중이라면 실행하고자 하는 쓰레드 (T2) 는 반드시 문맥 교환(context switch)을 통해서 실행 중인 쓰레드 (T1) 와 교체되어야 한다.
  • 쓰레드 간의 문맥 교환은 T1이 사용하던 레지스터들을 저장하고 T2가 사용하던 레지스터의 내용으로 복원한다
  • 프로세스가 문맥 교환할 때 프로세스의 상태를 프로세스 제어 블럭 (PCB)에 저장하듯이, 쓰레드들의 상태를 저장하는 TCB가 필요하다.
  • 쓰레드는 프로세스와 달리 쓰레드 간의 문맥 교환에서는 주소 공간을 그대로 사용한다. 사용하고있던 페이지 테이블을 그대로 사용한다.

  • 쓰레드와 프로세스의 큰 차이 점은 스택공간이다.
    • 고전적으로 단일 쓰레드 프로세스에서는 스택이 하나만 존재한다.
    • 주소 공간의 하부에 위치한다.
  • 반면 멀티 쓰레드 프로세스는 각 쓰레드가 독립적으로 실행되며 쓰레드를 실행하기 위해 여러 루틴들을 호출할 수 있다. 주소 공간에는 하나의 스택이 아니라 쓰레드 마다 스택이 할당되어 있다.

쓰레드 문제점

실행 순서

  • 쓰레드에서 유의할 점은 실행 순서가 있는 것이 아니다.
  • T1이 T2보다 먼저 생성된 경우라 하더라도 스케줄러에 따라 T2가 먼저 실행될 수도 T1이 먼저 실행될 수도 있다.

데이터 공유

mov 0x8049a1c , %eax
add $0x1 , %eax
mov %eax , 0x8049a1c
  • 단일 프로세스로 공유 변수 +1씩 올리는 카운터 프로그램을 멀티 쓰레드로 돌려보면 정확하지 않다.
  • 다음의 세 개의 명령어가 원자적으로 실행되기를 원한다. 마치 하나의 명령어 처럼
  • 하지만 일반적인 상황에서는 그러한 명령어가 없다고 봐야한다.
  • 왜냐하면 인터럽트가 이상적인 흐름을 방해한다. 쓰레드입장에서 주소공간을 레지스터에 옮기고, 더하는 연산을 하고, 원래 메모리 주소에 다시 저장하는 3단계 과정을 거치게 된다. 하지만 3가지 과정을 진행 하더라도 스케줄러가 타이머 인터럽트로 실행중인 쓰레드의 레지스터 등을 TCB에 저장하고 다른 쓰레드가 해당 주소에 값을 또 접근하기 때문이다.
  • 명령어의 실행 순서에 따라 결과가 달라지는 상황을 경쟁 조건 (race condition) 이라 부른다.
  • 이러한 경쟁 조건이 발생하는 코드 부분으 임계 영역 (ciritical section) 이라 부른다,
  • 이러한 코드에서 필요한 것은 상호 배제(mutual exclousion) 이다

상태 기다리기

  • 하나의 쓰레드가 다른 쓰레드의 동작을 끝날 때 까지 대기해야하는 상황도 빈번히 발생한다.
  • 프로세스가 디스크 I/O를 요청하고 응답이 올 때까지 잠든 경우
Comments