본문 바로가기
Java

Java 멀티 스레딩 및 성능 최적화(1)

by ma_ro 2023. 8. 28.

개요와 운영 체제 기초

Why we need Threads

  1. Responsiveness
    • 높은 응답성은 애플리케이션에 꼭 필요한 가치이다.
    • 동영상 플레이어에서 재생을 하며 동시에 마우스 커서를 움직이는 것이 멀티 스레드의 예이다.
    • Concurrency = Multitasking
      • CPU가 여러 스레드를 순회하며 멀티 테스킹을 하는 것을 Concurrency라고 한다.
      • 이를 통해 여러 작업을 동시에 수행하는 것 같은 착각을 일으킨다.
      • Concurrency를 위해 많은 코어가 필요하지 않다. 싱글 코어로도 멀티 스레드가 가능하다.
  2. Preformance
    • 멀티 코어로 일을 하면 당연히 더 많은 일을 할 수 있지만, 멀티 스레드를 이용하면 필요한 코어의 개수(혹은 컴퓨터의 개수)를 줄일 수 있다.

What threads are?

  1. 프로세스 동작
    • 컴퓨터의 부팅과 함께 OS가 디스크에서 메모리로 올라간다.
    • OS는 사용자를 대신하여 프로그램을 관리한다.
    • 사용자가 프로그램을 실행하면 OS는 디스크에 있던 프로그램을 메모리로 가져와서 프로그램의 인스턴스를 생성한다.
    • 이 인스턴스를 ‘프로세스’ 또는 ‘Application context’라고 부르며 각 프로세스는 완전히 별개의 것이다.
  2. 프로세스의 구조
    • 프로세스 ID(PID)는 애플리케이션이 읽고 쓰기 위해 여는 파일이다.
    • 코드는 CPU에서 실행되는 프로그램의 명령어이다.
    • Heap에는 애플리케이션에 필요한 모든 데이터가 들어있다.
    • 메인 스레드라 불리는 스레드가 적어도 하나는 있다.
      • 스레드는 크게 스택과 Intruction Pointer(명령어 포인터) 두 가지를 가지고 있다.
      • 멀티 스레드에서 각각의 스레드는 자체 스택과 명령어 포인터를 가지며 프로세스 내의 나머지 컴포넌트들은 모든 스레드가 공유한다.
      • 스택은 메모리 영역으로 지역 변수가 저장되고 메서드가 실행되는 영역이다.
      • Intruction Pointer는 스레드가 실행할 다음 명령어의 주소를 가리키는 단순 포인터이다.

운영체제 기초

Context switch

항상 코어보다 스레드가 많기 때문에 코어는 스레드를 돌아가면서 실행한다.

하나의 스레드 실행을 멈추고 다른 스레드를 스케줄링 한 다음 실행하는 것이 컨텍스트 스위치이다.

(Stop thread1 → Schedul thread 1 out → Schedule thread 2 in → Start Thread 2)

이런 컨텍스트 스위치 동작 때문에 많은 스레드를 다루는 일은 비용이 많이 들고 너무 많은 스레드를 사용하면 OS가 스레드 관리에 실제 생산 동작보다 더 많은 리소스를 사용하는 Thrashing이 발생한다.

하지만 스레드는 프로세스에 비해 많은 리소스를 공유하기 때문에 리소스를 더 적게 사용한다. (스레드 간의 context switch가 프로세스 간의 context switch보다 더 효율적이다.)

Thread scheduling

멀티 스레드에서 어떤 스레드를 먼저 실행할까를 결정하는 일이 scheduling이다.

First Come First Serve

  • 처리 시간이 긴 스레드가 먼저 오면 다른 스레드의 대기 시간이 길어지는 ‘기아’ 현상이 벌어진다.

Shortest Job First

  • 처리 시간이 짧은 작업들을 우선적으로 처리하면 처리 시간이 긴 작업들은 영원히 실행될 수 없다.

Epochs, Time Slices

  • 운영체제는 일정 크기의 에포크(작업 단위)에 맞춰 시간을 적당한 크기로 나누고 스레드의 타임 슬라이스를 종류 별로 에포크에 할당한다.
  • 모든 스레드가 각 에포크에서 작업 완료되지는 않는다. 할당 기준은 운영체제가 각각의 스레드에 적용하는 동적 우선순위(정적 우선순위 + a)에 따라 정해진다.
    • 정적 우선순위는 개발자가 미리 정한다.
      • a는 각각의 에포크마다 조절한다.

Threads vs Processes

멀티 스레드와 멀티 프로세스 중 어떤 것을 사용할 지 고민해야 한다.

멀티 스레드는 많은 리소스를 공유하기 때문에 많은 데이터를 공유하는 다양한 작업을 한다면 멀티 스레드가 유리하다.

보안과 안정성에 중점을 둔다면 멀티 프로세스를 사용하는 것이 좋을 수 있다. 멀티 스레드에서는 스레드 하나가 잘못될 경우 앱 전체가 다운될 수도 있다. 또한 서로 관련 없는 작업인 경우, 같은 프로세스에서 작업하는 것이 아무 의미가 없을 수 있다.

 

https://www.udemy.com/course/java-multi-threading/

'Java' 카테고리의 다른 글

Spring Boot에서 Logback(+ CloudWatch에 기록하기)  (0) 2023.08.23

댓글