멀티 쓰레드

박영준·2023년 8월 18일
0

OS (운영체제)

목록 보기
5/6

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

1. 정의

  • 하나의 Process 안에 여러 개의 Thread 가 있는 것
    • 따라서 하나의 프로그램에서 두 가지 이상의 동작을 동시에 처리하도록 하는 행위가 가능해진다.

멀티 쓰레드는 '한 어플리케이션에 대한 처리방식' 이라고 보면 된다.
단순히 프로그램을 여러개 띄워놓는 것이 아니라, 언제 어느때에 어떤 방식으로 처리하느냐에 따라 다른 것으로 이해해야 한다.

2. 구조

멀티 Thread 덕분에, User 가 서버 DB 에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있게 된다.

멀티 프로세스는 웹 브라우저에서의 여러 탭이나 여러 창이고,
멀티 쓰레드는 웹 브라우저의 단일 탭 또는 창 내에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하고 처리하는데 사용된다.

3. 장단점

1) 장점

멀티 Process 보다 멀티 Thread 로 프로그램을 돌리는 것이 유리한 이유는 Thread 자체의 장점이기도 하다.

(1) Thread 는 Process 보다 가벼움

  • Thread 는 Process 보다 용량이 가볍다.

    • Thread 는 Process 내에서 생성돼서, Thread의 실행 환경을 설정하는 작업이 매우 간단하기 때문에 생성/종료가 빠르다.
  • CODE, DATA, STACK 영역을 제외한 나머지 자원을 서로 공유하기 때문에, 기본적으로 내장되어 있는 데이터 용량이 Process 보다 작다.

    • 따라서, Thread 생성/제거할 때, Process 내부의 자원만을 관리하면 되기 때문에, 프로세스 생성/제거 보다 훨씬 빠르다.

(2) 자원의 효율성

  • 하나의 Process 내에서 여러 개의 Thread 가 생성되기 때문에, 공유 메모리(Heap 영역과 같은)에 대해 Thread 간에 자원을 공유가 가능하다.
    • 이를 통해, 프로세스 간 통신 (IPC)을 사용하지 않고도 데이터를 공유할 수 있어서, 자원의 효율적인 활용하므로 시스템 자원 소모가 감소.

(3) Context Switching 비용 감소

  • Thread에도 Context Switching Overhead 가 존재하지만
    상대적으로 Process Context Switching Overhead 보다 훨씬 낮아, 비용이 낮다는 장점이 있다.
    • 스위칭할 때 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만을 교체하면 되므로, 프로세스 컨텍스트 스위칭 비용보다 상대적으로 낮은 것

(4) 응답 시간 단축

  • (멀티 Process 에 비해) 멀티 Thread 는 가볍고, 하나의 Process 내에서 여러 개의 Thread 가 요청을 처리하여 overhead 가 감소한다.
    따라서, 응답 시간이 빠르다.

2) 단점

(1) 안정성 문제

  • (각 Process 가 독립적으로 동작하는 멀티 Process 와는 달리)
    멀티 Thread 는 하나의 Thread에서 문제가 발생하면, 다른 Thread들도 영향을 받아 전체 프로그램이 종료될 수 있다.

(2) 동기화로 인한 성능 저하

  • 여러 개의 Thread가 공유 자원에 동시에 접근할 수 있기 때문에, 동기화 문제가 발생할 수 있다.

    • 예시로, 여러 Thread가 동시에 한 자원을 변경해 버린다면, 의도되지 않은 값을 읽어 서비스에 치명적인 버그가 생길 수도 있다.
    • 이를 해결하기 위해서 'Thread 간 동기화(syncronized)' 기술이 필요!
  • Thread 간 동기화(syncronized)

    • 여러 Thread들이 자원에 대한 접근을 순차적으로 통제하는 것
    • 그러나, 여러 Thread들을 제한하게 되므로, 병목 현상으로 인해 성능이 저하될 수도 있다.
      (병목 현상 : 한번에 많은 데이터를 내보낼 때, 메모리가 이를 제대로 처리하지 못하는 현상)

    임계 영역(Critical Section)에 대하여 뮤텍스(mutex), 또는 세마포어(Semaphore) 방식으로 해결 가능!

(3) 데드락 (교착 상태)

스레드 1 은 자원 A을 점유하고 있는 상태이나, 자원 B 도 필요한 상황
스레드 2 는 자원 B를 점유하고 있는 상태이나. 자원 A 도 필요한 상황

그러나,
스레드 1 은 자원 B 가 필요한 상황에서 자원 A 을 빌려줄 수 없고
스레드 2 는 자원 A 이 필요한 상황에서 자원 B 를 빌려줄 수 없다.

즉, 다수의 Thread가 같은 lock을 동시에 다른 명령에 의해 획득하려 할 때, 서로 절대 불가능한 일을 계속적으로 기다리는 상황

  • Deadlock 이란?

    • 다수의 Process나 Thread가 서로 자원을 점유하고, 다른 Process나 Thread가 점유한 자원을 기다리는 상황에서 발생하는 교착 상태
      여러 개의 Thread가 서로 대기하면서 무한정 기다리게 되는 무한 루프와 같은 증상

    상호배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 순환 대기(Circular Wait) 등의 알고리즘으로 방지 가능!

(4) Context Switching Overhead

(프로세스에 비해) Thread 의 Context Switching Overhead 이 작긴하나,
그럼에도 Thread 수가 많아질수록 Context Switching Overhead 또한 많이 발생하게 된다.

즉, 단순히 Thread 가 많다고 해서 성능이 향상하는 것만은 아니라는 것이다.

(5) 디버깅이 어려움

여러 개의 Thread가 동시에 실행되기 때문에, 각 Thread의 동작을 추적하기 어려울 수 있다.


참고: 멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리

profile
개발자로 거듭나기!

0개의 댓글