sharingStorage

Synchronous(동기) vs Asynchronous(비동기) 본문

개념

Synchronous(동기) vs Asynchronous(비동기)

Anstrengung 2022. 1. 3. 15:26

Synchronous(동기) : '사전적인 뜻은 동시에 일어나는' 이다. 

 

 

동기라는 단언의 한자를 보면 같을 동(同), 기약할 기(期)를 사용한다. 같은 기간, 같은 주기라고 해석할 수 있지만 컴퓨터 공학에서 다루는 '동기' 와는 다른 것 같다.

 

 

컴퓨터 공학에서의 동기는 "작업의 요청과 응답이 동시에 발생하는 것" 이라는 말도 있지만. 이렇게만 말하면 순서가 없게 느껴진다. 따라서 조금도 보태자면 '이전 작업의 응답과 다음 작업의 요청이 동시에 발생하는 것' 이라고 생각하는 것이 이해가 빠를 것 같다. A와 B작업을 수행한다고 해보자 동기적으로 작업이 진행된다면 이전 작업의 응답이 있어야만 다음 작업의 요청이 있는 것이므로 A를 요청하면 A의 요청결과가 돌아왔을 때에만 비로소 B 작업을 수행할 수 있는 것이다.  

"모든 일은 순차적으로 실행되며 어떤 작업이 수행중이라면 다음 작업은 대기하게 된다."

 

 

장점과 단점

얼핏보면 나쁘게만 들릴지 모르겠지만 동기방식은 설계가 간단하고 직관적이라는 장점이 있다.

당연히 단점은 우선 요청한 것의 결과가 주어질 때까지 다른 일을 하지 못하고 대기해야한다는 점을 들 수 있다.

 

 

Asynchronous(비동기): 동기가 아닌 것을 뜻한다.

즉 동기의 반대인데 요청한 결과가 동시에 일어나지 않을 거라는 것이다.

공부를 하며 멀티쓰레드와 비슷하다는 생각을 했다.

 

 응답상태와 상관없이 다음 동작을 수행할 수 있다는 것

 

 

장점과 단점

비동기는 설계가 복잡하지만 결과가 나오지 않아도 기다리는 시간동안 병렬적으로 다른 작업을 수행할 수 있다는 장점이 있다.

 

 

비동기가 필요한 이유

나는 웹개발자를 목표로 공부를 하고 있기 때문에 웹으로 예를 들자면 웹에서 서버로부터 데이터를 받아올 때 서버로부터 데이터를 받아오는 코드가 실행되어야 할 것이다. 근데 이게 만약 동기적으로 구성되어 있다면 데이터를 받아오기까지 기다린 다음에 웹페이지의 기능이 실행될 것이고 서버에서 가져오는 데이터양이 늘어날 수록 웹페이지의 로딩은 길어지고 속도는 늦어질 것이다. 

따라서 데이터를 수신하는 코드와 페이지를 표시하는 것은 비동기적으로 처리를 해야한다.

 

블록 논블록

동기와 비동기를 언급할 때 꼭 같이 언급되는 개념이다.

 

 

블록(block)은 어떤 함수를 호출했을 때 원하는 작업들을 모두 끝마칠 때까지 기다렸다가 return되면 이것을 보고 블로킹되었다고 한다.

블록으로 감싸져있는 것으로 이해하고 있다.

 

논블록(non-block)은 어떤 함수를 호출했을 때, 원하는 작업들을 요청하고 바로 return 되면 이것을 논블로킹 되었다고 한다.

 

 

동기 비동기와 블록, 논블록을 조합해 4가지 경우가 있는데

가장 접하기 쉬운 것은 블로킹/동기, 논블로킹/비동기이다.

 

 

blocking / synchronous :

동기방식이기에 작업의 흐름도 순차적으로 진행되는 것이 보장되고, 블로킹방식이기 때문에 어떠한 작업이 진행중일 때는 다른 작업을 동사에 진행할 수 없다.

 

non-blocking / asynchronous:

비동기 방식이기때문에 상위 프로세스는 하위 프로세스의 작업여부를 신경쓰지않는다.

그리고 논블록킹 방식이기 때문에 상위 프로세스는 하위 프로세스에게 일을 맡기고 자신의 작업을 계속 수행할 수도 있다.

방식은 여러 개의 작업을 동시에 처리할 수 있는 부분에서 효율적이라고 할 수 있지만, 너무 복잡하게 얽힌 비동기 처리 때문에 개발자가 어플리케이션의 흐름을 읽기 어려워지는 등의 문제가 있을 수 있다.

 

JavaScript에서 Promise나 async/await와 같은 문법을 사용하는 이유도 이런 비동기 처리의 흐름을 좀 더 명확하게 인지하고자 하는 노력인 것이다.

 

따라서 JS에있는 Promise함수와 callback함수, setTimeout등 과 같은 많은 비동기 함수를 다음 포스트에 다루도록 하겠다.

 

 

 

 

Reference

https://ko.javascript.info/callbacks  

https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/  

https://velog.io/@lsj8367/Javascript-%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%B0%A9%EC%8B%9D%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90 

https://evan-moon.github.io/2019/09/19/sync-async-blocking-non-blocking/#%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B3%B5%ED%95%99%EC%97%90%EC%84%9C%EC%9D%98-%EB%8F%99%EA%B8%B0

 

 

'개념' 카테고리의 다른 글

localStorage와 sessionStorage  (0) 2022.06.27
HTTP 프로토콜에 대해  (2) 2022.01.14
Pure function vs Impure function  (0) 2022.01.10
Comments