본문 바로가기
network

[network 3편] 네트워크 동기 vs 비동기, 블로킹 vs 논블로킹 정리

by 무대포 개발자 2022. 8. 29.
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

댓글