쓰레드 (Thread)

박영준·2023년 6월 21일
0

OS (운영체제)

목록 보기
2/6

프로세스 vs 쓰레드 는 개발자 면접에서 자주 나오는 질문 중의 하나!

1. 등장 배경

과거에는 프로그램을 실행할 때 Process 하나만을 사용했다.

  • 컴퓨터가 파일 다운 중이라면, 다른 일을 할 수가 없었다.
  • 동일한 프로그램을 여러 개의 Process 로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다.

이러한 Process 의 한계 때문에, Thread 가 탄생했다.

  • 이 덕에 오늘날의 컴퓨터는 멀티 작업이 가능해졌다.

2. 정의

  • 하나의 Process 내에서 동시에 진행되는 작업 갈래, 작업의 단위, 흐름의 단위

  • 예시

    • 크롬 브라우저를 실행한다 -> Process 1개 생성
    • 크롬 브라우저에서 온라인 쇼핑을 한다 -> Process 내부에 스레드 1개 생성
    • 크롬브라우저에서 온라인 쇼핑을 하면서 음악을 다운 받는다 -> Process 내부에 스레드 1개 추가 생성
  • Thread 수가 多수록, Program 성능 향상(속도도 증가)

    • 동시에 작업할 수 있는 Thread 들이 많아지기 때문
  • 1개의 Program 은 1개 이상의 Process 를 가진다.

    • 1개의 Process 는 반드시 1개 이상의 Thread 를 가진다.
      (Process 를 생성하면, 기본적으로 1개의 main Thread 가 생성된다)

3. 자원 공유

1) 정의

  • Process 의 4가지 메모리 영역(Code, Data, Heap, Stack) 中
    Thread 는 Stack 만 할당받아 복사하고,
    Code, Data, Heap 은 Process 내의 다른 Thread 들과 공유된다.

    따라서 각각의 Thread 는 별도의 Stack 을 가지고 있지만 Heap 메모리는 고유하기 때문에,
    서로 다른 Thread 에서 가져와서 읽고 쓸 수 있게 된다.

  • Stack 은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등... 을 저장하는 메모리 공간이다.

    • "독립적인 Stack 을 가졌다" 는 것은 "독립적인 함수 호출이 가능하다" 라는 의미
    • "독립적인 함수 호출이 가능하다" 는 것은 "독립적인 실행 흐름이 추가된다" 는 의미
    • 따라서, Stack 을 가짐으로써 Thread 는 독립적인 실행 흐름을 가질 수 있게 되는 것이다.
  • 단, Process 내에서 공유된 자원(메모리)를 사용하기 때문에, 병렬 실행할 경우 상호작용이 필요

2) 메모리 공유 이유?

Thread 의 정의를 보면, '작업의 단위' 이다.
이는 'CPU 의 입장에서의 최소 작업 단위'를 의미한다.

그러나, OS 관점에서는 Process가 최소 작업 단위이다.
Os 는 이렇게 작은 단위(스레드의 "흐름의 단위")까지 직접 작업하지 않기 때문이다.

따라서, Os 관점에서 최소 작업 단위가 되기 위해서는 Thread 간의 메모리를 공유를 통해 최소 작업단위가 되어야 할 필요가 있다.

4. Thread 스케줄링 (Scheduling)

1) 정의

  • 스레드 스케줄링(Thread Scheduling) 이란?

    • OS 에서 다중 Thread 를 관리하며, CPU 를 사용할 수 있는 Thread 를 선택하고, CPU 를 할당하는 작업
  • Thread 의 우선순위, 실행 시간, 입출력 요청 등...의 정보를 고려하여
    CPU를 사용할 수 있는 Thread를 선택하는, 스레드 스케줄링 알고리즘은 프로세스 스케줄링 알고리즘과 유사하게 동작한다.

  • 스케줄링은 다양한 알고리즘 방식으로 동작된다.
    (알고리즘 종류 : Round Robin, Priority-based scheduling, Multi-level Queue scheduling 등...)

  • 단, (Process 스케줄링과 달리) 하나의 Process 내에서 다수의 Thread가 동작하는 형태이기 때문에,
    Thread 간의 '상호작용'과 '동기화' 문제를 고려해야 한다는 차이점이 존재한다.

2) Thread 상태

(1) 구성

NEW

  • 스레드가 생성되고 아직 호출되지 않은 상태

RUNNABLE

  • 스레드가 실행되기 위해 기다리는 상태
  • CPU를 할당받을 수 있는 상태이며, 언제든지 실행될 준비가 되어있다.

BLOCKED

  • 스레드가 특정 이벤트(입출력 요청 등)가 발생하여 대기하는 상태
  • CPU를 할당받지 못하며, 이벤트가 발생하여 다시 RUNNABLE 상태로 전환될 때까지 대기한다.

TERMINATED

  • 스레드가 실행을 완료하고 종료된 상태
  • 더 이상 실행될 수 없으며, 메모리에서 제거된다.

(2) Thread 상태 전이

3) Thread Context Switching

(1) 정의

  • 멀티 스레딩 환경에서 스레드 간의 실행을 전환하는 기술

  • (프로세스 컨텍스트 스위칭과 달리) 하나의 Process 내의 Thread들을 교환

(2) TCB (Thread Control Block)

① 정의

  • (PCB 처럼) TCB(스레드 제어 블록)는 각 스레드마다 운영 체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조

    • (Process 내에 Thread 가 위치한 것 처럼) PCB 안에 TCB 가 들어있다
  • Thread의 상태 정보, Thread ID, Thread 우선순위, 스케줄링 정보 등 다양한 정보를 저장

  • Thread가 생성될 때 OS 에 의해 생성되며, 스레드가 실행을 마치고 소멸될 때 함께 소멸된다.

  • Thread 간의 자원 공유와 동기화도 TCB를 사용하여 관리된다.


참고: 완전히 정복하는 프로세스 vs 스레드 개념

profile
개발자로 거듭나기!

0개의 댓글