Dev-Tino

Dev-Tino 3주차(2):: 동기/비동기, 블로킹/논블로킹

동기, 비동기, 블로킹, 논블로킹, AJAX

서문:: 시작하기에 앞서

초등학교 과학 수업 시간에 전구와 회로에 대해 배운 적이 있을 것이다. 전구의 직렬, 병렬 연결에 대한 것이다. 전구 뿐만 아니라 전지도 직렬, 병렬 연결을 한다. 이것저것 순서를 바꾸어 다양한 방식을 시도하는 것이다. 직렬 연결은 각 요소를 한 줄에 연결하는 것이고(하나가 망가지면 다른 것도 망가진다.) 병렬 연결은 각 요소를 다른 줄로 연결하는 것 (하나가 망가진다고 해도 다른 것은 정상적으로 작동한다.)이다.

이와 비슷한 방식이 컴퓨터 소프트웨어계에도 존재한다. ‘동기’와 ‘비동기’이다.

https://poiemaweb.com/js-async

SW의 ‘동기식 처리 모델’(Synchronous Processing Model), 동기 방식이란?

사회적으로 자주 쓰이는 단어, 동기(同期)란 ‘같은 시기’, ‘같은 기간’이라는 의미를 가진다. (동기-動機를 이야기하는 것이 아니다.) 동기식 모델 역시 이와 같은 개념을 공유한다. 동기식 처리란 즉 ‘일을 직렬적으로 수행함’을 이르는 말이다. 들어온 요청을 순차적으로 처리하며, 어떤 작업을 수행중일 때 다음 작업은 대기하는 선형적인 방식이다.

요청을 하면 얼마나 걸리던지 요청한 자리에서 결과가 주어지며 들어온 순서대로 진행된다. (요청이 들어왔을 때, 앞 작업이 끝나지 않았다면 다음 요청에 대한 작업은 진행되지 않는다.) 그러나 여러가지 요청을 동시에 처리할 수 없다는 단점이 존재한다.

‘비동기식 처리 모델’(Asynchronous Processing Model), 비동기 방식이란?

비동기식 처리 모델은 동기식 처리 모델과 완벽히 반대이다. 해당 요청에 의한 작업이 진행 중이더라도 계속 요청을 받는다. 각 작업이 독립적으로 실행되며 작업의 완료 여부를 기다리지 않고도 다른 작업을 실행할 수 있다. 동기식 처리 모델과 달리, 어느 한 요청에 대한 작업이 완료되지 않았다 하더라도 다음 코드를 실행할 수 있는 것이다.

이런 비동기 방식은 주로 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 사용된다.

https://blog.function12.io/tag/insight/understanding-synchronous-vs-asynchronous-execution-and-blocking-vs-non-blocking-operations/

동기 방식은 설계가 간단하고 직관적인 대신 전 작업이 처리 완료되기 전까지 다음 작업을 수행하지 못하고 대기한다는 단점이 존재하며, 비동기 방식은 동기 방식에 비해 복잡하나 결과가 주어지는 데에 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있어 자원을 효율적으로 사용할 수 있다는 장점이 존재한다.

이 중 ‘비동기식 처리 모델’ 로 AJAX가 있다. Asynchronous Javascript And XML의 약자인 이것은 자바 스크립트를 통해 비동기식으로 서버에 데이터를 요청하여, 필요한 부분의 데이터만을 받아와 전체 페이지를 새로 고치지 않고 변경이 필요한 페이지 부분만을 고친다. 페이지의 갱신 없이 서버와 비동기 통신을 가능하게 해주는데, 별도의 플러그인이 요구되지 않으며 http 전송 중에도 클라이언트가 웹 어플리케이션과 상호작용을 할 수 있다는 점은 유용하게 작용한다.

블로킹과 논 블로킹에 대해서도 알아두면 좋다. 이 역시 웹 서버와 I/O 작업 중 나오는 개념이다. 동기/비동기와는 다른 차원에서 작업의 수행 방식을 설명하는데, 앞서 말한 동기/비동기가 요청한 작업에 대하여 완료 여부를 신경써 작업을 순차적으로 수행할 지 아닐지에 대한 관점이라면 블로킹/논블로킹은 현재 작업이 block(차단, 대기)되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점이다.

블로킹 방식을 사용할 경우, A 함수가 B 함수를 호출할 때 제어권을 A로부터 B로 옮긴다. 제어권을 박탈당한 A는 B가 실행되는 동안 함수를 실행하지 않고 대기한다. (이를 선형적이라 볼 수도 있다.)

그러나 논 블로킹 방식은 A라는 함수가 B 함수라는 함수를 호출하더라도 제어권을 잃지 않고 본인이 가지고 있는다. 제어권은 본인이 그대로 가지고 있는 채로 B 함수를 실행시키기 때문에, B 함수를 호출한 뒤에도 계속 본인의 코드를 수행한다. 블로킹/논-블로킹과 동기/비동기는 병치된다. Sync-Blocking, Sync-NonBlocking, Async-Blocking, Async-NonBlocking이 가능하다.

1) Sync- Blocking

#동기 #블로킹 #제어권_한번에하나 #막아둠

Sync- Blocking 방식은 선형적으로 진행하는 방식이다. 위 그림의 함수 A는 함수 B의 리턴 값을 필요로 하는 동기식의 알고리즘이다. 그렇기 때문에 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다.(블로킹)B 함수의 수행을 기다리는 동안에는 아무것도 하지 못하고 대기하는 방식으로 이해하여도 된다.

2) Sync- NonBlocking

#동기 #블록안해둔것처럼 #계속 물어봄

이 경우 역시 Sync-Blocking처럼, A 함수는 B 함수의 수행 결과값을 필요로 하므로 B 함수를 호출한다. 그러나 A 함수는 B 함수에게 자신의 제어권을 주지 않고 자신의 코드를 계속 수행한다. (논 블로킹)

또, A 함수는 B 함수의 리턴값을 필요로 한다. 중간중간 B 함수에게 함수 실행을 완료했는지 물어보아야 한다.(동기)

이게 바로 논블로킹인 동시에 동기 방식이다.

3) Async-NonBlocking

비동기 논블로킹은 이해하기 쉽다. A 함수는 B 함수를 호출할 때, 위의 Sync-NonBlocking처럼 제어권을 B 함수에게 넘기지 않고 자신이 계속 가지고 있는다. 따라서 B 함수를 호출한 이후에도 멈추지 않고 자신의 코드를 실행하고 말이다.

대신 B 함수에게는 콜백함수(*매개변수 함수)를 함께 준다. B 함수는 자신의 작업이 끝나면 A 함수가 준 콜백 함수를 실행하는 식이다.

4) Async-blocking

이는 다른 것에 비해 마주치기 힘든 방식이다. 비동기 식으로(A는 B의 리턴값을 신경쓰지 않고 콜백 함수를 보낸다. B 함수의 작업에 관심이 없음에도 불구하고 A 함수는 B 함수에게 제어권을 넘긴다. A 함수는 자신과 관련 없는 B 함수의 작업이 끝날 때까지 기다려야 한다.

두 Async 방식에서, 콜백 함수는 비동기 처리가 끝난 후 해야 할 작업에 대해 순서를 보장해주기 위한 방법이다.

[참고 자료]

-https://80000coding.oopy.io/ed22f6e8-89ea-4164-a86e-a6b92a1f54b4

-https://won-percent.tistory.com/150

-https://sjparkk-dev1og.tistory.com/27

-https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

카테고리
#기타

댓글 0



추천 포스트