JaeWon's Devlog
article thumbnail
반응형

개발을 진행하다보면 sync, async, blocking, non-blocking 를 고려해서 개발을 해야할 때가 발생하고, 적절하게 사용해야만 한다.

위 개념들을 살펴보면 비슷한 내용인 것 같아 같아보이지만 관점에 따라 다른 기능을 제공한다.

단지 이 개념들을 서로 조합해서 사용되는 것 뿐이다.

https://developer.ibm.com/articles/l-async/


동기(sync)와 비동기(async)는 프로세스의 수행 순서 보장에 대한 매커니즘이며, 블록킹(blocking)과 논블록킹(non-blocking)은 프로세스의 유휴 상태에 대한 개념이다.

이번 글에서는 위 개념들을 정리하고 비교해보고자 한다.


1. Sync VS Async

1-1. Sync(동기, Synchronous)

- Sync(동기)는 동시에 일어난다는 의미를 가진다.

- 요청과 결과가 동시에 일어난다.

- 요청(Request)을 하였다면 시간이 얼마나 걸리던지 요청한 자리에서 응답(Response)을 받아야 한다.

- 순서에 맞춰 진행되는 장점은 있지만, 여러가지 요청을 동시에 할 수 없다.

 

1- 2. Async(비동기, Asynchronous)

- Async(비동기)는 동시에 일어나지 않는다는 의미를 가진다.

- 요청과 결과가 동시에 일어나지 않는다.

- 요청을 해도 응답을 기다리지 않고 다른 작업이 가능하다.

- 여러 개의 요청을 동시에 처리할 수 있는 장점은 있지만, 동기 방식보다 속도가 늦어질 수 있다.

https://poiemaweb.com/js-async

1-3. 비교

- Sync(동기) 방식은 계가 매우 간단하고 직관적이지만 결과(응답)가 주어질 때까지 다른 작업을 하지 못하고 기다려야만 하는 단점이 있다.

- Async(비동기) 방식은 결과가 주어지는데 시간이 걸리더라도 기다리지 않고 다른 작업을 할 수 있지만 동기보다 복잡하고 시간이 오래걸릴 수 있다.

1-4. 처리 방식

  • 동기(sync)방식

https://private.tistory.com/24

  1. A의 계좌는 B의 계좌로 10000원을 송금하고자 한다.
  2. A의 계좌가 B의 계좌에 10000원을 송금한다.(Request)
  3. B의 계좌는 10000원을 받았다는 걸 확인하고, A의 계좌에 10000원을 받았다고 응답한다.(Response)
  4. A,B 계좌는 각 각 증가/차감이 동시에 일어난다.

- 위 예시를 들어보자면 A의 계좌와 B의 계좌는 서로 요청과 응답(1~3과정)을 확인한 후 같은 일을 동시에 진행한다.

- 만약, 4번 과정이 진행될 때 동기방식으로 처리했다면 A에서 요청을 보내고 B에서 못 받았다고 한 쪽만 변경되는 사항이 없어야 한다.

  • 비동기(async)방식

https://private.tistory.com/24

  1. 학생은 시험문제를 푼다.
  2. 시험문제를 모두 푼 학생은 선생님에게 제출한다.(Request)
  3. 선생은 학생의 시험지를 채점한다.
  4. 채점이 다 된 시힘지를 학생에게 전송한다.(Response)
  5. 학생은 선생이 전송한 시험지를 받아 결과를 확인한다.

- 학생과 선생은 시험지라는 연결고리가 있지만 시험지에 행하는 행위(목적)는 다르다.

- 서로의 행위(목적)가 다르기 때문에 둘의 작업 처리 시간은 일치하지 않아도 된다.

1-5. 결론


- 동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 시각의 차이이다.
- 동기는 추구하는 같은 행위(목적)가 동시에 이루어지며, 비동기는 추구하는 행위(목적)가 다를 수도 있고, 동시에 이루어지지도 않는다.

2. Blocking VS Non-Blocking

2-1. Blocking(블록킹)

- 요청한 작업을 마칠 때까지 계속 대기한다.

- 즉시 Return 한다.

- 응답(Response = Reusult)을 받아야 끝난다.

- 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때 까지 기다렸다가 자신의 작업을 진행한다.

