728x90
반응형
목차는 network 목차 에 있습니다.
[network 3편] 네트워크 동기 vs 비동기, 블로킹 vs 논블로킹 정리
동기 vs 비동기
- 동기 : 서비스 처리가 완료된 이후에 처리 결과를 알 수 있는 방식을 동기식 호출 이라고 합니다.
- 비동기 : 실제 서비스 처리는 스레드를 만들어 별도로 처리하게 하고, 응답을 줍니다. 클라이언트는 응답을 기다릴 필요 없이 다른 작업을 수행할 수 있고, 작업을 다 끝마친 후, 요청한 서비스가 끝났는지 확인할 수 있습니다.
네트워크 블로킹 vs 논블로킹
- 소켓의 동작 방식에 따라 블로킹, 논블로킹 모드로 나뉩니다.
블로킹
- 요청한 작업이 성공하거나 에러가 발생하기 전까지는 응답을 돌려주지 않습니다.
ServerSocket server = new ServerSocket(800); // 800번 포트
Socket socket = server.accept(); // 이 부분이 blocking 부분. client 가 요청올 떄까지 blocking
논블로킹 (non-blocking)
- 요청한 작업의 성공 여부에 상관없이 바로 결과를 돌려줍니다.
- 자바 Selector 를 통해 예를 들어보면 다음과 같습니다.
- Selector 는 자신에게 등록된 채널에 변경 사항이 발생했는지 검사하고 변경 사항이 발생한 채널에 대한 접근을 가능하게 해줍니다.
- blocking 방식의 경우 socket.accept 부분에서 blocking 이 걸리는 반면, selector 는 여러 요청이 들어오면 결과를 기다리지 않고, 스레드에 할당해서 결과를 리턴합니다.
- 간략히 selector 순서를 알아보면 다음과 같습니다.
- Socket Channel Selector 에 등록 --> Client 에서 Request 요청 --> Selector 에서 요청 받아 선택된 키셋 find --> 작업 스레드에 할당 (작업 처리가 넌블로킹 임) --> 클라이언트에 응답
블로킹 vs 논블로킹 비교
- 블로킹의 좋은점은 대용량 처리를 할 때, 좋습니다. 스레드 전환이 필요 없이 하나의 스레드가 끝날 때까지 계속 유지하니 대용량 처리에 좋습니다.
- 논블로킹의 좋은 점은 여러 요청이 들어왔을 때 좋습니다. 여러 요청이 들어온 것을 작업 스레드에 할당해서 처리합니다.
[기타] OS 레벨에서의 Blocking, Non-Blocking
Blocking
Client 에서 I/O 작업 (FILE, NETWORK 등) 을 요청하면 User Level 에서 System call 을 통해 제어권이 Kernel Level 로 넘어갑니다.
Context Switching 이 발생하며, Kernel I/O 작업이 끝나야 I/O 작업 결과를 반환합니다.
I/O 작업 결과를 반환할 때, Blocking 이 풀립니다.
Non-Blocking
I/O 작업 동안 User 프로세스의 작업을 중지시키지 않습니다. (Blocking 대안)
클라이언트 --> I/O 작업 요청 --> System Call --> Kernel 을 호출하지만 결과를 바로 반환합니다.
클라이언트에서는 결과를 받았지만 실제 처리가 될 때까지 계속 polling 합니다.
결론
- Sync, Async 는 결과에 대한 개념이고, Blocking, Non-Blocking 은 제어권에 대한 개념입니다.
Reference
'network' 카테고리의 다른 글
[network 2편] 쿠키, session, jwt 정리 (0) | 2022.08.29 |
---|---|
[network 1편] 로그인 관련 정리 (세션, JWT) (0) | 2022.07.16 |
쿠키, session, jwt 정리 (0) | 2021.11.07 |
TCP 연결 해제 (4 way hand shake) 설명 (0) | 2020.10.28 |
proxy 관련 정리 (0) | 2020.08.21 |
댓글