반응형

프로세스와 쓰레드


프로세스

  • 엑셀, 카카오톡, 멜론 등과 같은 하나의 프로그램이다.
  • 프로세스 안에는 쓰레드가 존재한다.

쓰레드

  • 프로세스 안에 쓰레드가 존재하는데 싱글 스레드, 멀티 스레드로 나뉜다.
  • 싱글 스레드는 실행할 내용이 1가지이고, 멀티 스레드는 2가지 이상인 것을 의미한다.
  • 쓰레드란 카카오톡이 프로세스라면 메시지 전송, 파일 다운로드, 선물 받기 등이 될 수 있다.
    3가지는 모두 동시에 실행될 수 있지 않은가? 매시지를 전송한다고, 파일을 다운로드 못받는건 아니다.
    이렇게 각자의 기능을 동시에 실행하는 것이 멀티 스레드이다.
  • 메인 스레드가 종료되더라도 작업 스레드가 남아있다면 프로세스는 종료되지 않게 된다.
    카카오톡을 종료한다고 해서 파일 전송이 실패하는 건 아니지 않은가?

메인 스레드와 작업 스레드


  • 자바에서 main 메서드가 메인 쓰레드이다. 모든 실행은 main 메서드로 부터 시작된다.
    그렇기 때문에 작업 스레드 또한 메인 메서드가 실행하는 것이다.
  • 멀티 스레드에서 메인 쓰레드 실행 → 순차적으로 멀티 쓰레드를 실행 하게 되는 것이다.
    이후 실행된 작업 쓰레드들은 개별적으로 실행되게 된다.

동시성과 병렬성


동시성

  • 1코어에서 멀티 쓰레드가 컨택스트 스위칭 되는 것을 의미한다.
    위에서 멀티 스레드는 개별 실행 된다고 하였는데 1코어에서는 실제로는
    아주 빠르게 순차적으로 쓰레드들이 번갈아가며 실행되고 있는 것이다.
    병렬처럼 보일 뿐이다.
  • 어떤 쓰레드가 먼저 실행 되어야할지 우선 순위를 조절할 수도 있다.

병렬성

  • 듀얼 코어 이상에서는 각 코어마다 쓰레드가 할당되어 완전히 개별적으로 실행되게 된다.

동기화 블럭과 동기화 메서드


멀티 쓰레드는 객체 공유에 취약하기 때문에 자바에서는 synchronized 키워드를 제공한다.
메서드와 블록에 사용하면 쓰레드가 실행 중 일 때 다른 스레드는 대기를 하도록 해준다.

이 동기화를 lock이라고도 한다.

스레드의 상태


스레드는 각 상황별로 상태를 갖는다.
크게 스레드 객체 생성(NEW) →(start()) 실행 대기(RUNNABLE) → 실행 → 종료(TERMINATED)
세 가지 상태를 가진다.

실행 대기란 아직 스케줄링(실행 순서)가 되지 않아 대기하고 있는 상태인 것이다.

멀티 쓰레드에서는 컨텍스트 스위칭이 일어나기 때문에 실행 대기와 실행이 계속 반복될 것이다.

일시 정지 상태

일시 정지 상태는 3가지로 나뉜다.

  • WATING : 다른 스레드가 통지할 때 까지 기다리는 상태
  • TIMED_WATING : 주어진 시간 동안 기다리는 사아태
  • BLOCKED : 사용하고자 하는 객체의 락이 풀릴 때 까지 기다리는 상태

스레드 상태 제어

스레드 상태를 제어하는 방법은 자바에서 많은 메서드를 제공한다.

  • wait(), notify(), join() 등이 있다.

상세한 사용법은 필요할 때 찾아보면 된다.

데몬 스레드


데몬 스레드란 항상 떠 있는 스레드를 의미한다.
예를 들어 엑셀에서 1분 마다 자동 저장 등과 같은 기능들이다.

  • 메인 스레드가 종료되면 강제 종료된다.
    메인 스레드의 보조 역할이기 때문에 의미가 없어지기 때문이다.
  • 자바에서는 setDaemon(true)로 활성화 할 수 있다.

스레드 풀


CPU에 쓰레드가 수도 없이 많아지면 그에 따른 스레드 생성과 스케줄링으로 인하여
서버 성능에 문제가 발생할 수 있다. 그래서 스레드를 관리하는 풀장을 제공하는 것이 스레드 풀이다.

갑작스런 병렬 작업에 폭증으로 인한 스레드 폭증을 막기 위해 사용하는 것이다.
그 원리는 작업 큐에 요청 쓰레드를 쌓아 놓고 제한된 쓰레드 갯수만큼만 스레드를 처리하는 것이다.
스레드 풀에 미리 초기 스레드를 생성해 놓을 수도 있기 때문에 생성에 대한 비용도 줄일 수 있다.
만약 초기 스레드 보다 더 많은 스레드 요청이 온다면 제한된 스레드 갯수에 한하여 추가로 생성하여 작업한다.

3가지 설정

초기 스레드 수 : 미리 스레드를 생성해 놓는 스레드 개수, 생성 비용을 줄일 수 있다.
코어 스레드 수 : 사용되지 않는 스레드를 풀에서 제거할 때 최소한으로 유지되어야 할 스레드 수
최대 스레드 수 : 생성 가능한 최대 스레드 개수

Executorservice

해당 클래스는 자바에서 제공하는 스레드 풀 클래스이다. 스레드 풀이 필요하다면
해당 클래스를 사용해 쓰레드 실행을 요청하면 된다.

참고


이것이 자바다2 → 쓰레드

반응형

'웹 프레임워크 만들며 알게된 것들' 카테고리의 다른 글

InputStream과 BufferedReader  (0) 2022.01.18
소켓 통신이란  (0) 2022.01.18
복사했습니다!