본문 바로가기
CS

22.11.18 / CS특강 / 동기 비동기

by 노믹 2022. 11. 20.

알아두어야 할 용어

  • 제어권

제어권은 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.

  • 동시성

함수 A와 함수 B가 동시에 진행되는 것(처럼 보이는 것). 그러기 위해서는 특정 함수 A가 다른 함수 B의 결과값에 의존하는지가 중요하다.

 

동기와 비동기

  • 동기(Synchronous)

호출하는 함수 A가 호출되는 함수 B의 작업을 완료 후 리턴을 기다리거나, 바로 리턴 받더라도 미완료 상태이라면 작업 완료 여부를 스스로 계속 확인하며 신경쓴다.

(함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속  확인하면서 신경쓰는 것)

 

  • 비동기(Asynchronous)

함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.

함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.

 

블로킹 논블로킹

  • 블로킹(Blocking)

A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.

  1. A 함수가 B 함수를 호출하면 B에게 제어권을 넘긴다.
  2. 제어권을 넘겨받은 B는 열심히 함수를 실행한다. A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.
  3. B 함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.
  • 논블로킹(Nonblocking)

A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고 있는다.

  1. A 함수가 B 함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
  2. A 함수는 계속 제어권을 가지고 있기 때문에 B 함수를 호출한 이후에도 자신의 코드를 계속 실행한다.

블로킹과 논블로킹, 동기와 비동기 비교

  • 동기+블로킹 (Sync-Blocking)

함수 A는 함수 B의 리턴값을 필요로 한다(동기).

그래서 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄때까지 기다린다(블로킹).

예시

선배 : 이것좀 부탁해요~

나 : 네 바로 끝나니까 기다려주세요

선배 : (아무것도 안하고 기다림, 언제끝나는지 궁금)

나 : (타닥타닥..)

선배 : (지켜보는중)

선배 : 오 끝났네요!

 

  • 동기+논블로킹 (Sync-Nonblocking)

A 함수는 B 함수를 호출한다. 이 때 A 함수는 B 함수에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다(논블로킹).

그런데 A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 B 함수에게 함수 실행을 완료했는지 물어본다(동기).

예시

선배 : 이것좀 부탁해요~

나 : 넵 (타닥타닥..)

선배 : (할거 하다가) 다하셨나요?

나 : 잠시만요

선배 : (할거 하다가) 다하셨나요?

나 : 네 여기요~

 

  • 비동기+블로킹 (Async-Blocking)

Async-blocking의 경우 sync-blocking과 성능의 차이가 비슷하기 때문에 사용하는 경우는 거의 없다.

A 함수는 B 함수의 리턴값에 신경쓰지 않고, 콜백함수를 보낸다(비동기).

그런데 B 함수의 작업에 관심없음에도 불구하고 A 함수는 B 함수에게 제어권을 넘긴다(블로킹).

따라서 A 함수는 자신과 관련 없는 B 함수의 작업이 끝날 때까지 기다려야 한다.

예시

선배 : 이것좀 부탁해요~

나 : 네 바로 끝나니까 기다려주세요

선배 : (아무것도 안하고 기다림, 언제끝나는지 관심없음)

나 : (타닥타닥..)

나 : 끝났어요!

 

  • 비동기+논블로킹 (Async-Nonblocking)

A 함수는 B 함수를 호출한다.

이 때 제어권을 B 함수에 주지 않고, 자신이 계속 가지고 있는다(논블로킹).

따라서 B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다.

그리고 B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백 함수를 실행한다(비동기).

예시

선배 : 이것좀 부탁해요~

나 : 넵 다하고 말씀드릴게요! (타닥타닥..)

선배 : (할일 하는 중)

나 : 끝났어요 여기요!

 

JavaScript의 비동기

JavaScript는 싱글스레드 논블로킹 모델의 환경에서 실행됩니다.

  • 호출 스택: 동기코드를 담당. 함수들이 실행되는 데이터공간
  • 백그라운드: 비동기 작업을 실행하는 공간
  • 태스크 큐: 비동기 작업이 끝나서 이후 실행돼야 할 콜백 함수들이 줄을 서서 기다리고 있는 공간. 바로 실행되지 않고 호출 스택이 비워지면 이벤트 루프에 의해 호출 스택으로 옮겨져서 실행된다.
  • 이벤트 루프: 호출 스택이 비어 있는게 확인 되면 이벤트 루프는 태스크 큐에서 함수를 하나씩 꺼내(들어온 순서로 꺼냄) 호출 스택으로 옮긴다.

활용 예시

타이머(setTimeOut), 사용자와의 인터럭션(키보드/마우스 등 장치의 입출력), 네트워크 요청 등

'CS' 카테고리의 다른 글

22.11.25 / CS특강 / UDP  (0) 2022.11.29
22.11.25 / CS특강 / OSI 7계층  (0) 2022.11.29
22.11.18 / CS특강 / 프로세스 스레드  (0) 2022.11.19
22.11.11 / CS특강 / CPU  (0) 2022.11.19
레지스터의 종류  (0) 2022.11.19