티스토리 뷰

공부

동기와 비동기, 블록킹과 논블록킹

코딩하는 둥아 2023. 1. 23. 15:39
728x90

 

동기와 비동기는 호출되는 함수의 작업 완료 여부를 신경쓰냐에 대한 개념이고,
블록킹과 논블록킹은 코드를 실행할 수 있는 권리인 제어권이 누구에게 있느냐에 대한 개념이다.

 

👉 동기와 비동기

호출되는 함수의 작업 완료 여부를 신경쓰냐가 최대 관심 여부!

함수 실행과 리턴이 순차적인 흐름을 따르느냐, 따르지 않느냐

 

동기 (Synchronous)

함수 A가 함수 B를 호출하고, B의 작업 완료 후 리턴을 기다리거나 B의 작업 완료 여부를 스스로 계속 확인하며 신경쓰면 Synchronous

 

비동기 (Asynchronous)

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

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

 

👉 블록킹과 논블록킹

처리되어야 하는 작업이, 전체적인 작업의 흐름을 막느냐 막지 않느냐에 최대 관심!

즉 제어권이 누구한테 있느냐가 관심사이다.

제어권

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

 

블록킹 (Blocking)

A함수가 B함수를 실행하면, 제어권을 A에서 B로 넘겨준다.

제어권은 넘겨받은 B는 함수를 실행하지만, A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 멈춘다.

B는 실행이 끝나면 자신을 호출한 A에게 다시 제어권을 돌려준다.

논블록킹 (Non-Blocking)

A함수가 B함수를 실행해도 제어권은 그대로 가지고 있는다.

따라서 A함수는 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행할 수 있다.

 

 

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

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

1. Sync-Blocking

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

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

Sync-Blocking 예시

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹 됩니다.
...

파일을 모두 읽기 전까지 아래의 코드는 실행되지 않습니다.

 

2. Sync-Nonblocking

A함수는 B함수를 실행하더라도 제어권을 주지 않고, 자신의 코드를 계속 실행한다. (Nonblocking)

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

예)

게임에서 맵을 이동할 때 제어권은 여전히 나에게 있지만, 맵 데이터를 계속 물어보면서 로드율을 표시한다.

 

3. Async-Blocking

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

하지만 A는 B함수의 작업 완료 여부에 관심이 없음에도 불구하고, B에게 제어권을 넘긴다.(Blocking)

따라서 A는 B에게 관심이 없지만 B함수의 작업이 끝날때까지 기다려야 한다.

실수가 아닌 이상, 대체로 잘 사용하지 않는 방법이다.

 

4. Async-Nonblocking

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

A함수는 B함수를 실행하더라도 제어권을 주지 않고, 자신의 코드를 계속 실행한다. (Nonblocking)

B함수는 자신의 작업이 끝나면 A함수가 보낸 콜백 함수를 실행한다.

 

예)

아래 예시의 경우 비동기 + 논블로킹으로 파일을 읽는 경우입니다.

따라서 콜백함수 내의 console.log보다 moreWork()함수가 먼저 실행될 것입니다.

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
moreWork(); // console.log 이전에 실행될 것입니다.

 

 

참고링크

https://nodejs.org/ko/docs/guides/blocking-vs-non-blocking/

 

블록킹과 논블록킹 살펴보기 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

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

 

👩‍💻 동기 & 비동기 / 블로킹 & 논블로킹 💯 완벽 이해하기

동기 & 비동기 vs 블로킹 & 논블록킹 개념 이 개념들을 처음 접하거나 컴퓨터 공학에 대해 잘 모르는 사람은 이 개념들이 서로 뭔가 연관이 있는 것으로 오해하기 쉽다. 아무래도 동기와 블록킹,

inpa.tistory.com

https://wildeveloperetrain.tistory.com/104

 

동기와 비동기, 블로킹과 논블로킹 개념 정리

'동기와 비동기, 블로킹과 논블로킹 - 비슷한 듯하면서도 비슷하지 않은 개념들' 프로그래밍을 하며 자주 접하게 되는 단어들이지만 개념적으로 명확하게 차이를 짚고 넘어간 적이 없었는데 이

wildeveloperetrain.tistory.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함