해결된 질문
작성
·
309
1
안녕하세요.
강의 학습 + 커뮤니티 질문 읽어보다가 궁금한 내용이 있어 올리게 되었습니다.
보조기억장치 (ex. HDD) 에 저장된 프로그램이 메모리에 적재되어 커널 영역에 PCB가 생성되면서 프로세스가 되고 커널 스레드가 1개 이상 생성되는 걸로 알게 되었는데요.
Java의 JVM이나 Nginx 등 Linux 에서 "ps -ef" 커맨드로 찍어보니 커널 스레드가 여러 개 생성되어 있는 경우에 궁금한 게 하나 있습니다.
해당 강의 질문 중에 멀티 스레드 모델에 관한 감자님의 답변을 읽어보니 User-Level Thread, Kernel-Level Thread, Multi-Level Thread (Combined) 있다고 답변하셨는데
User-Level Thread는 커널 스레드 1개와 다수의 유저 스레드가 연결되어 사용되어 한 개의 스레드가 입출력 I/O로 Block 되면 다른 유저 스레드도 Block이 되어 프로세스 상태가 대기 상태로 바뀌고 해당 프로세스 PCB가 대기 큐로 이동하는 걸로 이해했습니다.
User-Level Thread를 제외한 Kernel-Level, Multi-Level Thread에서는 커널 스레드 1개가 입출력 I/O로 Block 되어도 다른 커널 스레드로 사용자 스레드가 연결되어 모든 스레드가 Block 되지 않는다. --> 여기에서 그럼 입출력 I/O로 특정 커널 스레드가 Block 되면 입출력 대기 큐에 해당 프로세스 PCB가 있고 Block 되지 않은 커널 스레드도 있으니 실행을 마치면 준비 큐에도 해당 프로세스가 PCB가 중복으로 있다고 이해해야 할까요?
질문을 조금 어렵게 해서 죄송합니다...
답변 2
1
답변 감사합니다.
자세히 찾아보니 프로세스 상태와 관련해서 대기 큐, 준비 큐에 PCB가 있는 건 대부분 Single Thread, Multi Process 환경으로 전제하고 설명한 것이더군요.
Multi Thread, Multi Process 환경에서는 스레드 별로 레지스터 값을 저장해야 하므로 TCB (Thread Control Block)이 존재하고 TCB는 PCB에 저장되어 있다고 하네요.
따라서, 준비 큐나 대기 큐에는 PCB 대신에 TCB가 연결 리스트 구조로 저장된다고 합니다.
구글링으로 검색한 정보다 보니 맞을 지 모르겠네요 ㅠ-ㅠ
0
안녕하세요 akgkfk3님!
스레드에 관해서 궁금증이 생기셨나보군요 ㅎㅎ
이 글을 읽어보셨다고 생각하고 설명드리겠습니다!
링크에서 말한 JVM의 스레드 모델은 One to One, Many to One, Many to Many이 있습니다.
여기서 One to One 모델은 유저 스레드와 커널 스레드가 1:1 매핑되므로 따로 설명이 필요 없을 것 같고
Many to One은 다수의 유저 스레드가 하나의 커널 스레드에 매핑되므로 하나의 유저 스레드가 Block 되면 나머지 모든 스레드가 Block 된다는 문제가 있습니다.
저는 akgkfk3님 질문의 마지막 문단에서 Many to Many를 말씀하신걸로 이해했습니다.
Many to Many 모델은 여러 사용자 스레드가 여러 커널 스레드와 매핑됩니다.
여기서 여기에서 그럼 입출력 I/O로 특정 커널 스레드가 Block 되면 입출력 대기 큐에 해당 프로세스 PCB가 있고 Block 되지 않은 커널 스레드도 있으니 실행을 마치면 준비 큐에도 해당 프로세스가 PCB가 중복으로 있다고 이해해야 할까요?
라는 질문이 나올 수 있는데
오라클 문서에 따르면 Many to Many 모델에서 커널은 활성화된 스레드만 관리한다고 합니다.
커널 스레드는 운영체제가 관리하므로 PCB가 대기 큐와 준비 큐에 동시에 존재하는 일은 없습니다.
다만 JVM 내부에서 적절하게 사용자 스레드와 커널 스레드를 매핑했으므로 하나의 유저 스레드로 인해 어떤 커널 스레드가 Block이 됐을 때 또 다른 유저 스레드는 Block되지 않은 다른 커널 스레드를 이용하는 방식으로 성능을 향상시킨 것 같습니다!
궁금증이 해결되셨나요? 😊
찾아보신 정보가 맞습니다!
정확해서 더 드릴 말씀이 없네요 ㅎㅎ
멋지십니다. 👍