스레드와 멀티태스킹

ChaeHo95·2022년 5월 22일
0

Java

목록 보기
7/10

멀티태스킹(multitasking)

멀티 태스킹의 합성어로서 다수의 작업을 처리하는 것

스레드의 개념

컴퓨터에서 사용하는 스레드는 Thread of control의 준말로서 프로그램 코드를 실행하는 하나의 실 혹은 제어의 개념

하나의 스레드로 하나의 작업밖에 처리 할 수 있음

스레드는 운영체제나 JVM에서 작업를 실행하는 단위로서, 운영체제나 JVM에 의해 관리되는 단위

멀티태스킹과 멀티스레딩

멀티프로세싱(multi-processing)은 하나의 응용프로그램을 여러 개의 프로세스(process)로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 기법이며, 각 프로세스는 고유한 메모리 영역을 보유하고 독립적으로 실행하여,프로세스들 사이의 통신(IPC, Inter Process Communication)이 어렵고 실행 시 오브헤드가 크다. 또한 프로세스 사이의 문맥 교환(context switch)에 따른 과도한 작업량과 시간 소모의 문제임이 있음

멀티스레딩은 하나의 응용프로그앰을 동시처리가 가능한 여러 작업(코드)으로 분할하거 작업의 개수만큼 스레드를 생성하여 각 스레드로 하여금 하나의 작업을 처리하도록 하는 기법이며, 모든 스레드는 응용 프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 작고, 스레드 사이의 문맥 교환 시 소요되는 작업량이 작아 문맥 교환이 빠름

멀티스레딩의 활용

응용프로그램이 다수의 스레드를 가지고 다수의 작업을 동시에 처리함으로써, 한 스레드가 대기하는 동안 다른 스레드를 실행하여 시간 지연을 줄이고 자원의 비효율적 사용을 개선

멀티스레드와 자바 가상 기계(JVM)

자바에는 프로세스(process)가 존재하지 않고 스레드 개념만 존재하며, JVM은 멀티스레딩만 지원
자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록

스레드 생성

  • 스레드 코드 작성

  • JVM에게 스레드를 생성하고 스레드 코드를 실행하도록 요청

  • 스레드 코드를 작성하는 방법은 2가지가 있음

    • Thread 클래스를 상속 받아 스레드 코드를 생성 가능

      a.스레드 클래스 작성: Thread 상속

      b.스레드 코드 작성: run()메소드 오버라이딩

      c.스레드 객체 생성
      - 스레드는 다른 객체와 달리 JVM에 등록되어 JVM에 의해 스케줄링 되어야 작동
      - 스레드 객체를 생성한 것으로 스레드 작동하는 것은 아님

      d.스레드 시작: start() 메서드 호출
      - 스레드 생명주기

    Thread의 메소드내용
    Thread()스레드 객체 생성
    Thread(Runnable target)Runnable 객체인 target을 이용하여 스레드 객체 생성
    Thread(String name)이름이 name인 스레드 객체 생성
    Thread(Runnable target,String name)Runnable 객체를 이용하며, 이름이 name인 스레드 객체 생성
    void run()스레드 코드로서 JVM에 의해 호출, 이 메소드를 오버라이딩하여 스레드 코드를 작성 해야만함, 이 메소드가 종료시 스레드도 종료
    void start()JVM에게 스레드 실행 요청
    void interrupt()스레드 강제 종료
    static void yield()다른 스레드에게 실행을 양보, JVM은 스레드 스케줄링을 시행하여 다른 스레드 선택 후 실행
    void join스레드가 종료할 때까지 대기
    void getId스레드의 ID 값 리턴
    String getName()스레드의 이름 값 리턴
    int getPriority()스레드의 우선순위 값 리턴. 1~10 사이 값
    void setPriority(int n)스레드의 우선 순위 값을 n을 변경
    Thread.State getState스레드의 상태 값 리턴
    static void sleep(long mills)스레드는 mills 시간 동안 잠듬. mills의 단위는 밀리초
    static Thread currentThread()현재 실행 중인 스레드 객체의 레퍼런스 리턴

    • Runnable 인터페이스로 스레드 만들기
      a.스레드 클래스 선언: Runnable 인터페이스 구현

      b.스레드 코드 작성: run()메소드 오버라이딩

      c.스레드 객체 생성

      d.스레드 시작: start() 메서드 호출

