[Java] 멀티 스레드 모델에 대해서
들어가기 전
이번 포스팅에서는 멀티스레드 모델에 대해 알아보겠습니다. 스레드 모델에는 일대일, 일대다, 다대다가 있습니다.
프로세스와 스레드의 차이점에 대해 궁금하신 분은 아래 포스팅을 보시는 것을 추천드립니다.
https://hoestory.tistory.com/73
[운영체제] 프로세스 & 스레드에 대하여
프로세스 운영체제에 의해 파일 시스템에 설치되어 있는 파일을 프로그램이라고 부릅니다. 프로세스는 프로그램의 실제 실행의 의미하며 프로그램 파일을 실행함으로써 프로그램 데이터들이
hoestory.tistory.com
멀티스레드 모델에 대해서 설명하기 전에 사용자 수준 스레드와 커널 수준 스레드에 대해 먼저 알아보겠습니다.
사용자 수준 스레드
사용자 수준 스레드는 JVM에서 생성하고 관리하는 스레드입니다. 그래서 애플리케이션에서만 사용가능하고 운영체제에 접근을 못합니다.
접근을 하기 위해서는 커널 수준 스레드로 전환을 해야 합니다.
이때 커널 수준 스레드로 전환하는 방법은 시스템 콜을 호출하여 사용자 수준 스레드에서 커널 수준 스레드로 전환을 합니다.
시스템 콜을 하는 메서드에는 native 키워드가 붙어있습니다.
사용자 수준 스레드 생성
public class BlogThread { public static void main(String[] args) { Thread userModeThread = new Thread(new Runnable() { @Override public void run() { System.out.println("사용자 수준 스레드"); } }); } }
시스템 콜을 호출하기 위한 native가 붙은 메서드
- sleep
- wait
- notify
- start
스레드를 학습하면서 많이 접할 수 있는 메서드로 나열을 해놨습니다. 이외의 메서드들을 확인하고 싶으신 분은 Thread 클래스에서 확인하시면 좋을 거 같습니다.
해당 메서드를 호출을 하면 사용자 수준 스레드에서 커널 수준 스레드로 전환이 됩니다.
sleep


wait


notify

Start


커널 수준 스레드
커널 수준 스레드는 스레드와 관련된 모든 작업을 관리합니다. PCB, TCB에 대한 정보도 관리합니다. 커널 스레드는 OS 스케줄러에 의해서 스케줄링되고 CPU는 커널에서 생성된 스레드를 실행합니다.
지금까지 사용자 수준 스레드와 커널 수준 스레드에 대해서 알아보았습니다. 이제부터 멀티스레드 모델 종류에 대해서 알아보겠습니다.
멀티스레드 모델 종류
- 일대일
- 다대일
- 다대다
일대일 모델
사용자 수준 스레드와 커널 수준 스레드가 일대일 매핑 되는 모델입니다. (자바에서 Native Thread가 이 모델에 해당)

- 커널이 전체 프로세스와 스레드 정보를 유지해야 하기 때문에 컨텍스트 스위칭 시 사용자모드에서 커널모드로 전환해서 스케줄링하는 등의 오버헤드가 발생합니다.
- 자원 한정으로 인해 스레드를 무한정 생성할 수 없어 대안으로 스레드 풀을 활용하기도 합니다.
- 스레드 중 한 개가 대기 상태가 되더라도 다른 스레드를 실행할 수 있습니다.
- 스레드 단위로 CPU를 할당하기 때문에 멀티 코어를 활용한 활용한 병렬 처리가 가능합니다.
다대일 모델
여러 개의 사용자 수준 스레드가 하나의 커널 수준 스레드와 매핑되는 모델입니다.(자바 초기버전의 Green Thread가 이 모델에 해당)

- 일대일 모델과 달리 커널의 개입 없이 사용자 수준 스레드끼리 컨텍스트 스위칭이 발생하기 때문에 오버헤드가 적습니다.
- 스케줄링 또는 동기화를 하려고 커널을 호출하지 않으므로 커널 영역으로 전환하는 오버헤드가 줄어듭니다.
- 커널 영역이 사용자 영역을 개별 스레드 단위가 아닌 단일 스레드의 프로세스 단위로 프로세서를 할당하기 때문에 멀티 코어를 활용한 병렬처리를 할 수 없습니다.
- 하나의 스레드가 I/O 작업이 발생하면 모든 스레드들이 Block이 발생하여 프로세스 자체를 Block 합니다.
다대다 모델
여러 개의 사용자 수준 스레드를 같은 수 또는 그보다 작은 수의 커널 수준 스레드를 매핑하는 모델입니다.

