Java

[Thread] Thread - Part2

모모토 2021. 9. 17. 16:44
반응형

1. 싱글스레드와 멀티스레드

앞서 Thread - part1 에선 멀티스레드의 장점에 대해서 공부해보았는데 ,

멀티스레드가 싱글스레드보다 무조건 성능이 좋을까?

결론부터 말하자면 아니다.

 

상황마다 다르다.

 

예를들어서 싱글스레드로 2개의 프로그램을 돌리면 순차적으로 프로그램이 실행되면서 하나의 프로그램이 종료되면서 다음 프로그램이 실행되는 모습을 보일것이다.

멀티스레드로 2개의 프로그램을 돌릴땐 이야기가 살짝 다르다 OS 스케줄러에 의해서 두 프로그램은 번갈아 가면서 실행되고 이때 작업 전환을 할 때 걸리는 시간이 발생하는데 이를 context switching(작업 전환)이라고 부른다.

따라서 만약 싱글코어(한번에 실행할 수 있는 프로그램이 1개인 상황)에서 단순한 작업을 진행한다면 싱글스레드가 더 효율적일것이다.

 

그렇다면

만약 멀티코어(동시에 2개의 프로그램을 실행할 수 있는 상황)에서 멀티스레드 프로그램을 진행한다면 어떻게 될까?

 

여기선 자원을 공유하는가 아니냐에 따라 다르다.

2명의 직원에게 일을 시켜야하는데 일을 하기위한 노트북은 1대이다. 그렇다면 두명의 직원은 노트북을 가지고 경쟁해야만한다. 칼퇴근을 하기 위해서

하지만 노트북이 2대라면 어떨까? 두직원은 서로 일하는부분에서 경쟁을 하지않아도 된다.

프로그램의 입장에서 말하면 두 프로그램이 하나의 자원을 가지고 경쟁하지 않아도 된다는 얘기가 된다. 여기서 경쟁한다는것은 두 프로그램이 겹치게 되어 자원을 두고 경쟁한다는 얘기이다.

따라서 두 스레드가 서로 다른 자원을 사용하는 경우엔 싱글스레드 프로세스보다 멀티스레드 프로세스가 더 효과적이다.

 

싱글스레드는 자원을 공유 여부에 관계없이 절대 자원을 가지고 경쟁하지 않기 때문

멀티스레드 프로세스를 사용하는 대표적인 경우는 외부기기와의 입출력을 필요로 하는 경우가 이에 해당한다.

싱글스레드에 작업 A , B 가 존재하고 A는 중간에 외부에서 데이터를 받아야만 작업이 진행된다고 가정해보자 싱글스레드의 경우 작업이 순차적으로 일어나게 되고 먼저 진행된 작업이 끝나지 않으면 다음 작업을 실행하지 않는다.

따라서 외부에서 데이터를 입력받는동안 아무일도 하지않는 시간이 발생하면서 전체 프로그램의 진행속도가 늘어나게 되어 버린다.

이를 'I/O 블락킹' 이라고 한다.

반면 멀티스레드는 A가 사용자의 입력을 기다리는 동안 B가 작업을 처리할 수 있기 때문에 보다 효율적인 CPU의 사용이 가능해진다.

 

2. 스레드의 우선순위

스레드는 우선순위(Priority) 라는 멤버변수를 가지고 있는데, 이 우선순위의 값에 따라 스레드가 얻는 실행시간이 달라진다.

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

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

int getPriority() // 스레드의 우선순위를 반환한다.

//Ex)

ThreadEx th = new ThreadEx();

th.setPriority(7); // 우선순위를 7번째로 지정

 

따라서 스레드의 우선순위를 부여하여 어떤 작업을 더 비중있게 수행할지를 결정할 수 있다.

하지만 멀티코어에서는 스레드의 우선순위에 따른 차이가 없다. 또한 OS마다 다른 방식으로 스케줄링을 하기 때문에 어떤 OS에서 실행하느냐에 따라서 결과는 다를수 있다.

따라서 차라리 스레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어 PriorityQueue 에 저장해 놓고 우선순위가 높은 작업이 먼저 처리되도록 하는 것이 나을 수 있다.