본문 바로가기
Language/Java

[Java] 멀티 스레드

by 깐니 2023. 1. 29.

프로세스와 스레드

프로세스

  • 실행 중인 프로그램으로, OS로부터 시스템 자원을 할당받는 작업 단위.
  • 프로세스가 할당받는 시스템 자원
    ex.) CPU 시간, 주소공간, Stack, Code, Data, Heap 등의 독립된 메모리 영역
  • 프로세스 당 최소 1개의 스레드 (메인 스레드)를 가지고 있음.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
    만약, 다른 프로세스의 자원에 접근하려면 프로세스 간 통신 (IPC / 파이프, 파일, 소켓 등..)을 사용해야 한다.

스레드

  • 프로세스 내 실제 작업을 수행하는 단위로, 프로세스가 할당받은 자원을 이용하는 실행의 단위.
  • 스레드는 프로세스 내 주소공간, 힙 공간의 자원들을 같은 프로세스 내 스레드끼리 공유하면서 실행됨.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 스레드도 그 변경 결과를 볼 수 있다.
  • 병렬성과 동시성을 갖는다.
    • 병렬성: 다수의 코어가 각각 할당된 스레드를 동시에 실행
    • 동시성: 하나의 코어가 여러 개의 스레드를 동시에 실행

 

자바 스레드

  • JVM 가 운영체제의 역할을 함. 따라서 자바에서 스레드 스케줄링은 JVM에 의해 이루어진다.
  • 자바에는 프로세스가 존재하지 않고 스레드만 존재한다. 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
  • JVM이 관리하는 스레드 정보
    • 스레드 갯수, 상태, 우선순위
    • 스레드로 실행되는 프로그램 코드의 메모리 위치 등

 

자바 스레드 프로그래밍

  • [방법1] Thread 클래스 상속
  • [방법2] Runnable 인터페이스 구현

차이: [방법1]의 경우 단일상속만 가능하기 때문에 다른 클래스를 상속받을 수 없다.

  • 스레드의 우선순위
    • 자바의 우선순위는 1부터~10까지 존재하며, 기본은 5이다.
      • setPriority(): 우선순위를 변경할 수 있다.
        • 스레드 실행 중에도 우선순위 바꿀 수 있음.
      • getPriority(): 우선순위를 확인할 수 있다.
    • 실제 작업 수행결과와 우선순위가 다를 수 있다. (우선순위는 JVM에서 정하는 것(희망사항)이고 실제 스레드를 시작하게 하는 것은 OS의 스케줄러이기 때문이다.)
    • 우선 순위는 상대적임.
  • 스레드의 상태
    • NEW : 스레드를 생성한 상태.
    • RUNNABLE :  start()를 호출 실행 중이거나 실행대기인 상태. 실행대기줄에서 자신의 차례를 기다리다가 자신의 차례가 되면 실행된다. 주어진 시간이 끝나면 다시 뒤로 가서 줄 섬.
    • TERMINATED : 해야할 작업이 끝나거나 stop() 이 호출되면 소멸함.
    • WAITING : join(), sleep(), suspend()에 의해 실행이 중지된 스레드가 대기하는 상태.
  • 스레드의 동기화 방법
    • 하나의 프로세스에 할당된 자원을 여러 스레드가 공유하기 때문이다. 따라서 진행중인 작업이 다른 스레드에게 간섭받지 않게 하려면 동기화를 함. ⇒ 임계영역으로 묶음
    • lock을 얻은 하나의 스레드만 사용가능함.
    • synchronized를 이용한 동기화

 

 

 

 

참고

[Java] 자바의 멀티 스레드 프로그래밍

[OS] 프로세스와 스레드

'Language > Java' 카테고리의 다른 글

[Java] 배열 복사  (0) 2022.11.04
[Java] 클래스  (0) 2020.12.19