[Java] Thread

자바의 Thread, Runnable

1.프로세스와 쓰레드

1) 프로세스

  • 실행 중인 프로그램
  • OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 실행됨
  • 프로그램을 수행하는 데 필요한 데이터 + 메모리 등의 자원 + 쓰레드
    • Code + Data + Heap + Stack 영역으로 이루어짐
      1. Code : 실행 명령을 포함하는 코드들
      2. Data : static 변수 혹은 global 변수
      3. Heap : 동적 메모리 영역
      4. Stack : 지역변수, 매개변수, 반환값 등 일시적인 데이터
  • 프로세스 생성과 함께 PCB(Process Control Block)가 생성됨
    • Pointer : 대기상태의 큐를 구현하기 위해 필요한 포인터
    • Process State : 현재 프로세스 상태
    • Process Number : PID라 불리는 프로세스의 ID
    • Program Counter : 중간에 중단되었을 경우 중단점을 가리키는 역할

pcb

2) 쓰레드

  • 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것
  • 모든 프로세스는 최소 하나 이상의 쓰레드가 존재, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 함
  • 가벼운 프로세스, 경량 프로세스라고 부르기도 함
  • 프로세스의 공유자원을 사용할 수 있음

하나의 프로세스가 가질 수 있는 쓰레드의 개수 제한은 없음.
But, 쓰레드는 작업을 수행할 때 개별적인 메모리 공간(호출스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정됨

3) 멀티 프로세스 & 멀티 쓰레드

두 방식 모두 처리방식의 일종. 한 애플리케이션에 대한 서로 다른 처리방식으로 생각해야 두 개념을 동일 선상에 놓고 비교를 할 수 가 있다.

멀티 프로세스멀티 쓰레드
각 프로세스는 독립적쓰레드끼리 긴밀하게 연결되어 있음
IPC를 이용한 통신공유된 자원으로 통신 비용 절감
자원 소모적, 개별 메모리 차지공유된 자원으로 메모리가 효율적
컨텍스트 스위치 비용이 큼컨텍스트 스위치 비용이 적음
동기화 작업이 필요 ❌공유 자원 관리 필요 ⭕️
프로세스 간 독립적이기 때문에 타 프로세스의 장애으로부터 독립적한 쓰레드에서의 문제가 프로세스 전체에 영향을 줄 수 있음
  • 멀티태스킹 : 다중작업. 대부분의 OS에서 멀티태스킹을 지원. 여러 개의 프로세스가 동시에 실행 가능.



CPU의 코어는 한 번에 단 하나의 작업만 수행 가능.

  • 실제로 동시에 처리되는 작업의 개수는 코어의 개수와 일치
  • 쓰레드의 수는 코어의 개수보다 훨씬 많기 때문에 각 코어가 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보이게 함 (CPU 스케쥴링 알고리즘 중 Round-Robin Scheduling)
  • ❗️ 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니며, 하나의 쓰레드를 가진 프로세스보다 두 개의 쓰레드를 가진 프로세스가 오히려 더 낮은 성능을 보일 수도 있음

4) 멀티쓰레딩 장단점

장점

  • CPU 사용률 향상
  • 자원의 효율적 사용
  • 사용자에 대한 응답성 향상
  • 작업이 분리되어 코드가 간결해짐

하나의 서버 프로세스가 여러 개의 쓰레드를 생성해서 쓰레드와 사용자의 요청이 일대일로 처리되도록 프로그래밍함.

❗️여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화, 교착상태(deadlock)과 같은 문제들을 고려해서 프로그래밍해야함

5) 멀티 코어

앞의 멀티 프로세스, 멀티 쓰레드는 OS에서 작업을 처리하기 위한 방식이다. 이와 달리 멀티 코어는 하드웨어 측면에 가깝다. 동시성, 병렬처리의 관점에서 멀티 코어를 파악할 수 있다.

동시성
하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)가 번갈아 가면서 진행되지만 동시에 진행되는 것처럼 보이는 것

병렬 처리 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 쓰레드)가 병렬적으로 진행되는 것

그냥 궁금해서

멀티쓰레드 서버

  • 멀티스레드를 이용해 여러 사용자의 request와 response 처리
  • 대부분의 웹 애플리케이션은 멀티스레드 기반
  • 동기식 모델
  • Spring

싱글쓰레드 서버

  • 싱글 스레드 기반의 이벤트 루프 구조로 멀티 스레드 기반 모델보다 더 동시적으로 다수의 클라이언트 요청 처리 가능
  • 멀티스레드 기반의 모델보다 상대적으로 적은 스레드가 필요(자원의 효율)
  • 비동기식 모델
  • Node.js
  • Webflux : 적은 수의 쓰레드

References

  • [네트워크] 싱글스레드 서버와 멀티스레드 서버 - 테리의 일상 (https://dheldh77.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%84%9C%EB%B2%84%EC%99%80-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%84%9C%EB%B2%84)
  • 남궁성님의 Java의 정석 3판
  • https://www.youtube.com/watch?v=1grtWKqTn50