본문 바로가기

Diary/TIL

2024-04-19) 멀티스레드 공부

오늘은 멀티스레딩에 대해 깊이 있게 공부하게 되었다. 멀티스레딩은 프로세스 내에서 실행되는 가장 작은 실행 단위인 쓰레드를 이용하여 한 프로세스의 자원을 최대한 활용하는 기술이다. 멀티스레드를 사용하면 동일한 프로세스 내에서 자원을 공유하지만, 여러 작업을 독립적으로 병렬로 처리할 수 있다. 이는 특히 내가 현재 구현하고 있는 서비스에서 유용하게 적용될 수 있다.

내가 구현 중인 서비스는 다음과 같은 단계로 구성된다:

  • 로그인 -> 메인 페이지 -> 검색 -> 좌석 선택 페이지 -> 좌석 예약(경쟁) -> 결제

여기서 동시성 문제가 발생할 수 있는 경쟁 부분을 제외하고, 멀티스레드를 적용하면 성능과 응답성을 향상시킬 수 있을 것이다. 특히 로그인, 메인 페이지, 검색, 좌석 선택 페이지에 멀티스레드를 적용하는 것이 유효할 것 같다.

멀티스레딩을 적용하는 이유와 기대 효과

  1. 적용 이유:
    • 성능 향상: 여러 작업을 동시에 처리할 수 있어 CPU의 사용 효율을 극대화할 수 있다.
    • 응답성 향상: 특히 사용자 인터페이스(UI)에서 백그라운드 작업을 멀티스레드로 처리하면 응답성을 유지할 수 있다.
    • 자원 활용 최적화: 여러 스레드를 사용하여 파일 I/O, 네트워크 작업 등의 블로킹 작업을 비동기적으로 처리할 수 있다.
  2. 적용함으로써 기대할 수 있는 효과:
    • 처리 속도 개선: 병렬 처리로 작업 시간을 단축할 수 있다.
    • 응답 시간 단축: 사용자 인터페이스의 응답 속도가 빨라진다.
    • 자원 사용 효율화: CPU, 메모리 등의 자원을 보다 효율적으로 사용할 수 있다.

멀티스레드를 적용할 수 있는 부분

  1. 웹 서버: 클라이언트 요청을 멀티스레드로 처리하여 동시 접속 성능을 향상시킬 수 있다.
  2. 데이터 처리: 대량의 데이터를 병렬로 처리하여 데이터 처리 속도를 높일 수 있다.
  3. 게임 개발: 게임 로직, 그래픽 렌더링, 사용자 입력 등을 멀티스레드로 처리하여 부드러운 게임 플레이를 구현할 수 있다.
  4. 과학 계산: 복잡한 계산을 병렬로 처리하여 계산 속도를 높일 수 있다.

멀티스레드 적용 방법

  1. 언어별 멀티 스레드 라이브러리 사용:
    • Java: java.util.concurrent 패키지를 사용하여 스레드를 관리한다.
    • Python: threading 모듈을 사용하여 스레드를 생성하고 관리한다.
    • C++: std::thread를 사용하여 멀티스레드를 구현한다.
  2. 스레드 생성 및 관리:
    • 스레드 생성: 새로운 스레드를 생성하여 실행할 코드를 할당한다.
    • 스레드 동기화: 여러 스레드가 공유 자원을 안전하게 접근하도록 동기화한다 (예: 뮤텍스, 세마포어).
    • 스레드 종료: 작업이 완료된 스레드를 적절히 종료하여 자원을 해제한다.

멀티스레드를 적용할 때 주의할 부분

  1. 동시성 문제: 여러 스레드가 동일한 자원에 접근할 때 발생할 수 있는 문제를 피하기 위해 적절한 동기화 메커니즘을 사용해야 한다.
  2. 데드락(교착 상태): 두 개 이상의 스레드가 서로 자원을 점유한 상태에서 다른 스레드의 자원을 기다리며 무한히 대기하는 상태를 피해야 한다.
  3. 라이브락: 스레드가 자원을 점유하지 못하고 계속해서 상태를 바꾸며 서로를 방해하는 상태를 피해야 한다.
  4. 자원 경합: 여러 스레드가 동일한 자원을 사용하려고 할 때 성능 저하가 발생할 수 있다. 이를 최소화하기 위해 자원 사용을 최적화해야 한다.
  5. 스레드 안전성: 공유 자원에 접근할 때 항상 스레드 안전성을 유지해야 한다.
  6. 컨텍스트 스위칭 오버헤드: 스레드 간의 컨텍스트 스위칭이 빈번할 경우 성능 저하가 발생할 수 있다.

'Diary > TIL' 카테고리의 다른 글

2024-04-29) DB Connection pool 검색  (0) 2024.05.22
2024-04-22) 동시성 이슈 공부  (0) 2024.05.22
2024-04-18) 로드밸런싱 공부  (0) 2024.05.22
2024-04-17) Redis 캐시 적용  (0) 2024.05.22
2024-04-16) 캐싱 적용 방법 탐색  (0) 2024.05.22