Blocking-NonBlocking

dongle·2022년 11월 25일
0

처음 이 주제에 대해 알아보려고 검색했을 때 가장 먼저 본 그림입니다.

저는 이 주제에 대해 잘 몰랐기에 여기에 있는 용어들이 어떤 의미를 가지고 있는지부터 알아봐야겠다는 생각이 들어 이 글을 작성하게 되었습니다.


Blocking

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

예를 들어 상사에게 서류를 전달 할 때, 상사가 다 읽을때까지 서 있으세요. 라고 말한다고 가정해봅시다.

직원은 그럼 상사가 그 서류를 다 읽을 때 까지 다른 작업을 할 수 없습니다. 이를 Blocking이라고 합니다

Non-Blocking

다른 주체의 작업에 관련없이 자신의 작업을 하는 것

똑같이 예를 들어 상사에게 서류를 전달할 때, “읽어볼테니 돌아가세요” 라고 한다면 직원은 돌아가서 다른 작업을 수행할 수 있습니다. 이를 Non-Blocking 이라고 합니다.

즉, 다른 주체가 작업 할 때 자신의 제어권이 있는지 없는지의 여부로 구분할 수 있습니다.

Synchronous

동기라는 뜻으로 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미

서류를 상사에게 전달할 때, 상사는 서류를 읽고, 직원은 기다리거나 다른 작업을 하다가 상사가 읽어본 뒤 “이렇게 하세요”라는 지시가 내려오면 바로 해당 지시를 처리합니다. 이를 Synchronous 라고 합니다.

Asynchronous

비동기라는 뜻으로 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작하지 않음을 의미

상사에게 서류를 전달할 때, 상사는 서류를 읽고, 직원은 기다리거나 다른 작업을 수행합니다. 다른 작업을 하다 상사는 해당 서류를 다 읽어본 뒤, “이렇게 하세요” 라고 메모를 남깁니다. 그럼 직원은 하던일을 마저한 뒤 언젠가 시간이 날 때 처리할 수 있습니다. 이를 Asynchronous 라고 합니다.

즉, 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 아닌지로 구분할 수 있습니다.


이제 가장 먼저 보았던 표를 간단하게 정리해보겠습니다.

1) Blocking/Sync

Blocking의 경우 다른 작업이 시작되는 동안 동작하지 않고, Sync의 경우 결과를 반환하게 되면 해당 업무를 바로 처리하게 됩니다.

즉, 사원이 상사에게 서류를 전달 할 때, 상사는 “다 읽을때 까지 기다리세요”라고 말하며 사원을 기다리게 합니다.(Blocking) 그 후, 지시를 내리면 사원은 그 즉시 해당 업무를 수행하게 됩니다.(Sync)

이것이 바로 ‘동기’ 입니다

2) Non-Blocking/Sync

Non-Blocking의 경우다른 작업이 수행되는 동안 또 다른 작업을 하며 응답을 기다리게 됩니다. 즉, 수시로 작업이 끝났나요? 라고 물어보게 되고, 끝나지 않았다면 다시 또다른 작업을 수행하며 기다립니다. 그리고 Sync의 경우 결과를 반환하게 되면 해당 업무를 바로 처리하게 됩니다.

상사에게 서류를 전달한 직원에게 상사는 “다른일 하고 있으세요”라고 얘기합니다.

하지만 빨리 끝내고 집으로 가고싶은 나머지 직원은 상사에게 수시로 “끝나셨나요?” 라고 물어보게 되고 상사는 “아직입니다” 와 같이 대답하게 된다면 다시 돌아가 할 일을 하게 됩니다. 그렇게 다시 물어봤을 때 상사가 완료했으면 직원은 그 즉시 해당 작업을 처리하게 됩니다.

3) Blocking / Async

이 조합은 굳이 비동기인데 써야할까? 라는 의문이 들었습니다. 보통 Non-Blocking/Async로 하려다가 개발자의 실수로 혹은 기타 이유로 이렇게 동작하는 경우가 있다고 합니다.

예를 들어 직원이 상사에게 서류를 전달했을 때, 상사는 옆에 사람을 두고 일하는 것을 좋아해 다 읽을 때 까지 기다리세요 라고 말합니다. 그러나 직원은 당장 급한일이 아니기 때문에 관심은 없지만 상사를 기다립니다. 그렇게 상사가 서류를 다 읽게 되면 메일을 날리고 이제 편할 때 처리하세요. 라고 말하고 직원도 시간 날 때 해당업무를 처리하게 됩니다.

Non-Blocking / Async

Non-Blocking은 다른 작업이 시작되어도 자신이 하던 작업을 멈추지 않는 것입니다. 그리고 Async는 다른 작업에서 끝난 결과를 바로 처리하지 않고 자신의 일이 끝나게 되면 처리하게되는 것을 말합니다.

예를 들어 직원이 상사에게 서류를 전달할 때, 상사는 “다른일 하고 있으세요”라고 말하며 직원을 돌려보냅니다. 상사가 해당 작업을 처리하는 동안 직원도 다른 일들을 하게되고(Non-blocking) 상사가 해당 서류를 다 읽으면 메일로 알아서 처리하세요 라고 합니다. 직원은 시간 날 때 그 일을 처리하게 됩니다.(Async)


마치며 ..

이렇게 예시를 들어 알아보니 조금이라도 이해가 잘 되는 것 같다는 생각이 들었고, 조금더 깊게 공부해야겠다는 생각이 들었습니다.


참고

https://www.youtube.com/watch?v=oEIoqGd-Sns

https://velog.io/@wlwl99/Synchronous-vs-Asynchronous

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

profile
개발자를 꿈꾸는 학생입니다!

0개의 댓글