스레드 정보(TCB, Thread Contiol Block)

필드타입내용
스레드 이름스트링스레드의 이름으로서 사용자가 지정
스레드 ID정수스레드 고유의 식별자 번호
스레드의 PC(Program Count)정수현재 실행중인 스레드 코드의 주소
스레드의 상태정수NEW, RUNNABLE, WATTING, TIMED_WATTING, BLOCK, TERMINATED

|
|스레드 우선 순위|정수|스레드 스케줄링 시 사용되는 우선 순위 1~10 사이의 값이며 10이 최상위 우선순위|
|스레드 그룹|정수|여러 개의 자바 스레드가 하나의 그룹을 형성할 수 있으며, 스레드가 속한 그룹|
|스레드 레지스터 스택|메모리 블럭|스레드가 실행되는 동안 레지스터들의 값|

데몬 스레드(daemon thread)와 사용자 스레드(user thread)

  • 데몬 스레드
    응용프로그램이 실행되는 동안 관리를 위해 존재하는 스레드
    대표적인 예로 가비지 컬렉션 스레드
  • 사용자 스레드
    응용프로그램에서 생성되는 스레드

데몬 스레드가 사용자 스레드와 다른 점은,데몬 스레드가 살아 있더라도 사용자 스레드가 모두 종료하면 JVM과 함께 응용프로그램이 종료 됨

스레드 동기화(Thread Synchronization)

  • 스레드 동기화의 필요성
    멀티 스레드는 다수의 작업을 동시에 실행시키는 응용프로그램 작성 기법이지만 다수의 스레드 가 공유 자원 혹은 공유 데이터에 동시에 접근할 때 예상치 못한 결과가 나올 수 있음

  • 스레드 동기화의 목적
    공유 데이터에 접근하고자 하는 다수의 스레드가 서로 순서대로 충돌 없이 공유 데이터를 배타적으로 접근하기 위해 상호 협력하는 것

  • 자바의 스레드 동기화를 위한 sysnchronized 키워드
    가장 쉬운 스레드 동기화 기법은, 스레드가 공유 데이터를 접근할 때, 하나씩 순차적으로 실행하도록 제어하는 기법
    임계 영역에 진입할때 락(lock)이 걸리고 나올 때 락이 풀리는(unlock) 동작이 자동으로 이루어지도록 컴파일 됨
    락이 걸리는 못한 스레드는 락이 걸린 스레드가 락이 풀리 때까지 대기
    - 메소드 전체를 임계 영역으로 지정
    - 코드 블록을 임계 영역으로 지정

wait(),notify(),notifyAll()을 이용한 스레드 동기화

  • wait-nodfy()를 이용한 스레드가 필요한 경우
    sysnchronizedfmf 이용하여 공유 데이터에 순차적으로 잘 접근하도록 만들어진 경우라도, 여전히 동기화가 필요한 상황, 공유 메모리를 통해 두 스레드가 데이터를 주고 받을때, 공유 메모리에 대해 두 스레드가 동시에 접근하는 producer-concumer 문제

  • Object의 wait(),notify() 메소드
    wait-nodfy()를 이용하면 producer-concumer 문제의 스레드 동기화를 해결 할 수 있음
    java.lang.Object 클래스는 스레드 사이에 동기화를 위한 3개의 메소드를 제공
    - wait()
    다른 스레드가 이 객체의 notify()를 불러 줄 때까지 대기
    - notify()
    이 객체가 대기 중인 스레드를 깨워 RUNNABLE 상태로 만듬
    2개 이상의 객체가 대기 중일 시 오직 하나의 스레드만 깨움
    - notifyAll()
    이 객체에 대기중인 모든 스레드를 깨우고 RUNNABLE 상태로 만듬

출처 : 명품 JAVA Programming 개정 4판

profile
what you do matters ,but why you it matters much more 당신이 무엇을 하는지는 중요하지만, '왜' 그것을 하는지는 훨씬 더 중요합니다.

0개의 댓글