멀티스레드와 동시성

2024. 9. 24. 23:55개발/Java

멀티태스킹

CPU가 매우 빠르게 여러 프로그램의 코드를 번갈아 수행하는 것(여러 작업을 수행하는 능력)

소프트웨어 기반

멀티프로세싱

둘 이상의 프로세서(CPU 코어)를 사용하여 여러 작업을 동시에 처리하는 기술

하드웨어 기반

스케쥴링

운영체제가 CPU에 어떤 프로그램을 얼마만큼 실행해야 할지 결정하는 것

CPU를 최대한 활용할 수 있는 다양한 우선순위와 최적화 기법 사용

여러 프로세스의 스레드가 스케쥴링 큐에 쌓이고 큐에 쌓인 순서대로 실행이 된다.

코어가 많을수록 코어 수만큼의 스케쥴링 큐에 스레드가 쌓여서 더 빨리 실행이 된다.

프로세스

프로그램은 코드로 이루어진 파일

프로그램을 실행하면 프로세스

각 프로세스는 독립적인 메모리 공간을 갖고 있다. 운영체제는 별도의 작업 단위로 분리해서 관리된다. 각 프로세스는 별도의 메모리 공간을 갖고 있어 서로 간섭하지 않고 서로의 메모리에 직접 접근할 수 없다.

프로세스의 메모리 구성

  • 코드 섹션 : 실행할 프로그램의 코드가 저장
  • 데이터 섹션 : 전역 변수 및 정적 변수가 저장
  • 힙 : 동적으로 할당되는 메모리 영역
  • 스택 : 메서드 호출 시 생성되는 지역 변수와 반환 주소가 저장되는 영역(스레드에 포함)

스레드

프로세스는 하나 이상의 스레드를 반드시 포함

한 프로세스는 여러 스레드를 가질 수 있음, 이들은 프로세스가 제공하는 동일한 메모리 공간 공유

스레드는 프로세스보다 단순하므로 생성 및 관리가 단순하고 가볍다.

코드 섹션, 데이터 섹션, 힙 메모리는 프로세스 안의 모든 스레드가 공유한다.

각 스레드는 자신의 스레드를 가지고 있다.

컨텍스트 스위칭

코어가 여러 스레드를 처리할 때 한 스레드를 실행하다가 멈추고 다른 스레드를 실행하고 다시 원래 스레드를 작업하려고 할 때 관련된 변수들을 메모리에 저장하고 다시 실행할 때 CPU에서 불러와야 한다. 이런 과정을 컨텍스트 스위칭이라고 한다. 컨텍스트 스위칭은 비용이 발생한다.

스레드 작업에는 크게 2가지로 나뉜다.

  • CPU-바운드 작업
    • 계산, 데이터 처리, 알고리즘 실행
  • I/O 바운드 작업
    • 디스크, 네트워크, 파일 시스템 등과 같은 입출력
    • 데이터베이스 쿼리 처리, 파일 읽기/쓰기, 네트워크 통신

웹 애플리케이션 서버에서는 대부분 I/O 바운드 작업과 같은 기다리는 작업이 많다.

따라서 코어 수보다는 스레드를 많이 만드는게 좋은데 컨텍스트 스위칭 비용이 많이 드므로 적절한 테스트 후에 스레드 수를 정하자.

'개발 > Java' 카테고리의 다른 글

Mutex와 Semaphore  (0) 2024.10.20
메모리 가시성  (0) 2024.10.20
동기화  (0) 2024.10.05
스레드 제어와 생명 주기  (0) 2024.10.02
JVM 메모리 영역  (0) 2024.09.29