HSS

동기와 비동기, 블로킹과 논블로킹? 본문

JavaScript

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

EnSillee 2022. 11. 1. 01:43

1️⃣ Motive

기술 면접을 준비하면서 동기와 비동기, 블로킹과 논블로킹 개념에 대해 같거나 비슷한 것으로 오해를 하고 있었다는 걸 알게되었고 

정리를 함으로써 앞으로 혼동하는 일이 없도록 해야겠다.

 

2️⃣ 선행 지식

제어권 :

제어권이란 함수의 코드를 실행할 권리 비슷한 것

제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려줌.

 

대기한다는 개념 :

대기란 A 함수가 B함수를 호출 했을 때, A 함수가 B 함수의 결과값이 나오는 것을 기다리는 것을 의미.

 

3️⃣ 동기, 비동기

구분 방법

1) 명확한 실행 순서가 존재하는지 여부에 대한 관점에 따라 동기 / 비동기 구분

2) 요청하는 함수가 작업을 완료했는지 여부를 지속적으로 확인하느냐 안하느냐로 동기 / 비동기 구분

 

Notion

동기 : 현재 실행 중인 태스크가 종료할 때까지 다음에 실행될 태스크가 대기하는 방식

- 명확한 실행 순서 있음, 존재 (실행 순서 보장 O)

- 요청하는 쪽에서 작업 완료 여부를 지속적으로 확인

- 결과는 요청한 함수가 지켜보고 알게됨 

- 앞선 태스크가 종료할 때까지 이후 태스크들이 블로킹 됨

 

비동기 : 현재 실행 중인 태스크가 종료되지 않은 상태라 해도 다음 태스크를 곧바로 실행하는 방식

- 명확한 실행 순서 없음(실행 순서 보장 X)

- 요청하는 쪽에서 작업 완료 여부에 관심을 가지지 않음

- 결과를 요청받은 함수가 알려줌 

- 현재 실행 중인 태스크가 종료되지 않은 상태라 해도 다음 태스크를 곧바로 실행하므로 블로킹이 발생하지 않는다는 장점 있음

 

4️⃣ 블로킹과 논블로킹

구분 방법

1) 요청받는 함수가 제어권(함수실행권)을 언제 넘겨주느냐의 차이에 따라 블로킹 / 논블로킹 구분

2) 하나의 작업이 전체적인 흐름을 막느냐 안막느냐에 따라 블로킹 / 논블로킹 구분

 

Notion

블로킹 : 제어권을 가장 최근에 호출된 함수에게 넘김.

- A 함수가 B 함수를 호출하면, 제어권이 B함수에게 넘어감.

- 제어권을 받은 B함수가 실행되는 동안 A는 제어권이 없기 때문에 함수 실행을 멈추고 B함수가 끝나기까지 대기함.

- B함수가 끝나면 함수 B는 제어권을 A함수에게 돌려줌.

- 제어권을 받은 A함수는 이어서 함수를 실행함. 

 

즉, 작업 A를 진행 중에 다른 작업 B가 시작되면 작업 A를 멈춘 다음 작업 B가 끝날 때까지 대기하고 작업 B가 끝나면 작업 A를 이어서 진행

 

논블로킹 : 제어권을 넘기지 않음

- A 함수가 B 함수를 호출하면, B 함수는 실행되지만 제어권은 A 함수가 여전히 가지고 있음

- A 함수가 계속 제어권을 가지고 있기 때문에 B 함수를 호출한 이후의 코드를 계속해서 실행

 

5️⃣ 동기, 비동기, 블로킹, 논블로킹 예시(조별과제)

* 팀장 : 요청하는 함수, 조원 A : 요청받는 함수

 

🌠 동기 + 블로킹

요청하는 함수는 결과 나올때까지 요청받는 쪽의 진행상황을 계속 확인(동기)
요청받은 함수의 작업이 끝나야 제어권을 요청하는 함수에게 돌려줌(블로킹)

 

팀장 : 조원 A님, 여기 이 부분 자료조사 좀 부탁해요~

조원 A : 네 지금 바로 여기 있는 노트북(조별과제 모임 장소에 노트북 팀장꺼 하나 뿐임)으로 자료조사 시작할게요. 
팀장 : (어.. 그 노트북으로 발표 자료 만들던 중이었는데.. 말은 못하고 자료조사 끝날 때까지 옆에서 지켜보면서 계속 기다림.. 소심소심..)

조원 A: (열심열심🧑🏻‍💻)

팀장 : (지켜보는 중..)

팀장 : 오 자료조사 잘 끝나셨네요. 고생하셨어요. 저가 이어서 발표 자료 만들던거 이어서 만들게요(당당)

 

- 가장 많이 쓰이는 조합 중 하나

- 모든 실행과 흐름이 순차적이기 때문에 개발자가 프로그램을 제어하기 쉬움

 

동기 + 논블로킹

요청하는 함수는 결과 나올때까지 요청받는 쪽의 진행상황을 계속 확인(동기)
요청하는 함수는 요청받는 함수를 실행시키고 제어권을 그대로 가지고 있음(논블로킹)

 

팀장 : 조원 A님, 여기 이 부분 자료조사 좀 부탁해요~

조원 A : 네. 제 노트북으로 자료조사 시작할게요~

팀장 : (발표 자료 만들다가 곁 눈질로 자료조사 다 됐는지 확인) 

......

팀장 : (발표 자료 만들다가 곁 눈질로 자료조사 다 됐는지 확인) 

팀장 : 오 자료조사 끝나셨네요. 고생하셨어요(자료조사 받고 만들던 발표 자료 계속 만듦)

 

비동기 + 블로킹

요청하는 함수는 응답이 언제오는지 관심이 없음, 요청받은 함수가 알아서 결과를 알려줌(비동기)
요청받은 함수의 작업이 끝나야 제어권을 요청하는 함수에게 돌려줌(블로킹)

 

팀장 : 조원 A님, 여기 이 부분 자료조사 좀 부탁해요~

조원 A : 네. 자료조사 바로 시작할게요

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

조원 A : (열심열심🧑🏻‍💻)

조원 A : 다 됐어요!

팀장 : 네! (그제서야  발표자료 준비 시작함)

 

- 비동기 + 논블로킹을 사용하는 과정에서 의도치 않게 사용됨

ex) Node.js + MYSQL 조합, Node.js에서 비동기적으로 DB 작업을 수행하더라도 블로킹 방식으로 작동하는 MySQL 드라이버를 거침.

 

🌠 비동기 + 논블로킹

요청하는 함수는 응답이 언제오는지 관심이 없음, 요청받은 함수가 알아서 결과를 알려줌(비동기)
요청하는 함수는 요청받는 함수를 실행시키고 제어권을 그대로 가지고 있음(논블로킹)

 

팀장 : 조원 A님, 여기 이 부분 자료조사 좀 부탁해요~

조원 A : 네 자료조사 바로 시작할게요

팀장 : (발표 준비 하는 중... 열심열심🧑🏻‍💻)

조원 A : 자료조사 끝났어요 여기 있어요!

 

- 가장 많이 쓰이는 조합 중 하나

- 성능과 자원의 효율면에서 가장 우수

 

Reference

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

https://joooing.tistory.com/entry/%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

https://cotak.tistory.com/136

 

 

 

 

 

728x90
Comments