본문 바로가기
CS/운영체제

10. 스레드 (Thread)

by D.O.T 2024. 4. 21.
쓰레드는 왜 사용할까?

 

스레드를 사용하게 된 배경도 있을 것이다. 이유는 프로세스의 문제점 때문이다.

  • 프로세스에서 컨텍스트 스위칭이 발생할 경우, 프로세스 생성에 너무 많은 오버헤드가 발생한다
    • 프로세스 생성시 PCB 생성, 메모리 할당, 부모 프로세스 내용 복사 등 많은 작업을 해야한다.
    • 그 외에도 뒤에 나올 페이지 테이블 참조, 캐시 업데이트 등 많은 부분에서 문제점이 발생
  • 프로세스 간의 통신이 어렵다.
    • 프로세스는 독립적인 공간을 갖고 있으므로 서로 침범할 수 없어서 통신이 힘들다는 점.
    • 프로세스 간 통신을 위해 메모리 맵, 파이프, 소켓 등 다양한 방식을 사용했다.

프로세스는 입력을 독점하는 ForeGorund Process와 각종 처리를 하는 BackGround Process가 존재한다.

그 외에도 CPU 처리만 집중하는 CPU 집중 프로세스 Interrupt를 다루는 I/O 집중 프로세스도 존재한다.

위와 같이 역할이 나누어져있는 프로세스가 존재할 때, Foreground 에 대해 Background가 처리하고 싶어도 Foreground 프로세스의 메모리에 접근을 할 수 없다. 그래서 다양한 프로세스 통신 방식을 사용했는데 시간이 너무 오래 걸린다는 단점이 있었다.

 

위와같은 문제로 스레드라는 개념을 생각하게 되었다.

어차피 프로세스를 처리하기 위해 fork() 와 같은 프로세스 생성 System Call을 통해 작업을 처리했는데, 빠른 처리를 위해서 Foreground와 Background에서 접근하려고 하는데 둘은 독립된 공간에 있다. 만약 프로세스를 하나의 공유 공간으로 두고 작업을 처리하는 다른 개념이 있으면 어떨까? 그게 스레드다.

 

즉, 프로세스와 스레드의 관계를 아래와 같이 정의한다.

1. 프로세스는 자원 소유자의 단위가 된다 (Container)

프로세스는 PCB 정보와, 메모리 영역, I/O 등 장치에 대한 제어권이 필요하다.

2. 스레드는 실행 단위가 된다.

스레드는 프로세스보다 더 작은 실행 단위가 되어 오버헤드를 감소 시켜 빠른 컨텍스트 스위칭을 한다.

이 방법은 프로세스의 복잡한 통신, 실행 속도를 개선한다.

 

다중 스레드 (Multi Threading)

 

스레드를 생성하게 되면 foreground thread로 사용자 입력에 대한 처리를 하고 프로세스 내 공유 공간을 통해 background에서 정보를 업데이트 하도록 한다. 즉, Asynchronous로 작업을 처리할 수 있는 것이다. 이 떄, 다른 프로세스를 생성할 필요가 없으니 수행시간이나 복잡도가 많이 단축된다. 그 외에도 실행속도 측면이나 모듈 프로그램을 구성하는 경우에서 많이 사용되는데 이렇게 하나의 프로세스에 여러개의 프로세스가 있는 것을 다중 스레드라고 한다.

 

멀티 스레드에서는 Concurrency와 parallelism이 발생한다.

이 것은 이점일 수도 있고 단점일 수도 있다.

 

Concurrency(동시성)은 1개의 CPU에서 2개의 이상의 스레드가 동시에 실행중인 상태이다.

Time Slice에 따라 여러 스레드를 처리할 수 있어서 작업 처리속도가 매우빨라지는 장점이 있고 Idle 타임이 거의 줄어드는 장점이 있다. 반면에 스레드1에서 처리가 다 끝나지 않고 interrupt 또는 time slice 초과로 스레드2를 처리하게 되는 상황이 발생한다고 생각해보자. 스레드1과 스레드2가 둘 다 A라는 자원을 사용하게 되었을 때, 문제가 발생한다.

 

예시로 A에 1000만원이 있고 스레드 1에서 700만원, 스레드 2에서 500만원을 가져간다고 해보자. A는 한 번에 100만원씩만 출금할 수 있도록 설계되었다.

정상적인 상황이라면 스레드1에서 700만원, 스레드2에서 300만원만 가져가거나 잔액이 부족하다는 안내를 받아야 한다.

하지만 멀티스레딩 환경에서는 스레드1에서 100만원, 스레드2에서 100만원씩 가져가면서 각 각 500만원씩 가져가게 된다. 이러면 스레드1은 먼저 실행되었음에도 불구하고 500만원밖에 챙기지 못한다.

 

Parallelism(병렬성)은 2개 이상의 스레드가 다른 CPU에서 같은 시간에 동시에 실행되는 것이다.

이것 또한, 동시성과 마찬가지의 장점과 단점이 발생한다.

이런 문제점을 동기화 문제라고 하는데 이후에 다룰 내용이다.

 

정리

 

  • 스레드는 실행 및 스케줄링 단위이다.
    • 개발자에게는 작업 단위가 된다.
    • OS에서는 실행단위, CPU에서는 스케줄링 단위가 된다.
    • Process의 코드, 데이터, 힙, 스택 영역을 공유 받아 직접 저장하고 있는 실체이다.
    • Thread 마다 TCB(Thread Control Block)이 생성된다.
  • 프로세스는 컨테이너 단위가 되었다.
    • 실행이 되려면 반드시 1개 이상의 스레드가 존재해야한다.
    • 프로세스가 생성될 때, 자동으로 1개의 main 스레드는 생성된다.
    • 모든 스레드는 프로세스의 공간을 나누어서 사용한다.
    • 스레드 간 프로세스의 공유 공간으로 통신한다.
  • 스레드는 함수로 작성한다.
    • Process는 목적 프로그램이었지만 스레드는 코드이다.
    • 운영체제에 스레드 생성이 요청되면 함수 주소를 스레드 시작주소로 TCB에 등록한다.
    • TCB List가 생성되어 스레드 단위로 스케줄하며 스레드를 관리한다.
  • 스레드는 프로세스의 생명을 공유한다.
    • 프로세스가 종료되면 스레드가 종료된다.
    • 스레드가 종료되면 TCB 등 관련 정보가 모두 제거 된다.
    • 스레드 함수가 종료되어도 스레드는 종료된다.