24.09.26

윤지현·2024년 9월 26일

TIL

목록 보기
68/75

1. 쓰레드의 모든 것

01. 쓰레드란?

프로그램에서 실행되는 작업의 최소 단위

02. 그럼 어떻게 동작하나?

API 호출을 Spring에 요청 -> 해당 요청을 쓰레드가 받아서 처리
쓰레드의 역할 - 요청을 받아서 처리해주는 역할

03. 성능이 좋은 서버란?

요청과 응답이 빠른 서버

  • 🤔 그렇다면 성능이 좋은 서버를 만들기 위해서 쓰레드를 어떻게 사용할까?

    하나의 쓰레드를 극한의 효율로 사용한다.
    쓰레드를 여러 개 만든다.

  • 1. 하나의 쓰레드를 극한의 효율로 사용한다!

    Node는 싱글 쓰레드 기반으로 동작을 한다.
    비동기 방식non-blocking을 통해서 사용

  • 2. 쓰레드를 여러개 만든다!

    Spring은 멀티 쓰레드 기반으로 동작
    동기 방식과 blocking을 통해서 사용

04. 싱글 쓰레드? 멀티 쓰레드 ?

  • node의 경우

    종업원이 한 명이고, 손님이 여러 명
    = 1번 손님 주문 받고나서 1번 손님 음식이 완료 될때까지 2번, 3번 손님 주문을 받다가 완료되면 음식 전달

  • spring의 경우

    여러 명의 종업원이고, 손님이 여러 명
    = 종업원이 주문을 받고 이제 음식이 완료될 때까지 계속 기다리다가 완료되면 전달

05. 동기? 비동기? blocking? , non-blocking?

  • 동기가 뭘까요?

    동기 방식에서는 작업이 순차적으로 진행
    즉, 하나의 작업이 끝나야 다음 작업이 시작

  • Blocking은 뭘까요?

    블로킹은 특정 작업이 완료될 때까지 현재 스레드의 실행을 멈추는 것을 의미
    블로킹 호출에서는 현재 작업이 완료될 때까지 프로그램의 다른 작업이나 이벤트가 실행되지 않습니다.

  • 동기와 Blocking

    동기는 작업 순서와 관련된 개념이고, 블로킹은 스레드의 상태와 관련된 개념
    모든 동기 작업이 블로킹 작업은 아니지만, 대부분의 동기 호출은 블로킹을 수반
    --- 이해하기 쉽게 ---
    동기는 작업의 순서에 관한 것
    블로킹은 자원의 사용 여부(특히 스레드의 사용 여부)에 관한 것

  • 비동기가 뭘까요?

    비동기 방식에서는 작업이 시작된 후, 해당 작업의 완료를 기다리지 않고 다음 작업을 즉시 수행

  • Non-Blocking은 뭘까요?

    논블로킹 방식에서는 작업을 수행하는 동안 해당 작업이 완료될 때까지 기다리지 않고, 즉시 제어권을 반환
    논블로킹 호출은 결과를 즉시 반환하거나 작업이 아직 완료되지 않았음을 나타냄

  • 비동기랑 Non-Blocking

    비동기: 작업 완료를 기다리지 않고, 완료 시점에 콜백이나 다른 메커니즘으로 결과를 처리.
    논블로킹: 호출이 즉시 반환되며, 작업이 완료되지 않아도 스레드나 자원이 차단되지 않음.
    --- 이해하기 쉽게 ---
    비동기는 작업의 비순차적 완료를 다루는 것
    논블로킹은 호출의 즉각적인 반환과 자원 차단의 방지를 다루는 것

06. Spring Boot에서 멀티 쓰레드를 관리하는 방법

  • 쓰레드 풀이 뭔가요?

    미리 우리가 사용할 쓰레드를 여러개 생성해서 저장해둔 개념

  • 왜 미리 생성해서 사용하나요? 필요할 때마다 사용하면 안되는건가요?

    쓰레드를 생성하고 제거하는 작업은 비용이 많이 든다.
    쓰레드를 생성할 때는 시스템 자원을 할당해야 하고, 제거할 때는 자원을 해제해야 한다.
    특히, 많은 쓰레드를 생성하고 제거하는 경우 성능 저하가 발생할 수 있다.

  • 쓰레드 풀은 어떻게 동작하는건가요? 재활용은 어떻게 하는거죠?

    쓰레드 풀은 일정 수의 쓰레드를 미리 생성하여 재사용
    새로운 작업이 들어오면, 기존의 쓰레드를 재사용하여 작업을 처리하고,
    작업이 끝나면 해당 쓰레드는 다시 풀로 반환
    이렇게 하면 쓰레드를 반복적으로 생성하고 제거하는 비용을 줄일 수 있다.

  • 그럼 만약에 쓰레드가 5개가 있는데 요청이 7개가 들어오면 어떻게 되나요?

    작업 큐에 들어온 요청을 담아두고 남는 쓰레드가 생기면
    큐에서 꺼내서 처리를 한다
    작업큐는 FIFO (first-in-first-out) 방식으로 동작

  • 결국에 작업 큐도 저장 할 수 있는 공간이 있는거잖아? 만약에 작업큐가 다 차면?

    작업큐에 더 이상 요청을 저장할 수 있는 공간이 없으면 !
    쓰레드 풀에 새로운 쓰레드가 추가된다!
    -- 🤔 만약 작업 큐가 꽉찬 상태에서 또 새로운 요청이 들어오면???

    이런 식으로 요청을 할 수 없다고 뜬다

  • 그럼 처음부터 쓰레드를 엄청 많이 만들어두면 되는거 아닌가요?


    쓰레드가 너무 많으면 작업을 처리할 메모리가 없어서 컴퓨터 속도가 느려질 수 있다.

profile
첫 시작

0개의 댓글