인프런 커뮤니티 질문&답변

최낙도님의 프로필 이미지
최낙도

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

사용자 수준 스레드 & 커널 수준 스레드

다대일과 다대다 스레드 매핑 Block I/O시 질문

작성

·

256

0

다대일에서 한 스레드가 I/O 발생 시 프로세스 자체를 블록하기 때문에 모든 스레드들이 Block이 발생하는데

다대다에서는 한 스레드가 I/O 발생 시 커널이 다른 스레드의 수행을 스케줄할 수 있는 이유가 궁금합니다.

  1. 다대일도 다대다처럼 커널이 다른 스레드의 수행을 스케줄하면 안되나요?

  2. 왜 다대일만 프로세스 블록시키고 다대다는 프로세스를 블록시키지 않고 모든 스레드들이 Block이 발생하지 않나요?

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

  1. 다대일은 커널이 다에 해당하는 스레드의 존재자체를 모르기 때문에 전체를 블록하고 있다고 보시면 됩니다.

쉽게 표현하자면 커널은 다에 해당하는 프로세스의 스레드가 한개라고 알고 있다고 이해하셔도 됩니다.

2. 다대다는 말그대로 커널 스레드가 사용자 스레드를 관리하고 있기 때문에 스케줄러가 블록된 스레드는 대기하게 하고 CPU 를 점유하기 위해 준비중인 스레드가운데 하나를 선택해서 실행하도록 합니다.

그래서 커널은 프로세스 전체를 블록할 필요가 없고 대기하는 스레드와 실행중인 스레드들을 관리하면서 스케줄링한다고 보시면 됩니다.

안녕하세요. 커널은 사용자 수준 스레드에 대해 알지 못하고, 단일 스레드 프로세스 인 것 처럼 관리한다고 하셨는데요.

일대일 혹은 다대다 스레드 모델인 경우에도 커널이 단일 스레드 프로세스인 것 처럼 관리할 텐데, 여러 커널 스레드가 어떻게 사용자 스레드와 매핑되어 관리할 수 있는 지 궁금합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

님께서 질문하신 다대일과 다대다 스레드 매핑에서의 I/O 블로킹과 커널 스케줄링에 대한 응답은 아래와 같습니다.

  1. 다대일 모델에서 한 스레드가 I/O 작업을 수행하여 블록되면 해당 스레드가 실행되고 있는 프로세스 자체가 블록 상태에 빠집니다. 이는 다대일 모델의 제한점 중 하나로, 커널이 해당 프로세스의 다른 스레드를 스케줄하지 못하게 만듭니다. 이는 다대일 모델이 사용자 수준 스레드(User-Level Thread)를 사용하기 때문에 발생하는 현상입니다. 사용자 수준 스레드는 커널에서 직접 관리되지 않기 때문에 커널이 전체 프로세스를 블록시키게 됩니다.

  2. 다대다 모델에서는 사용자 수준 스레드와 커널 수준 스레드(Kernel-Level Thread)가 모두 존재합니다. 이 모델에서는 한 스레드가 블록 상태가 되면, 커널이 이를 인지하고 다른 스레드들을 통해 CPU가 여전히 작업을 수행할 수 있도록 스케줄링합니다. 커널 스레드가 여러 개 있기 때문에, 한 스레드의 블록 상태가 전체 프로세스를 블록시키지 않습니다. 즉, 다대다 모델은 다른 스레드가 블록되어 있을 때도 작업을 계속할 수 있는 능력을 가지고 있습니다.

Spring Boot 관련 문서에는 이와 직접 관련된 세부 정보는 포함되어 있지 않기 때문에, 일반적인 스레드 모델과 스케줄링에 관한 지식으로 답변을 드렸습니다. 만약 Spring Boot에서의 I/O 처리와 관련된 문의가 있으시다면, 제공된 Spring Boot Reference Documentation 링크를 참조하시면 도움이 될 수 있습니다.

최낙도님의 프로필 이미지
최낙도

작성한 질문수

질문하기