데굴데굴

TIL: 2023-04-29 본문

Lesson/TIL

TIL: 2023-04-29

aemaaeng 2023. 4. 29. 21:12

⚙️ 오늘 학습한 내용

블로킹과 논블로킹

🐹 오늘의 기분

블로킹은 그 다음 작업이 막히는 것, 논블로킹은 다음 작업이 막히지 않는 것으로 막연하게 이해하고 있었는데 어느 날 뉴스레터로 날아온 요즘IT 아티클을 읽어보다가 동기-논블로킹, 비동기-블로킹 방식으로도 조합되어 작동할 수 있다고 해서 아티클을 읽으며 정리해보았다. 

🗝 키워드

블로킹, 논블로킹, 제어권, 호출자, 피호출자

🗣 스스로에게 설명

https://yozm.wishket.com/magazine/detail/1982/ 를 읽고 제 말로 요약해본 정리글입니다.

블로킹과 논블로킹

호출자와 피호출자의 제어권과 관련이 있는 개념

호출자 - 메인 함수
피호출자 - 서브 함수, API

 

예제 코드

function print() {
  console.log(1);
  console.log(2);
  console.log(3);
}

print() 함수를 실행하면 순서대로 1, 2, 3이 출력된다.
두 번째 console.log()가 실행되기 위해서는 첫 번째 console.log()가 종료되고 print() 함수가 제어권을 돌려받아야 두 번째 console.log()의 실행이 가능해진다. (세 번째 console.log()도 마찬가지)


함수 제어권은 print() 함수가 갖고 있다가 출력 함수에 넘겨주고 다시 돌려받는 것을 반복하며, 마지막 console.log()까지 실행되면 함수 print()가 종료되며 콜 스택이 비게 된다.

 

블로킹 방식에서는 피호출자(서브 함수)가 함수를 끝까지 실행한 후에 제어권을 다시 호출자에게 돌려준다.
논블로킹 방식에서는 피호출자가 호출자에게 제어권을 바로 돌려준다.

 

보통 논블로킹 방식은 멀티 스레드로 처리된다.
싱글 스레드로 작동하는 자바스크립트의 경우에는 스레드를 또 만들 수가 없기 때문에 브라우저의 이벤트 루프와 태스크 큐를 이용한다.
태스크 큐에 콜백 함수가 등록되면 제어권은 다시 호출자에게 돌아가고 이벤트 루프가 콜 스택이 비었을 때 태스크 큐에 있는 콜백 함수를 콜 스택으로 올려주어 함수가 실행되는 방식으로 동작한다.

 

논블로킹 방식에서는 호출자가 피호출자의 처리 결과를 받을 수 없음. 지속적으로 상태를 확인하는 요청을 보내야 한다.

동기와 블로킹

반드시 순차적으로 처리되어야 하는 작업
하나의 스레드가 일련의 연산을 순차적으로 수행하는 것에 해당

동기와 논블로킹

원글에 나와있는 비유가 가장 이해에 도움되는 예시인 것 같아 그대로 가져왔다.
도우가 구워진 다음에 토핑 얹기(동기) + 도우가 구워지는 동안 다른 작업을 수행할 수 있음(논블로킹)

 

운영체제의 system call
커널 스레드의 작업 시작
주기적으로 커널 스레드에게 작업 완료 여부 묻기
'완료' 응답이 돌아오면 다음 작업 시작

비동기와 논블로킹

메인 스레드에서 파생된 두 개의 스레드가 동시에 실행되는 상황
메인 스레드에서 두 개의 API 호출 -> 콜백함수로 각각의 API가 처리된 후의 작업을 예약 (then/catch)

비동기와 블로킹

특수한 상황에 해당하며 굳이 필요한 상황은 아님

 

<참고 이미지>

🔎 공부가 더 필요한 부분

async/await은 단순히 비동기를 동기처럼 보이게 해주는 것인가? (가독성 차원)
아니면 실제 동작도 동기 방식으로 작동을 하는 것인가?

 

시간 날 때 볼 영상

 

'Lesson > TIL' 카테고리의 다른 글

TIL: 2023-05-04  (0) 2023.05.04
TIL: 2023-05-01  (0) 2023.05.01
TIL: 2023-04-28  (0) 2023.04.28
TIL: 2023-04-26  (0) 2023.04.26
TIL: 2023-04-25  (0) 2023.04.25
Comments