본문 바로가기

배운내용 정리

Java Thread(1)

1. 프로세스와 쓰레드

2. 멀티 쓰레드

3. Thread 와 Runnable

4. 데몬 쓰레드와 사용자 쓰레드

5. 쓰레드 우선순위와 쓰레드 그룹

 

1. 프로세스와 쓰레드

  • 프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
  • 레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위\
  • 프로세스
    • 프로세스 작업 단위
      • 프로세스는 “실행 중인 프로그램”을 의미한다.
      • 예를들어 우리가 Java 프로그램을 실행시키면 이 프로그램은 프로세스라는 이름으로 운영체제 위에서 실행된다.
      • 즉, OS 위에서 실행되는 모든 프로그램은 OS가 만들어준 프로세스에서 실행된다.
        • 카카오톡, 브라우저, JAVA프로그램 모두 프로세스로 실행되며
        • 크롬 브라우저를 2개 띄우면 크롬 브라우저 프로세스도 2개가 띄워진 것이다.

OS가 프로그램 실행을 위한 프로세스를 할당해 줄 때 프로세스 안에 프로그램 Code와 Data 그리고 메모리 영역(Stack, Heap)을 함께 할당해 준다.

  1. Code는 Java main 메서드와 같은 코드를 말한다.
  2. Data는 프로그램이 실행 중 저장할 수 있는 저장공간을 의미한다.
    1. 전역변수, 정적변수(static), 배열등 초기화된 데이터를 저장하는 공간
  3. Memory (메모리 영역)
    • Stack : 지역변수, 매개변수 리턴 변수를 저장하는 공간
    • Heap : 프로그램이 동적으로 필요한 변수를 저장하는 공간 (new(), mallock())

각 프로그램은 프로세스를 통해 Code, Data, Memory (Stack, Heap)를 OS로부터 할당받습니다.

  • 쓰레드
    • 쓰레드의 생성
      • 프로세스가 작업중인 프로그램에서 실행요청이 들어오면 쓰레드(일꾼)을 만들어 명령을 처리하도록 한다.
    • 쓰레드의 자원
      • 프로세스 안에는 여러 쓰레드(일꾼)들이 있고, 쓰레드들은 실행을 위한 프로세스 내 주소공간이나 메모리공간(Heap)을 공유받는다.
      • 추가로, 쓰레드(일꾼)들은 각각 명령처리를 위한 자신만의 메모리공간(Stack)도 할당받는다.
  • 쓰레드는 프로세스내에서 일하는 일꾼(코드실행의 흐름)이라고 생각하면 된다.

  • Java 쓰레드
    • Java 프로그램을 실행하면 앞서 배운 JVM 프로세스 위에서 실행된다.
    • Java 프로그램 쓰레드는 Java Main 쓰레드부터 실행되며 JVM에 의해 실행된다.
  • 일반 쓰레드와 동일하며 JVM 프로세스 안에서 실행되는 쓰레드를 말한다.

2. 멀티 쓰레드

Java는 메인 쓰레드가 main() 메서드를 실행시키면서 시작이 됩니다.

  • 메인 쓰레드는 필요에 따라서 작업 쓸레드들을 생성해서 병렬로 코드를 실행 시킬 수 있습니다.
  • 즉, Java는 멀티 쓰레드를 지원합니다.
  • 싱글 쓰레드와 멀티 쓰레드의 차이에 대해서 좀 더 자세하게 살펴보겠습니다. 
  • 싱글 쓰레드
    • Java 프로그램의 경우 main() 메서드만 실행시켰을때 이것을 싱글 쓰레드 라고 한다.
    • 지금까지 코드 스니펫을 통해 실습한 모든 Java프로그램들은 main() 메서드만 실행시켰기 때문에 모두 싱글 쓰레드로 실행되고 있다.
      • Java 프로그램 main() 메서드의 쓰레드를 ‘메인 쓰레드’ 라고 부른다.
      • JVM 의 메인 쓰레드가 종료되면, JVM 도 같이 종료.
  • 프로세스 안에서 하나의 쓰레드만 실행되는 것을 말한다.
  • 멀티 쓰레드
    • 하나의 프로세스는 여러개의 실행단위(쓰레드)를 가질 수 있으며 이 쓰레드들은 프로세스의 자원을 공유한다.
    • Java 프로그램은 메인 쓰레드외에 다른 작업 쓰레드들을 생성하여 여러개의 실행흐름을 만들 수 있다.
    • 멀티 쓰레드 장점
      • 여러개의 쓰레드(실행 흐름)을 통해 여러개의 작업을 동시에 할 수 있어서 성능이 좋아진다.
      • 스택을 제외한 모든 영역에서 메모리를 공유하기 때문에 자원을 보다 효율적으로 사용할 수 있다.
      • 응답 쓰레드와 작업 쓰레드를 분리하여 빠르게 응답을 줄 수 있다. (비동기)
    • 멀티 쓰레드 단점
      • 동기화 문제가 발생할 수 있다.
        • 프로세스의 자원을 공유 하면서 작업을 처리하기 때문에 자원을 서로 사용하려고 하는 충돌이 발생하는 경우를 의미한다.
      • 교착 상태(데드락)이 발생할 수 있다.
        • 둘 이상의 쓰레드가 서로의 자원을 원하는 상태가 되었을 때 서로 작업이 종료되기만을 기다리며 작업을 더 이상 진행하지 못하게 되는 상태를 의미한다.
  • 프로세스 안에서 여러개의 쓰레드가 실행되는 것을 말한다.

오늘은 우리가 사용하는 컴퓨터에서 쓰레드가 어떻게 사용되고 동작하는지, 주의할 점은 무엇인지 살펴보았다. 쓰레드에 대한 이해하는 과정은 어렵지만 그래도 처음보는 내용은 아니여서 금방 이해할 수 있는 부분이 많았다.

'배운내용 정리' 카테고리의 다른 글

Java Thread(3)  (0) 2023.10.30
Java Thread(2)  (0) 2023.10.27
Java Generic  (1) 2023.10.23
Java 예외처리  (1) 2023.10.23
자바의 구조체  (0) 2023.10.18