- 호출된 대상이 자신의 작업을 모두 마칠 때까지 제어권을 계속 가지고 있어 호출한 대상은 아무 일도 못하고 대기한다.

2-2. Non-Blocking(논블록킹)

- 요청한 작업을 즉시 마출 수 없다면 즉시 Return 한다.

- 즉시 Return 하지 않는다.

- 다른 주체의 작업에 관련없이 자신의 작업을 진행한다.

- 호출된 대상이 자신의 작업을 마치지 않았어도 제어권을 바로 반환하여 호출한 대상은 다른 일을 진행할 수 있다.

2-3. 비교

- 두 개념은 호출되는 함수가 바로 Return을 하는지 마는지의 관심사가 중요하다.

- 호출된 함수가 바로 Return 해서 호출한 함수에게 제어권을 넘겨주고 호출한 함수가 다른 일을 할 수 있는 기회를 준다면 non-blocking 이다.

- 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 blocking 이다.

2-4. 동작방식

  • blocking(블록킹)

https://inpa.tistory.com/

  1. A 함수가 B 함수를 호출하면 B 에게 제어권을 넘긴다.
  2. 제어권을 넘겨받은 B는 함수를 실행한다. A 는 B 에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.
  3. B 함수는 실행이 끝나면 자신을 호출한 A 에게 제어권을 다시 돌려준다. 
  • non-blocking(논블록킹)

https://inpa.tistory.com/

  1. A 함수가 B 함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
  2. A 함수는 계속 제어건을 가지고 있으므로, B 함수를 호출한 이후에도 자신의 다른 작업을 진행할 수 있다.

- 위 sync/async 예제(1-4 처리방식)를 통해 블록킹과 논블록킹의 차이를 간단하게 비교해보자면 아래와 같다.

- 학생이 시험지를 선생에게 전달 후 가만히 앉아 채점이 끝나고 돌려받을때까지 기다리기만 한다면 학생은 블록킹 상태이다.

- 하지만 학생이 시험지를 건넨 후 선생에게 채점이 끝나든 안끝나든 다른 과목 시험을 치거나 공부한다면 학생의 상태는 논블록킹 상태이다.

3. 조합

https://inpa.tistory.com/

- 위 sync/async, blocking/non-blocking 은 서로 조합하여 개발시 다양하게 사용될 수 있다.

3-1. 동작 방식

- 블로그 중 아래 예제가 이해하기 좋았다.

  • Blocking & Sync
    - 결과가 처리되어 나올때까지 기다렸다가 Return 값으로 결과를 전달한다.

사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 잠깐만 거기서 기다리세요!
사원 : (멀뚱멀뚱)...
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : (대표가 진행하는 것이 궁금하고, 하염없이 지켜보면서 기다림)
  • Blocking & Async
    - 호출되는 함수가 바로 Return 하지 않고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는다.
    - 해당 방식은 사실 이점이 없기 때문에 굳이 사용하지 않는다.

사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 잠깐만 거기서 기다리세요!
사원 : (멀뚱멀뚱)...
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : (대표가 진행하는 것이 안궁금한데 잡혀버려 다른 생각하면서 기다림)
  • Non-blocking & Sync
    - 결과가 없으면 바로 Return, 결과가 있어도 바로 Return 한다.
    - 결과가 생길때까지 계속 완료되었는지 확인한다.

사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 가서 할 일 하세요!
사원 : 예!
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : 대표님 채용되었을까요?
대표 : 아직이요.
사원 : 대표님 채용되었을까요?
대표 : 아직이요
사원 : (대표가 진행하는 것의 결과를 궁금해하며 사원 자리에서 기다린다...)
  • Non-blocking & Async
    - 작업 요청 후에 Return 에 상관 없이 끝내고 다른 작업을 진행한다.
    - 결과는 별도의 작업 후 간접적으로 전달(Callback) 한다.

사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 가서 할 일 하세요!
사원 : 예!
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : (대표가 진행하는 것의 결과가 안궁금하고 다른 작업을 진행하고 있는다...)
대표 : 한분 채용 되었습니다!
사원 : 감사합니다!

출처

- https://jh-7.tistory.com/25

- https://private.tistory.com/24

- 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://musma.github.io/2019/04/17/blocking-and-synchronous.html

반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!