일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- querydsl
- JPA공부
- 스프링
- 기술면접공부
- 플러터 개발
- 알고리즘공부
- JPA예제
- nestjs스터디
- 자바공부
- JPA스터디
- K8S
- Kafka
- Flutter
- 자료구조공부
- 프로그래머스
- nestjs
- 스프링공부
- 코테공부
- JPA 공부
- 플러터 공부
- nestjs공부
- DDD
- 카프카
- 스프링부트
- 스프링 공부
- JPA
- Axon framework
- 코테준비
- 스프링부트공부
- 기술공부
- Today
- Total
DevBoi
[Java] 멀티 쓰레드란 본문
멀티쓰레드란?
멀티쓰레드란, 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화 하여
수행능력을 향상 시키는 것을 멀티쓰레딩이라고 한다.
하나의 프로그램에서 동시에 여러개의 일을 수행할 수 있도록 해주는 것이다.
멀티쓰레드를 사용하는 이유는?
-프로세스를 이용하여 동시에 처리하던 일을 쓰레드로 구현할 경우
메모리 공간과 시스템 자원소모가 줄어들게 된다.
-쓰레드 간의 통신이 필요한 경우 별도 자원을 이용하는 것이 아니라
전역 변수공간, 동적으로 할당된 공간인 힙영역을 이용하여 데이터를 주고 받을 수 있다.
-쓰레드의 문맥교환은 프로세스 문맥교환과는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다
-시스템의 처리량이 향상 되고 자원소모가 줄어들어 자연스럽게 프로그램의 응답 시간이 단축된다.
멀티 프로세스와 멀티 쓰레드의 차이
-멀티 프로세스 : (데이터 영역,힙, 스택) 영역 모두를 비공유
-멀티 쓰레드 : (데이터 영역,힙,스택) 영역중 스택 영역만 비공유
멀티 쓰레딩 장점
-프로세스 생성은 많은 시간과 자원을 소비한다.
-이러한 단점을 최소화 시킨 일종의 경량화된 프로세스 = 쓰레드를 만들게 된 것이다.
-멀티 쓰레드에서 쓰레드간 스택 영역만 비공유하고, 데이터 영역과 힙영역을 공유 한다.
-쓰레드의 생성 및 컨텍스트 스위칭은 프로세스 생성 및 컨텍스트 스위칭 보다 빠르다
-멀티 쓰레드 컨텍스트 스위칭 시 데이터 영역과 힙을 비울 필요가 없다.
-데이터 영역과 힙 영역을 통해 데이터 교환이 가능하다.
멀티 쓰레딩 의 단점
-멀티 프로세스 기반으로 프로그래밍할 때는 프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 동시 접근하는 일이 없다.
멀티 쓰레딩을 기반으로 할때는 동시 접근하는 자원에 대한 부분을 신경 써야한다.
-서로 다른 쓰레드가 데이터와 힙 영역을 공유하기 떄문에, 동기화 문제가 발생할 수 있다.
-동기화를 통해 작업 처리순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤 하는 것이다.
-병목 현상이 발생하여 성능이 저하될 가능성이 높다.
-과도한 락으로 인한 병목 현상을 줄여야 한다.
-동기화가 필요한 부분에만 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 |