동기, 비동기 & 블로킹, 논블로킹

9mond·2023년 9월 21일
0
post-thumbnail

cs project

● 동기(Synchronous)와 비동기(Asynchronous)

  • 동기 : 요청한 작업에 대한 완료여부로 순차적으로 처리

  • 비동기 : 작업에 대한 완료여부를 따지지 않음. 때문에 자신의 다음 작을 그대로 수행.

  • 차이점 : 작업 순서 처리의 차이

● 동기/비동기와 블로킹/논블로킹

  • 두 개념의 표현형태는 비슷해보이지만, 서로 다른 차원에서 작업의 수행 방식을 설명하는 개념이다.
  • 동기/비동기 : 요청한 작업에 대한 완료여부을 신경써서 "작업을 순차적으로 수행할지"에 대한 관점
  • 블로킹/논블로킹 : "현재 작업이 block(차단, 대기) 되느냐"에 따라 다른 작업을 수행할 수 있는지에 대한 관점

● 동기/비동기, 블로킹/논블로킹을 혼동하는 이유

  • javascript를 배울 떄 setTimeout과 같은 함수를 "비동기 함수"라고 배워서

● 동기/비동기 + 블로킹/논블로킹 조합

  • Sync Blocking (동기 + 블로킹)
    -> Sync Blocking 조합은 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고 (Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 (Sync) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주는 경우에 활용할 수 있다.
    -> 장점 : 작은 데이터를 처리하거나 파일 하나를 읽고 쓰는 경우에는 Sync Blocking 방식이 더 간단하고 직관적일 수 있다.
    -> 단점 : 작업량이 많거나 시간이 오래 걸리는 작업을 처리해야 하는 경우에는 작업이 끝날 때까지 다른 작업을 처리하지 못하므로, 전체 처리 시간이 오래 걸리게 되어 비효율적이게 되게 된다.
    -> 활용 : C나 JAVA의 코드 실행 후 커맨드에서 입력을 받는 경우가 이에 해당

  • Async Blocking (비동기 + 블로킹)
    -> Async Non Blocking 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 (Async) 방식이다. 다른 작업의 결과가 자신의 작업에 영향을 주지 않은 경우에 활용할 수 있다.
    -> 장점 : 작업량이 많거나 시간이 오래 걸리는 작업을 처리해야 하는 경우에 적합
    -> 활용 : 웹 브라우저의 파일 다운로드, 대용량 데이터를 처리하거나 많은 요청을 처리하는 서비스에서는 Async Non Blocking 방식을 사용하여 한 작업이 처리되는 동안 다른 작업을 처리할 수 있으므로 전체 처리 시간을 줄일 수 있어 어플리케이션 처리 성능을 향상시킬 수 있게 된다.

  • Sync Non-Blocking (동기 + 논블로킹)
    -> Sync Non-Blocking 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행 하는 (Sync) 방식이다.
    -> 활용 : 게임에서 맵을 이동할때 우선 맵 데이터를 모두 다운로드 해야 할 것이다. 그동안 화면에는 로딩 스크린이 뜬다. 이 로딩 스크린은 로딩바가 채워지는 프로그램이 수행하고 있는 것

  • Async Non-Blocking (비동기 + 논블로킹)
    -> sync Blocking 조합은 다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는 (Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식이다. Async-blocking 의 경우는 실무에서 잘 마주하기 쉽지 않아 다룰일이 거의 없다. 그래서 그냥 넘어가도 크게 문제는 없다.

  • 이러한 동기/비동기와 블로킹/논블로킹의 조합은 프로그램이 작동하는 방식에 영향을 미치는 중요한 요소다. 어떠한 요소를 조합하여 사용하느냐에 따라 프로그램의 성능과 효율성을 높일 수 있기 때문이다.

  • 대표적인 예로 Node.js 를 들 수 있다. Node.js에서 비동기 방식으로 파일을 읽거나 네트워크 요청을 보낼 때는 비동기 & 논블로킹 방식을 사용하여 작업이 완료될 때까지 다른 작업을 수행할 수 있도록 한다. 반면에, Node.js에서 코드 실행 시점을 늦춰주거나 순차적인 의존성이 있는 작업을 처리할 때는 동기 & 블로킹 방식을 사용하여 작업의 순서와 타이밍을 제어할 수 있도록 한다.

  • 개념들을 명확히 알고 있으면 Node.js의 동작 원리와 장점을 더 잘 이해하고 활용할 수 있을 것이다. 따라서 동기/비동기와 블로킹/논블로킹의 개념을 이해하고 적절한 조합을 선택하는 것이 중요하다.

▷ 참고
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

profile
개발자

0개의 댓글

관련 채용 정보