DevBoi

[Java] 멀티 쓰레드란 본문

Language/[Java]

[Java] 멀티 쓰레드란

HiSmith 2022. 4. 8. 11:45
반응형

멀티쓰레드란?

멀티쓰레드란, 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화 하여

수행능력을 향상 시키는 것을 멀티쓰레딩이라고 한다.

하나의 프로그램에서 동시에 여러개의 일을 수행할 수 있도록 해주는 것이다.

 

멀티쓰레드를 사용하는 이유는?

 

-프로세스를 이용하여 동시에 처리하던 일을 쓰레드로 구현할 경우

메모리 공간과 시스템 자원소모가 줄어들게 된다.

 

-쓰레드 간의 통신이 필요한 경우 별도 자원을 이용하는 것이 아니라 

전역 변수공간, 동적으로 할당된 공간인 힙영역을 이용하여 데이터를 주고 받을 수 있다.

 

-쓰레드의 문맥교환은 프로세스 문맥교환과는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다

 

-시스템의 처리량이 향상 되고 자원소모가 줄어들어 자연스럽게 프로그램의 응답 시간이 단축된다.

 

 

멀티 프로세스와 멀티 쓰레드의 차이

-멀티 프로세스 : (데이터 영역,힙, 스택) 영역 모두를 비공유

-멀티 쓰레드 : (데이터 영역,힙,스택) 영역중 스택 영역만 비공유

 

 

멀티 쓰레딩 장점 

-프로세스 생성은 많은 시간과 자원을 소비한다.

-이러한 단점을 최소화 시킨 일종의 경량화된 프로세스 = 쓰레드를 만들게 된 것이다.

-멀티 쓰레드에서 쓰레드간 스택 영역만 비공유하고, 데이터 영역과 힙영역을 공유 한다.

-쓰레드의 생성 및 컨텍스트 스위칭은 프로세스 생성 및 컨텍스트 스위칭 보다 빠르다

-멀티 쓰레드 컨텍스트 스위칭 시 데이터 영역과 힙을 비울 필요가 없다.

-데이터 영역과 힙 영역을 통해 데이터 교환이 가능하다.

 

 

 

멀티 쓰레딩 의 단점

-멀티 프로세스 기반으로 프로그래밍할 때는 프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 동시 접근하는 일이 없다.

멀티 쓰레딩을 기반으로 할때는 동시 접근하는 자원에 대한 부분을 신경 써야한다.

 

-서로 다른 쓰레드가 데이터와 힙 영역을 공유하기 떄문에, 동기화 문제가 발생할 수 있다.

-동기화를 통해  작업 처리순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤 하는 것이다.

-병목 현상이 발생하여 성능이 저하될 가능성이 높다.

-과도한 락으로 인한 병목 현상을 줄여야 한다.

-동기화가 필요한 부분에만 synchronized 키워드를 통해 동기화하는 것이다.

 

-불필요한 부분까지 동기화 할경우

 현재 쓰레드는 락을 획득한 쓰레드가 종료하기 전까지 대기해야한다.

 

-즉 동기화를 하고자 할 때는

메소드 전체를 동기화 할 것인가 아니면 특정 부분만 동기화 할 것인지 고민 해야한다.

 

 

임계 영역

- 둘이상의 쓰레드가 공유 자원에 동시에 접근하면 문제가 발생할 수 있다.

이런 문제를 일으킬 수 있는 코드블록을 임게영역이라고 한다.

 

동기화 방법

-뮤텍스

자룸쇠를 걸어 잠구는 방법

공유 자원의 데이터를 여러 쓰레드가 접근 하는 것을 막는 것이다.

뮤텍스의 쓰레드 동기화 방법은 임계 영역에 들어가기 위해 이 뮤텍스 객체를 가지고 있어야 들어갈 수있다.

 

즉, 여러개의 쓰레드 중, 임계 영역으로 진입할 쓰레드가 뮤텍스를 갖고 임계영역에서 사용하고, 나오면 다시 반납한다.

다음 진입을 희망하는 쓰레드가 뮤텍스를 얻어서 진입할 수 있다.

 

 

 

-세마포어

뮤택스와 비슷하지만, 접근 순서 동기화에 더 관련이 있다.

뮤텍스가 여러개 인 것과 동일하며, count를 통해 이를 제어한다.

총 5개의 세마포어가 있다고 가정하면, 다른 프로세스에서 해당 세마포어를 쓰면 이 count수가 감소,

전부 소비하였으면, 세마포어를 가진 프로세스가 작업을 종료하여, 세마포어를 반납하면 이를 다시 사용할 수 있다.

 

 

-모니터

자바에서는 모든 객체는 Object객체를 상속 받는다, 이 클래스에서는 wait,nofityAll,notify 메소드를 가지고 있는데

이를 Condition Variables 역할이라고 보면 된다.

 

모든 자바 객체는 Monitor를 가지고있다, 자바에서는 Mutual Exclusion 해결을 위한 구현체로, Synchronizaion 키워드가 있다.

만약 어떤 메소드가 이 키워드가 선언이 되어있고 쓰레드가 이미 락을 획득해서 임계영역 수행중이라고 가정한다면,

다른 쓰레드는 동일 메소드를 수행하기 위해 락을 획득해야한다. 락이 반환 될때까지 기다리는데, 이때 사용되는게 Monitor이다.

 

쓰레드 가 락을 반환하면, 다른 쓰레드는 기다렸다가 락을 획득하게 된다.

 

 

모니터 , 뮤텍스 vs 세마 포어

1개와 다중의 쓰레드 진입 가능 차이

 

모니터 , 뮤텍스 차이

뮤텍스는 다른 프로세스간에 동기화를 위해서 사용된다.

반면 모니터는 하나의 프로세스 내 다른 쓰레드들 간에 동기화를 위해 사용된다.

 

 

 

 

 

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] 모니터  (0) 2022.04.08
[Java] 문맥 교환  (0) 2022.04.08
[Java] Restful API  (0) 2022.04.07
데드락이란?  (0) 2022.04.07
[Java] JUnit4 와 JUnit5차이  (0) 2022.04.07