멀티 쓰레드

HyeonWoo·2021년 2월 16일
0

Java

목록 보기
8/12
post-thumbnail

1. 쓰레드 우선 순위

  • 쓰레드는 우선순위(priority)라는 속성(멤버변수)을 가지고 있는데, 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라짐.

  • 쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다.

  • ex) 파일 전송 기능이 있는 메신저의 경우, 파일다운로드를 처리하는 쓰레드보다 채팅내용을 전송하는 쓰레드의 우선순위가 더 높아야 사용자가 채팅하는데 불편함이 없을 것이다.

쓰레드의 우선순위 지정하기

//쓰레드의 우선순위를 지정한 값으로 변경한다.
void setPriority(int newPriority) 
// 쓰레드의 우선순위를 반환한다.
int getPriority()

동시성과 병렬성

동시성(Concurrency) : 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아 가며 실행하는 성질

병렬성(Parrallelism) : 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질

싱글 코어 CPU를 이용한 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만, 사실은 번갈아가며 실행하는 동시성 작업이다. 번갈아 실행하는 것이 워낙 빨라서 병렬성으로 보일 뿐이다.

2. 쓰레드 스케줄링

  • 쓰레드의 개수가 코어의 수보다 많을 경우
    • 쓰레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정해야 하는데, 이것을 쓰레드 스케줄링이라고 한다.
    • 쓰레드 스케줄링에 의해 쓰레드들은 아주 짧은 시간에 번갈아가면서 그들의 run()메소드를 조금씩 실행한다.
  • 자바의 쓰레드 스케쥴링
    • 우선 순위(Priority)방식 : 코드로 제어 가능, 우선 순위가 높은 쓰레드가 실행 상태를 더 많이 가지도록 스케쥴링
    • 순환 할당 방식(Round-Robin) : 시간 할당량(Time Slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행하는 방식
  • 쓰레드 우선순위
    • 쓰레드들이 동시성을 가질 경우 우선적으로 실행할 수 있는 순위
    • 우선 순위는 1(낮음)에서부터 10(높음)까지로 부여
    • main 메서드를 수행하는 쓰레드는 우선순위가 5로 할당
    • main 메서드내에서 생성하는 쓰레드의 우선순위는 자동적으로 5가 된다.
  • 우선 순위 효과
    • 싱클 코어
      • 우선 순위가 높은 쓰레드가 실행 기회를 더 많이 가지기 때문에
        • 우선 순위가 낮은 쓰레드 보다 계산 작업을 빨리 끝낸다.
    • 멀티 코어
      • 쿼드의 경우에는 4개의 쓰레드가 병렬성으로 실행될 수 있기 때문에
      • 4개 이하의 쓰레드를 실행할 경우에는 우선 순위 방식은 크게 영향을 미치지 못한다.
      • 최소한 5개 이상의 쓰레드가 실행되어야 우선 순위의 영향을 받는다.

3. 동기화 메소드와 동기화 블록

싱글 쓰레드 프로그램에서는 한 개의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티쓰레드 프로세스의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다. 예를 들어서 쓰레드A가 작업하던 도중에 다른 쓰레드B에게 제어권이 넘어갔을 때, 쓰레드 A가 작업하던 공유데이터를 쓰레드 B가 임의로 변경하였다면, 다시 쓰레드 A가 제어권을 받아서 나머지 작업을 마쳤을 때 원래 의도했던 것과는 다른 결과를 얻을 수 있다.

동기화 메소드 및 동기화 블록 - Synchronized

  • 멀티 쓰레드 프로그램에서 단 하나의 쓰레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라고 함.
  • 자바는 임계 영역을 저장하기 위해 동기화(synchronized) 메소드와 동기화 블록을 제공한다.
  • 쓰레드가 객체 내부의 동기화 메소드 또는 블록에 들어가면 즉시 객체에 잠글을 걸어 다른 쓰레드가 임계 영역 코드를 실행하지 못하도록 한다.
  • 동기화 메소드를 만드는 방법은 메소드 선언에 synchronized 키워드를 붙이면 된다.
  • synchronized 키워드는 인스턴스와 정적 메소드 어디든 붙일 수 있다.

동기화 메소드

public synchronized void method() {

	//임계 영역; 단 하나의 쓰레드만 실행
}

동기화 블록

public void method() {

	// 여러 쓰레드가 실행 가능한 영역
        
        synchronized(객체의 참조변수){
        //임계영역; 단 하나의 쓰레드만 실행
        }
        
        // 여러 쓰레드가 실행 가능한 영역
}

임계 영역은 멀티쓰레드 프로그램의 성능을 좌우하기 때문에 가능하면 메서드 전체에 락을 거는 것보다 synchronized블럭으로 임계 영역을 최소화해서 보다 효율적인 프로그램이 되도록 노력해야 한다.


참고자료
https://ict-nroo.tistory.com/41,
자바의 정석

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글