본문 바로가기

CS/멀티코어 컴퓨팅

멀티코어 컴퓨팅 - JAVA Thread Programming

728x90

Thread

정의

- 프로그램 내에서 단일 순차적 흐름을 나타냄

- 스레드는 프로그램의 프로세스 내에서 실행되며 해당 프로세느와 환경에 할당된 자원을 활용합니다.

 

각 스레드의 구성요소

- Program counter

- Register set

- Stack

 

스레드간의 공유

Code section

Data section

OS resources such as open files

 

 멀티 프로세스 vs 멀티 스레드

Process

- 자식 프로세스는 부모의 프로세스를 동일하게 카피

- 상대적으로 비쌈

- 그러나 동시성을 고려하지 않아도됨 개꿀!

 

thread

- 자식과 부모는 자원을 공유함

- 상대적으로 쌈

- 동시성을 고려해야함 어려움

 

자바의 스레드 모델

자바는 내장 스레드를 가지고 있다. 응용 프로그램은 적어도 하나의 스레드를 구성하는데 이게 메인이다. 

JVM은 초기스레드를 생성하는데 메인 스레드는 다른 스레드를 생성할 수 있다.

 

쓰레드 우선순위

초기 우선순위는 생성중인 스레드가 우선순위이다.

jvm은 우선순위 스레드를 우선적으로 처리한다. 그러나 보장되지 않는다.

 

yield

Release the right of CPU

static void yield

우선순위가 같은 스레드에게 실행을 양보한다.

 

Thread synchronization

스레드 사용에 장점은 같은 시간에 많은 양의 일을 할 수 있다는 것이다.

하지만 문제는 안정성

 

안정성 문제에선 레이스 컨디션이 없어야하고 활성성 측면에선 데드락 문제가 발생하지 않아야한다.

 

synchronized 키워드로 이를 방지할 수 있다.

 

Condition Variables

- lock (synchronized)

 스레드가 데이터에 접근하는 것을 통제

 

컨디션 변수는 wait, notify, notifyall 이 있음

조건 변수를 쓰지 않으면 프로그래머는 조건이 충족될 때 까지 지속적 polling 하는 스레드를 가직 ㅗ있어야할 수 있음 (critical section)

조건 변수는 폴링 없어도 같은 목표를 달성할 수 있음

 

- 조건 변수는 항상 뮤텍스 락과 함께 사용됨.

 

wait()

- 인터럽트가 발생하지 않으면 현재 스레드가 차단

- 스레드는 객체와 관련된 대기 집합에 배치

- 락 해제

 

notify

- 대기집합에서 스레드가 하나 존재하면 제거

- 락을 유지

- 대기 상태에서 재개됨.