본문 바로가기
개발 공부/웹개발

동기(Synchronous)vs비동기(Asynchronous), block과 non-block 개념정리

by 크롱이크 2021. 6. 24.

동기(Synchronous)

  • 위의 그림처럼 하나의 task가 끝났을때 다음 task를 진행할 수 있다.
  • 작업 요청을 했을 때 요청의 결과값(return)을 직접 받는 것이다.
  • 요청의 결과값이 return값과 동일하다.
  • 호출한 함수가 작업 완료를 신경 쓴다.
  • 설계가 매우 간단하고 직관적이라는 장점이 있지만,
  • 요청에 따른 결과가 반환되기 전까지 아무것도 못하고 대기해야하는 단점도 있다..

비동기(Asynchronous)

  • 여기도 역시 위의 그림을 보면 동기와는 반대로 여러개의 태스크를 동시에 처리할 수 있다.
  • 작업 요청을 했을 때 요청의 결과값(return)을 간접적으로 받는 것이다.
  • 요청의 결과값이 return값과 다를 수 있다.
  • 해당 요청 작업은 별도의 스레드에서 실행하게 된다.
  • 콜백을 통한 처리가 비동기 처리라고 할 수 있다.
  • 호출된 함수(callback 함수)가 작업 완료를 신경 쓴다.
  • 요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행할 수 있다는 장점이 있다.
  • 단점은 동기식보다 설계가 복잡하고 논증적입니다.

밑에 있는 그림처럼 같은 시간이여도 비동기식 함수가 더 많은 요청을 수행할 수 있다.

또한 밑에 그림처럼 같은 태스크가 주어졌을때 여러개의 응답을 처리할 수 있는 비동기가 좀더 빠르게 일을 처리할 수 있다.

 

그렇다면 blocking과 non-blocking는 무엇이고, 동기와 비동기와는 어떤 차이가 있을까?

blocking vs non-blocking

blocking과 non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다.

blocking

  • 요청한 작업을 마칠 때까지 계속 대기한다.
  • 즉시 return한다.
  • return 값을 받아야 끝난다.
  • Thread 관점으로 본다면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용/대기 한다.

non-blocking

  • 요청한 작업을 즉시 마칠 수 없다면 즉시 return한다.
  • 즉시 리턴하지 않는다. (일을 못하게 막는다.)
  • Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.

 

사실 여기까지만 보면 블록은 동기같고, 넌블록은 비동기와 비슷해보인다.

하지만 이 두그룹은 서로 다른 것에 관심있다.

blocking과 non-blocking은 호출되는 함수가 바로 return하느냐 마느냐가 관심사이다.

non-blocking: 호출된 함수가 바로 return해서 호출한 함수에게 제어권을 넘겨주고, 호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있다.

blocking : 호출된 함수가 자신의 작업을 모두 마칠 때까지, 호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다

Synchronous와 Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사이다.

비동기: 호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면, 호출되는 함수가 전달받은 callback을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 않는다

동기: 호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나 호출되는 함수로부터 바로 return 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경 쓴다

 

일단 이 두개가 메인이니 두가지만 기억하자.

blocking + Synchronous

결과가 처리되어 나올때까지 기다렸다가 return 값으로 결과를 전달한다.

non-blocking + Asynchronous

작업 요청을 받아서 별도의 프로세서에서 진행하게 하고 바로 return(작업 끝)한다.
결과는 별도의 작업 후 간접적으로 전달(callback)한다.

 

출처

https://adrianmejia.com/asynchronous-vs-synchronous-handling-concurrency-in-javascript/

https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking

코드스테이츠 비동기파트

반응형

댓글