개발을 진행하다보면 sync, async, blocking, non-blocking 를 고려해서 개발을 해야할 때가 발생하고, 적절하게 사용해야만 한다.
위 개념들을 살펴보면 비슷한 내용인 것 같아 같아보이지만 관점에 따라 다른 기능을 제공한다.
단지 이 개념들을 서로 조합해서 사용되는 것 뿐이다.
동기(sync)와 비동기(async)는 프로세스의 수행 순서 보장에 대한 매커니즘이며, 블록킹(blocking)과 논블록킹(non-blocking)은 프로세스의 유휴 상태에 대한 개념이다.
이번 글에서는 위 개념들을 정리하고 비교해보고자 한다.
1. Sync VS Async
1-1. Sync(동기, Synchronous)
- Sync(동기)는 동시에 일어난다는 의미를 가진다.
- 요청과 결과가 동시에 일어난다.
- 요청(Request)을 하였다면 시간이 얼마나 걸리던지 요청한 자리에서 응답(Response)을 받아야 한다.
- 순서에 맞춰 진행되는 장점은 있지만, 여러가지 요청을 동시에 할 수 없다.
1- 2. Async(비동기, Asynchronous)
- Async(비동기)는 동시에 일어나지 않는다는 의미를 가진다.
- 요청과 결과가 동시에 일어나지 않는다.
- 요청을 해도 응답을 기다리지 않고 다른 작업이 가능하다.
- 여러 개의 요청을 동시에 처리할 수 있는 장점은 있지만, 동기 방식보다 속도가 늦어질 수 있다.
1-3. 비교
- Sync(동기) 방식은 설계가 매우 간단하고 직관적이지만 결과(응답)가 주어질 때까지 다른 작업을 하지 못하고 기다려야만 하는 단점이 있다.
- Async(비동기) 방식은 결과가 주어지는데 시간이 걸리더라도 기다리지 않고 다른 작업을 할 수 있지만 동기보다 복잡하고 시간이 오래걸릴 수 있다.
1-4. 처리 방식
- 동기(sync)방식
- A의 계좌는 B의 계좌로 10000원을 송금하고자 한다.
- A의 계좌가 B의 계좌에 10000원을 송금한다.(Request)
- B의 계좌는 10000원을 받았다는 걸 확인하고, A의 계좌에 10000원을 받았다고 응답한다.(Response)
- A,B 계좌는 각 각 증가/차감이 동시에 일어난다.
- 위 예시를 들어보자면 A의 계좌와 B의 계좌는 서로 요청과 응답(1~3과정)을 확인한 후 같은 일을 동시에 진행한다.
- 만약, 4번 과정이 진행될 때 동기방식으로 처리했다면 A에서 요청을 보내고 B에서 못 받았다고 한 쪽만 변경되는 사항이 없어야 한다.
- 비동기(async)방식
- 학생은 시험문제를 푼다.
- 시험문제를 모두 푼 학생은 선생님에게 제출한다.(Request)
- 선생은 학생의 시험지를 채점한다.
- 채점이 다 된 시힘지를 학생에게 전송한다.(Response)
- 학생은 선생이 전송한 시험지를 받아 결과를 확인한다.
- 학생과 선생은 시험지라는 연결고리가 있지만 시험지에 행하는 행위(목적)는 다르다.
- 서로의 행위(목적)가 다르기 때문에 둘의 작업 처리 시간은 일치하지 않아도 된다.
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(블록킹)
- A 함수가 B 함수를 호출하면 B 에게 제어권을 넘긴다.
- 제어권을 넘겨받은 B는 함수를 실행한다. A 는 B 에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.
- B 함수는 실행이 끝나면 자신을 호출한 A 에게 제어권을 다시 돌려준다.
- non-blocking(논블록킹)
- A 함수가 B 함수를 호출하면, B 함수는 실행되지만, 제어권은 A 함수가 그대로 가지고 있는다.
- A 함수는 계속 제어건을 가지고 있으므로, B 함수를 호출한 이후에도 자신의 다른 작업을 진행할 수 있다.
- 위 sync/async 예제(1-4 처리방식)를 통해 블록킹과 논블록킹의 차이를 간단하게 비교해보자면 아래와 같다.
- 학생이 시험지를 선생에게 전달 후 가만히 앉아 채점이 끝나고 돌려받을때까지 기다리기만 한다면 학생은 블록킹 상태이다.
- 하지만 학생이 시험지를 건넨 후 선생에게 채점이 끝나든 안끝나든 다른 과목 시험을 치거나 공부한다면 학생의 상태는 논블록킹 상태이다.
3. 조합
- 위 sync/async, blocking/non-blocking 은 서로 조합하여 개발시 다양하게 사용될 수 있다.
3-1. 동작 방식
- 블로그 중 아래 예제가 이해하기 좋았다.
- Blocking & Sync
- 결과가 처리되어 나올때까지 기다렸다가 Return 값으로 결과를 전달한다.
사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 잠깐만 거기서 기다리세요!
사원 : (멀뚱멀뚱)...
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : (대표가 진행하는 것이 궁금하고, 하염없이 지켜보면서 기다림)
- Blocking & Async
- 호출되는 함수가 바로 Return 하지 않고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는다.
- 해당 방식은 사실 이점이 없기 때문에 굳이 사용하지 않는다.
사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 잠깐만 거기서 기다리세요!
사원 : (멀뚱멀뚱)...
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : (대표가 진행하는 것이 안궁금한데 잡혀버려 다른 생각하면서 기다림)
- Non-blocking & Sync
- 결과가 없으면 바로 Return, 결과가 있어도 바로 Return 한다.
- 결과가 생길때까지 계속 완료되었는지 확인한다.
사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 가서 할 일 하세요!
사원 : 예!
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : 대표님 채용되었을까요?
대표 : 아직이요.
사원 : 대표님 채용되었을까요?
대표 : 아직이요
사원 : (대표가 진행하는 것의 결과를 궁금해하며 사원 자리에서 기다린다...)
- Non-blocking & Async
- 작업 요청 후에 Return 에 상관 없이 끝내고 다른 작업을 진행한다.
- 결과는 별도의 작업 후 간접적으로 전달(Callback) 한다.
사원 : 대표님 직원 좀 더 뽑아주세요!
대표 : 오케이! 가서 할 일 하세요!
사원 : 예!
대표 : (채용공고 등록... 지원자 연락... 면접 진행... 처우 협의...)
사원 : (대표가 진행하는 것의 결과가 안궁금하고 다른 작업을 진행하고 있는다...)
대표 : 한분 채용 되었습니다!
사원 : 감사합니다!
출처
- https://private.tistory.com/24
- https://musma.github.io/2019/04/17/blocking-and-synchronous.html
'Tool, 이론 및 기타 > 이론' 카테고리의 다른 글
Forward Proxy(포워드 프록시)와 Reverse Proxy(리버스 프록시) 정리 (0) | 2023.03.05 |
---|---|
Entity vs DTO vs VO 개념 및 차이점 정리(with. 역할 분리) (0) | 2022.10.18 |
Message Broker(메시지브로커) 및 Message Queue(메시지큐) 정리 (0) | 2022.10.14 |
[Nexacro] 넥사크로 메모장 (0) | 2022.06.01 |
[금융 IT] 마이데이터(MyData)란? (0) | 2022.06.01 |