자바/프로세스와 쓰레드

싱글쓰레드와 멀티쓰레드

백_곰 2022. 2. 14. 16:20

1. 싱글 쓰레드와 멀티 쓰레드의 개념

- 두 개의 작업을 하나의 쓰레드(th1)로 작업하는 것을 싱글쓰레드, 두 개의 쓰레드(th1, th2)로 작업하는

것을 멀티쓰레드라고 부른다.

( 위의 그림은 싱글쓰레드멀티쓰레드를 보여준다. )

 

( t2와 t`2의 끝나는 시간은 같지만 t1은 t`1보다 더 빨리 끝난다. 왜냐하면 그림에서 보여주듯이 멀티에서는

쓰레드의 '작업전환(context switching)'을 하기 때문이다. )

 

( 작업전환으로 인해 보통 PC(Program Counter) 등의 정보를 얻어야 하기 때문에 시간이 걸린다. )

 

( 그래서 무조건 멀티쓰레드가 좋은 것이 아니기 때문에, 단순히 CPU만을 사용하는 계산 작업이면

싱글쓰레드가 유리하다. )

 

 

 

 

1-1. 싱글쓰레드와 멀티쓰레드를 이해하기 위한 예제(1)

: 하나의 작업에 대해 두 개의 쓰레드를 수행하면서 싱글코어(1)와 멀티코어(4)를 비교하는 예제이다.

 

import java.util.*;

public class Exercise003 {
	static long nowTime = 0;
	
	public static void main(String[] args) {
		ThreadEx3 t1 = new ThreadEx3();
		t1.start();
		nowTime = System.currentTimeMillis();
		
		for(int i=0; i<300; i++) {
			System.out.printf("%s", new String("-"));
		}
		System.out.print("소요시간1:" + (System.currentTimeMillis()-Exercise003.nowTime));
	}
}

class ThreadEx3 extends Thread{
	public void run() {
		for(int i=0; i<300; i++) {
			System.out.printf("%s", new String("|"));
		}
		System.out.print("소요시간2:" + (System.currentTimeMillis()-Exercise003.nowTime));
	}
}

 

( 아래의 출력문은 싱글과 멀티 코어를 가지고 똑같이 위의 코드를 실행한 결과이다. )

( 싱글코어(1) 출력문: -----||||||---- ..... ---- 소요시간1: 65 ||||||||||||||||||| 소요시간2: 65 )

( 멀티코어(4) 출력문: ----||-||--||-- ..... |-소요시간2: 56 -------------- 소요시간1: 62 )

 

( 두 개의 작업을 하는데도 많이 걸린 이유는 작업전환시간대기시간 때문이다. )

( 위의 출력문에는 각 os마다 스케줄러에 의해 다를 수 있다. )

 

 

( 확실한 건 두 개의 쓰레드를 작업할 때 멀티 코어가 유리하다. 그 이유는 아래와 같다. )

( 싱글 코어(1)인 경우, 멀티 쓰레드에서 하나의 코어가 번갈아 가면서 작업을 하기 때문에 두 작업이 겹치지 않는다. )

( 그러나, 멀티 코어(4)에서는 멀티 쓰레드로 두 작업을 수행하면 동시에 두 쓰레드가 수행되므로, 작업이 겹친다. )

 

( 그러므로, 멀티 코어(4)가 더 빠를 수 밖에 없었다. )

 

 

( 위에서 얻을 수 있는 점은 두 쓰레드가 다른 자원을 사용하는 적업일 경우에는 싱글쓰레드 프로세스보다

멀티쓰레드 프로세스가 더 효율적이다. )

( 예를 들면, 사용자에게 입력받는 작업 + 네트워크로 파일을 주고받는 작업 + 프린터로 파일을 출력하는 작업

 + ... 등 을 말한다. 아래의 그림을 보자. )

 

( 첫 번째 그래프와 두 번째 그래프의 차이점은 쓰레드의 개수이다. )

 

( 첫 번째 그래프에서의 빨간 네모박스는 하나의 쓰레드가 A를 수행 후 사용자의 입력을 받기

위해서 A의 작업을 대기하면서 아무작업을 하지 못하는 현상이 일어났다. )

( 그렇게 되면, cpu의 사용률이 떨어지게 된다. )

 

( 두 번째 그래프는 두 개의 쓰레드가 있기 때문에, A를 수행 후 입력 대기하는 상황에서 다른 자원을

이용하는 B를 수행할 수 있게 되어 첫 번째 그래프보다 더 빨리 끝나게 된다. )

 

 

 

 

1-2. 싱글쓰레드와 멀티쓰레드를 이해하기 위한 예제(2)

: 하나의 쓰레드로 두 개의 작업을 하는 것과 두 개의 쓰레드로 두 개의 작업을 수행하는 것을

보여주는 예제이다. 

 

( 아래는 싱글 쓰레드로 두 개의 작업을 하는 것을 보여준다. )

import java.util.*;

import javax.swing.JOptionPane;

public class Exercise004 {
	public static void main(String[] args) {
		String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
		System.out.println("입력하신 값은 " + input + "입니다.");
		
		for(int i=5; i>0; i--) {
			System.out.println(i);
			try {
				Thread.sleep(500);
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 

( 아래는 멀티 쓰레드로 두 개의 작업을 하는 것을 보여준다. )


import javax.swing.JOptionPane;

public class Exercise005 {
	public static void main(String[] args) {
		ThreadEx4 t1 = new ThreadEx4();
		t1.start();
		
		String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
		System.out.println("입력하신 값은 " + input + "입니다.");
	}
}

class ThreadEx4 extends Thread{
	public void run() {
		for(int i=5; i>0; i--) {
			System.out.println(i);
			try {
				Thread.sleep(500);
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 

 

 

( 위 두 개의 코드를 수행해보면 아래의 그림처럼 수행하는 것을 알 수 있다. )

 

 

 

 

2. 병행과 병렬

- 병행은 여러 쓰레드가 여러 작업을 동시에 진행하는 것을 말한다.

- 병렬은 하나의 작업을 여러 쓰레드가 나눠서 처리하는 것을 말한다.