- 각 커널 수준 스레드가 한 개 이상의 사용자 수준 스레드와 매핑됩니다.
- 다대일, 일대일 모델의 단점을 어느 정도 해결하여 개발자는 필요한 만큼 사용자 수준 스레드를 생성할 수 있고 커널 수준 스레드가 멀티 프로세서에서 병렬로 수행할 수 있습니다.
- 사용자 수준 스레드가 I/O 시스템 콜을 발생시켰을 때 커널이 다른 스레드의 수행을 스케줄링할 수 있습니다.
'Java' 카테고리의 다른 글
[Java] 동시성 이슈 개념과 발생하는 동작 과정 (1) | 2024.07.26 |
---|---|
[Java] 스레드의 상태와 생명주기 (0) | 2024.07.23 |
[Java] Static Block 실행 시점 (2) | 2024.03.15 |
[Java] ConcurrentModificationException 원인 및 해결 방법 (0) | 2022.11.22 |
[Java] this란? (0) | 2022.05.01 |
댓글
이 글 공유하기
다른 글
-
[Java] 동시성 이슈 개념과 발생하는 동작 과정
[Java] 동시성 이슈 개념과 발생하는 동작 과정
2024.07.26들어가기 전이번 포스팅에서는 동시성 이슈에 대해 알아보겠습니다. 동시성 이슈를 알아보기 전에 싱글 스레드와 멀티 스레드 환경에 대해서 알아보겠습니다. 싱글스레드와 멀티스레드 싱글 스레드(Single Thread) 싱글 스레드는 애플리케이션이 스레드 하나로만 실행되는 것을 의미합니다.아래와 같이 자바 애플리케이션을 실행하면 싱글 스레드로 동작을 합니다. public class SingleThread { public static void main(String[] args) { System.out.println("싱글 스레드 실행");} 싱글 스레드는 작업을 순차적으로 실행시킵니다.멀티 스레드(Multi Thread)멀티 스레드는 싱글 스레드와 달리 애플리케이션이 여러 개의 스레드로 실행되는… -
[Java] 스레드의 상태와 생명주기
[Java] 스레드의 상태와 생명주기
2024.07.23들어가기 전이번 포스팅에서는 스레드의 상태와 생명주기에 대해서 알아보겠습니다.해당 내용을 알아보면서 "사용자 수준 스레드"와 "커널 수준 스레드"라는 단어가 나오는데 해당 단어들이 무엇을 의미하는지 아래 포스팅을 통해 알게 되고 난 뒤에 이번 내용을 읽으시는 것을 추천드립니다. https://hoestory.tistory.com/81 [Java] 멀티 스레드 모델에 대해서들어가기 전 이번 포스팅에서는 멀티스레드 모델에 대해 알아보겠습니다. 스레드 모델에는 일대일, 일대다, 다대다가 있습니다. 프로세스와 스레드의 차이점에 대해 궁금하신 분은 아래 포스hoestory.tistory.com 먼저 스레드의 상태에 무엇이 있는지 알아보고 스레드의 생명주기에 대해서 알아보겠습니다. 스레드의 상태에서는 간략하게 무… -
[Java] Static Block 실행 시점
[Java] Static Block 실행 시점
2024.03.15들어가기 전 이번 포스팅에서는 자바에 있는 Static Block이 어떤 시점에 실행이 되는지에 대해 알아보겠습니다. Static Block은 아래와 같이 코드를 작성해 주시면 됩니다. public class StaticBlock { static { 구현부 } } Static Block를 알아보기 전에 Static이 무엇인지에 대해 알아보겠습니다. Static 자바에서는 Static 키워드를 사용하여 정적 변수, 정적 메서드를 만들 수 있습니다. 이 둘을 묶어서 정적 멤버라고 불립니다. Static은 JVM 런타임 데이터 영역 중 메서드 영역 또는 Static 영역에 할당이 됩니다. Static영역에 할당된 값들은 모든 객체가 공유하여 어디서든지 참조할 수 있습니다. 그리고 프로그램이 시작될 때 메모리에… -
[Java] ConcurrentModificationException 원인 및 해결 방법
[Java] ConcurrentModificationException 원인 및 해결 방법
2022.11.22들어가기 전 필자가 이 내용을 다루게 된 이유는 업무를 보다가 ArrayList로 담긴 데이터를 순회하면서 삭제하다가 ConcurrentModificationException 예외를 접하게 되었습니다. 자바를 여태 하면서 IndexOutOfBoundsException는 많이 봤어도 ConcurrentModificationException라는 예외는 처음 봐서 이거에 대해 알아보고 싶었고 그리고 이 문제를 겪는 사람들이 많을 거라고 생각되어 다루게 되었습니다. 이제 문제의 원인이랑 해결방법에 대해서 알아보겠습니다. 원인 원인에 대해 먼저 알아보기 전 원인이 된 코드를 먼저 보겠습니다. public class Test { public static void main(String[] args) { List fi…
댓글을 사용할 수 없습니다.