Sync / Async 그리고 Blocking / Non-Blocking

김민재·2022년 1월 13일
0
post-thumbnail

*🔐Study Keyword :

✅동기/비동기 그리고 🔑블록킹/논블록킹에 대해서

1. Blocking / Non-Blocking

  • Blocking : 어떠한 행위에 의해 자신의 행위를 이어서 수행하지 못하거나 막히는 것.
  • Non-Blocking : 어떠한 행위에 구애 받지 않고 자신의 행위를 수행하는 것.

2. Sync / Async

  • 프로그래밍에서의 동기란 동시에 일어난다는 뜻으로, 이는 요청하는 함수와 응답하는 함수 간의 데이터 동기를 한다는 의미를 가진다.
  • 작업의 단위 (Transaction)을 동기화하면 Sync, 동기화하지 않는다면 Async이다.
  • 분명 동기와 블락킹은/ 비동기와 논블록킹은 동일한 개념처럼 보이지만 둘은 바라보는 시점에 따라 그 의미가 달라진다.

Blocking, Non-Blocking의 기준은 제어권을 어느 쪽이 가지고 있느냐로 나뉘어지지만,
Sychronous, Asynchronous는 작업의 반환에 대해 영향을 받는지 받지 않는지로 나뉘어진다.


Blocking / Non-Blocking을 이야기할 땐 제어권과 반환 두 가지 키워드가 핵심으로 제어할 수 없는 대상의 처리 방법에 대해 논의하는 것을 의미한다.

- Blocking

  • Blocking은 직접 제어할 수 없는 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것으로 제어권이란 행동할 수 있는 권리를 의미한다.
  • EX> 호출하는 함수가 IO를 요청했을 때 IO처리가 완료될 때까지 아무 일도 하지 못한 채 기다리는 것을 말한다.
function 호출자 (){
  // 1. 호출자 함수가 처음에 제어권을 갖고 있다.
  function A()
  // 2. A 함수를 호출하면 제어권을 A에게 넘긴다.
  // 4. A의 리턴값과 함께 제어권을 넘겨받은 호출자는 그제서야 함수 B를 실행할 수 있게 된다.
  function B()
  function C()
}
function A(){
  /*엄청난 로직*/
  // 3. 제어권을 넘겨 받은 A는 안에서 로직을 처리한 뒤 리턴하면 값과 함께 제어권을 다시 넘긴다.
  return Sth;
}
  • 호출자 함수가 A 함수를 호출하는 순간, 호출자는 A함수가 작업을 마무리하지 못하거나 예외가 발생하면 호출자는 나머지 작업을 수행하지 못한다.
  • 즉, 호출자에 대한 권한이 A(직접 제어하지 못하는 대상)를 호출함과 동시에 제어권이 넘어가게 된다.

- Non-Blocking

  • Blocking과 반대되는 개념으로 직접 제어할 수 없는 대상의 작업 처리 여부와 상관이 없다.
  • EX> 호출하는 함수가 IO를 요청한 후 IO처리 완료 여부와 상관없이 바로 자신의 작업을 할 수 있다.
function 호출자 (){
  // 1. 역시 호출자 함수가 처음엔 제어권을 갖고 있다.
  function A()
  // 2_1. A 함수를 호출하면 제어권을 A에게 넘겼다가 바로 다시 호출자에게 돌아온다.
  // 2_3. A의 리턴을 기다리지 않고 호출자 함수는 그대로 B를 C를 이어서 실행한다.
  function B()
  function C()
}
function A(){
  /*엄청난 로직*/
  // 2_2. 호출받은 A는 제어권없이 그래도 로직을 처리하고 리턴한다.
  // 3. 그렇다면 함수 A의 결과값은 어떻게 된걸까?
  return Sth;
}
  • 제어할 수 없는 함수를 호출 했을 때 제어권이 바로 호출자에게 넘어간다.

- Synchronous

동기?

  • 동기화하면 데이터베이스 동기화가 떠오르는데 데이터베이스의 동기화의 경우 같은 시간에 두개의 다른 데이터베이스에 저장소에서 같은 데이터를 가지고 있도록 맞춰주는 작업을 의미한다.
  • 즉, 동기화란 데이터를 같은 시간에 같아지도록 맞춰주는 것을 말한다.

  • Synchronous는 함께와 시간을 합친 말로, 제어권의 반환 시간과 결과값의 전달하는 시간이 일치하는 것을 의미한다.
  • 간단하게 Sync를 떠올리면 1> 함수 A가 끝난 후에 함수 B가 실행되는, A의 끝과 B의 시작과 시간을 맞추는 것을 떠오르는데 뿐만 아니라 2> 함수의 시작과 끝이 같은 경우를 의미하기도 한다.

- Asynchronous

  • 부정형의 의미를 가진 A가 붙은 Asyncronous, 비동기는 1> 함수 A와 B가 실행되고 끝나는 시간이 안맞거나 2> 결과 값도 전달이 안됐는데 제어권을 반환하는 경우를 의미한다.

블록킹 논블록킹에 그리고 동기/비동기에 있어 중요한 건 바라보는 관점이다.

  • 동기/비동기와 블록킹/논블록킹은 전혀 다른 개념으로 서로 독립적으로 봐야하는데
    블록/논블록은 제어권에 대한 이야기이고 동기/비동기는 반환하는 시간, 타이밍에 대한 이야기이다.
  • 즉 Blocking / Non-Blocking은 제어권을 어떻게 누가 가지고 언제 반환하는지에 대한 이야기로 제어권을 어떻게 하느냐에 따라 제어할 수 없는 대상을 어떻게 처리할지에 대한 개념이다.
  • 반면 Sync / Async 제어권을 반환하는 시간, 결과값을 전달하는 시간 혹은 어떤 함수가 끝나고 다음 함수가 시작하는 시간이 일치되었는가 안됐는가에 대한 개념이다.

*💡conclusion

Synchronous VS Asynchronous

  • 두 가지 이상의 대상(메서드, 작업, 처리 등)과 이를 처리하는 시간으로 구분하며
    Synchronous: 호출된 함수의 리턴하는 시간과 결과를 반환하는 시간이 일치하는 경우
    Asynchronous: 호출된 함수의 리턴하는 시간과 결과를 반환하는 시간이 일치하지 않는 경우

Blocking VS Non-Blocking

  • 호출되는 대상이 직접 제어할 수 없는 경우 이를 구분햐며
    Blocking: 직접 제어할 수 없는 대상의 작업이 끝날 때까지 기다려야 하는 경우
    Non-Blocking: 직접 제어할 수 없는 대상의 작업이 완료되기 전에 제어권을 넘겨주는 경우

#📑Study Source

  1. https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx
  2. https://dip0cean.tistory.com/61
profile
자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.

0개의 댓글