작성
·
292
1
강의를 수강하던중 Select 모델과 (Non)blocking의 차이점에 궁금증이 생겨 질문을 남기게 되었습니다.
Select를 사용하기전 Blocking, Non-blocking 방식에서도 해당 소켓의 정상/비정상 상태를 확인하여 패킷을 전송하는 것으로 이해하였습니다.
그중 Non-blocking은 명칭적으로는 정상/비정상에 큰 신경을 쓰지 않지만 소켓의 상태가 정상/비정상인지 확인하는 과정을 거치기에 자원 손실이 일어나는 것으로 이해됐습니다.
이런 단점을 해결하기 위해 Select 모델을 이용해 send, write에 소켓을 저장해 해당 소켓이 정상인지, send, recv 중 어떤 소켓을 진행해야 할지, 준비되었는지 판단하는 과정이 Blocking과 Non-blocking에서의 상태 파악 과정과 비슷하다는 생각이 들어 Select 모델을 사용하는게 별 다른 이점이 없지 않나? 라는 생각이 들어 질문을 남기게 되었습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. Kimbab님, Select 모델에 대해 궁금증을 가지고 계셔서 질문해주셨군요.
Select 모델을 사용하는 주된 이유는 동시에 다수의 소켓을 효율적으로 관리할 수 있기 때문입니다. Blocking과 Non-blocking 모델에서는 각각의 소켓을 개별적으로 관리해야 하는 반면, Select 모델을 사용하면 하나의 스레드에서 여러 소켓의 상태를 동시에 모니터링할 수 있습니다. 이는 시스템 자원의 관리 측면에서 매우 효율적이며, 소켓이 준비되었을 때만 작업을 수행하기 때문에 불필요한 자원 소모를 줄일 수 있습니다.
Blocking 모델에서는 특정 작업(예: recv)에 대해서 소켓이 준비될 때까지 기다려야 하고, Non-blocking 모델에서는 소켓의 상태를 계속해서 체크해야 하는 문제가 있습니다. 그러나 Select 모델은 여러 소켓 중에서 준비된 소켓만 감지하고 처리할 수 있어, 많은 수의 클라이언트를 다루는 서버 개발에서 유용하게 사용됩니다. 따라서, Select 모델은 Non-blocking의 장점을 살리면서도, 여러 소켓을 효과적으로 다룰 수 있는 방식으로 활용됩니다.
다만, Select 모델에는 fd_set의 크기 제한이나, 대규모 연결에서 성능 저하 문제가 있어 epoll 같은 더 발전된 I/O 멀티플렉싱 기법을 사용하기도 합니다. Select 모델의 이점이 상황에 따라 더 뛰어나거나, 다른 기법이 필요할 수 있다는 점을 이해하시면 좋을 것 같습니다.
추가적으로 궁금한 점이 있거나 더 자세한 설명이 필요하시면, 언제든 질문 부탁드립니다.