[Today I Learn] - Blocking, Non-Blocking, Synchronous, Async

치맨·2023년 2월 5일
0

[Today I Learn] - CS

목록 보기
9/12
post-thumbnail

목차


우선 시작하기에 앞서 2가지 개념을 짚고 넘어가겠습니다.

  1. 제어권 : 자신의 코드를 실행할 권리같은 것 입니다. 제어권을 가진 함수는 함수를 끝까지 실행하는걸 의미합니다. 예를들어 A함수에서 B함수를 호출하고, 제어권이 B함수로 넘어갔다면, B함수가 코드를 실행할 권리를 갖게되고, 끝까지 함수를 실행한뒤, A로 돌아옵니다.
    Blocking과 Non-Blocking의 차이는 제어권을 어떻게 처리하느냐에 따라 달라집니다.
  1. 결과값을 전달 : 값을 return한다는 의미로 만약 A 함수에서 B 함수를 호출 후, B함수의 실행이 완료됐을때 결과값을 A함수에 전달한다는 의미입니다.
    Synchronous와 Asynchronous의 차이는 결과값의 여부를 신경쓰는지 여부의 차이 입니다.

Blocking

  • Blocking이란 A 함수가 코드를 실행하다가 B 함수를 호출하면, A가 호출한 B 함수에게 제어권을 넘겨줍니다.

  • 이때 A 함수는 제어권이 B함수로 넘어갔기 때문에, 작업을 중지합니다.

  • 이후 B함수의 작업이 완료된 후 제어권이 다시 A함수로 돌아와 작업을 진행하는 이런 방식을 Blocking이라고 합니다.


Non Blocking

  • Non Blocking이란 A함수가 B함수를 호출해도 제어권은 그대로 자신(A함수)이 가지고 있습니다.

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


Synchronous

  • 한국말로는 동기라고 합니다. 여기서 동기란 결과값의 반환하는 시간과 제어권의 반환하는 시점이 같은것 입니다.

  • 예를 들어보겠습니다. (예시는 이해를 돕기 위한 도구일뿐입니다.)

  - A란 친구가 빨래를 하지 않아 입을 옷이 없습니다. 따라서 빨래를 하기 전까지 옷을 갈아입지 못합니다. 
  - A란 친구가 B라는 세탁기 및 건조기를 돌립니다.(B 호출)
  - 친구가 놀러가자고 했으나, 옷이 없어서 빨래를 기다려야 합니다. (A 중지, 다른일 병행 못함)
  - 세탁 및 건조가 완료된 후 A란 친구는 옷을 갈아 입었습니다.(B에서 A로 결과값 및 제어권 동시 반환)
  - A란 친구는 친구들을 만나러 갈 수 있었습니다.(A함수 실행)

그렇다면 Blocking이랑 다른점이 무엇인가?? 라는 의문이 들었습니다.
Blocking은 제어권에 대한 것이고, Synchronous는 제어권과 결과값이 같은 시점,시간에 대한 것입니다.


Asynchronous

  • 한국말로는 비동기로 결과값과 제어권의 반환하는 시점이 다른것입니다.

  • 또 예시를 들어보겠습니다.

  - A란 친구가 여분의 옷은 많지만 미리미리 빨래를 할려고 합니다.
  - A란 친구가 B라는 세탁기 및 건조기를 돌립니다.(B함수 호출)
  - 친구가 놀러가자고 해서, 여분의 옷이 있기 때문에 세탁여부와 상관없이 놀러갑니다.(다른일 병행, 제어권 A한테 있음)
  - 이후 친구들과 재밌게 놀고 난 뒤, 다음날 아침에 세탁 및 건조가 완료된 빨래를 정리합니다. (결과값 반환)

Blocking vs Non Blocking vs Synchronous vs Asynchronous

  • Sync-Blocking

    • Blocking은 호출한 함수에게 제어권을 넘기고, 넘긴경우 작업을 중단하는 것 입니다.
    • Sync는 제어권과 결과값의 반환 시점이 같습니다.(결과값의 여부가 중요)

  1. A함수에서 B함수를 호출합니다.(제어권을 A에서 B로 넘김)
  2. B함수가 완료되기 전까지 A함수의 작업은 중단됩니다.
  3. B함수를 실행 후, B함수가 완료되면 A함수로 결과값, 제어권을 동시에 반환 합니다.
  4. 이후 A함수의 작업이 재개됩니다.

  • Sync-Non Blocking

    • Non Blocking은 함수를 호출해도 제어권을 넘기지 않습니다.
    • Sync는 제어권과 결과값의 반환 시점이 같습니다.

  1. A함수에서 B함수를 호출합니다.(제어권을 A에서 B로 넘기진 않음)
  2. B함수의 결과와 상관없이 A함수의 작업이 계속 진행됨
  3. 그러나 Sync이기 때문에 제어값과 결과값의 반환이 같길 원하기 때문에 계속 B함수에게 결과값을 물어본다.
  4. B함수가 완료되면 결과값을 전달하고, 더이상 B 함수에게 물어보지 않는다.

  • Async-Non Blocking

    • Non Blocking은 함수를 호출해도 제어권을 넘기지 않습니다.

    • Async는 제어권과 결과값의 반환 시점이 다릅니다.(결과값에 크게 신경쓰지 않습니다.)


  • Async-Blocking

    • Async-Blocking의 경우는 사실 잘 마주하기 쉽지는 않습니다.

    • Blocking은 함수를 호출하면 제어권을 넘깁니다.

    • Async는 제어권과 결과값의 반환 시점이 다릅니다.(결과값에 크게 신경쓰지 않습니다.)

    • Sync-Blocking과 성능차이가 별로 없기 때문에 사용하는 경우가 별로 없습니다.


결론

  • 위에서 설명한 4가지를 명확하게 구분하는 것은 쉽지 않을 뿐더러 굳이 그럴 필요가 없다고 생각합니다.

  • 어떤 관점으로 봤을땐 동기일 수 있으나, 조금 더 크게 봤을땐 비동기적으로 작동할 수 있는 경우도 있습니다.

  • 따라서 모든 상황을 동기와 비동기로 뚜렷하게 나누기 보다는 동기와 비동기의 의미를 명확하게만 알고있으면 될 것 같습니다.

Ref

profile
기본기가 탄탄한 개발자가 되자!

0개의 댓글