알아두어야 할 용어
- 제어권
제어권은 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
- 동시성
함수 A와 함수 B가 동시에 진행되는 것(처럼 보이는 것). 그러기 위해서는 특정 함수 A가 다른 함수 B의 결과값에 의존하는지가 중요하다.
동기와 비동기
- 동기(Synchronous)
호출하는 함수 A가 호출되는 함수 B의 작업을 완료 후 리턴을 기다리거나, 바로 리턴 받더라도 미완료 상태이라면 작업 완료 여부를 스스로 계속 확인하며 신경쓴다.
(함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것)
- 비동기(Asynchronous)
함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.
블로킹 논블로킹
- 블로킹(Blocking)
A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.
- A 함수가 B 함수를 호출하면 B에게 제어권을 넘긴다.
- 제어권을 넘겨받은 B는 열심히 함수를 실행한다. A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.
- B 함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.
- 논블로킹(Nonblocking)
A 함수가 B 함수를 호출해도 제어권은 그대로 자신이 가지고 있는다.
- A 함수가 B 함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
- 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 |