Blocking/Non-blocking

Lami·2022년 11월 27일
0

CS

목록 보기
9/9
post-thumbnail

개요

동기 & 비동기 !== 블로킹 & 논블로킹

동기와 비동기, 블로킹과 논블로킹 이 두 가지 개념은 단지 조합하여 사용되는 것일 뿐 서로 전혀 다른 곳에 초점을 맞춘 개념들로 직접적인 관련은 거의 없다.

  • 동기 & 비동기 : 프로세스의 수행 순서 보장에 대한 매커니즘
  • 블로킹 & 논블로킹 : 프로세스의 유휴 상태에 대한 개념

Synchronous(동기) & Asynchronous(비동기)

Synchronous : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작
Asynchronous : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음

👉🏻 카페에서 한 사람씩 주문을 받아 하나씩 처리하는 것 : 동기
👉🏻 카페에서 주문을 받아 처리하되 순서대로가 아니라 다른 주문도 함께 처리하는 것 : 비동기

Synchronous(동기)

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

Asynchronous(비동기)

함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.

Blocking/Non-Blocking

처리되어야 하는 하나의 작업이 전체적인 흐름을 막느냐, 안 막느냐에 대한 관점
👉🏻 제어권이 누구한테 있느냐 가 관심사

Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
Non-Blocking : 다른 주체의 작업에 관련없이 자신의 작업을 하는 것

Blocking

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

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

Non-Blocking

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

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

조합

Sync-Blocking(동기&블로킹)

함수 A는 함수 B의 리턴값을 필요로 한다. 👉🏻 Sync(동기)
그래서 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다. 👉🏻 Blocking(블로킹)

ex) python 코드 실행 후 커맨드에서 입력 받기
👉🏻 제어권이 시스템에서 사용자로 넘어가, 리턴값을 필요로 해서 사용자가 입력할 때까지 기다린다.

Sync-NonBlocking

A 함수는 B 함수를 호출.
이때 A 함수는 B 함수에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다. 👉🏻 Non-Blocking(논블로킹)
그런데 A 함수는 B 함수의 리턴값이 필요하기 때문에, 중간중간 B 함수에게 함수 실행을 완료했는지 물어본다. 👉🏻 Sync(동기)

ex) 게임 로딩 중 프로그레스 바
데이터를 계속 물어봄. 제어권은 여전히 나한테 있어 화면에 로드율이 표시된다.
👉🏻 논블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해 계속해서 다른 작업이 끝났는지 조회

Async-NonBlocking

A 함수는 B 함수를 호출.
이때 제어권을 B 함수에 주지 않고, 자신이 계속 갖고 있는다. 따라서 B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다. 👉🏻 논블로킹
그리고 B 함수를 호출할 때 콜백함수를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백함수를 실행한다. 👉🏻 비동기

ex) AJAX 요청 / JS 비동기 콜백
👉🏻 프론트엔드에서 서버로 api 요청을 보내고, 응답을 기다리지 않고 바로 자신의 다음 일을 계속 실행한다.

Async-Blocking

마주치기 어려움. 패스😛

참고 블로그 : 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
예시가 잘 나와있다. 나중에 들어가서 더 보기

profile
삶이 온통 사람의 길이니 많은 경험을 해보고 싶은 프론트엔드 개발자 지망생입니다.

0개의 댓글