Sync / Async
동기는 요청과 그 결과가 동시에 일어난다는 뜻이며,
다시 말하면, 어떤 객체 또는 함수 내부에서 다른 함수를 호출했을 때 이 함수의 결과를 호출한 쪽에서 처리하면 동기입니다.
비동기는 요청과 그 결과가 동시에 일어나지 않는다는 뜻이며,
동기와 달리 어떤 객체 또는 함수 내부에서 다른 함수를 호출했을 때 이 함수의 결과를 호출한 쪽에서 처리하지 않으면 비동기입니다. -> 대표 예시 Ajax
1) 동기의 예
일반적으로 사용하는 함수들은 대부분 동기적 방식입니다.
C언어의 scanf()와 Java의 Scanner 객체의 next()메서드 같이 사용자의 입력을 받는 함수들이 그 예입니다.
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
sc.nextInt() 결과 사용자가 입력을 하면, 그 값은 num이라는 변수에 담깁니다.
즉, nextInt() 메서드를 호출하고 그 결과를 자신이 직접 처리 했습니다.
따라서 위의 코드는 동기적 방식이라 할 수 있습니다.
2) 비동기의 예
다음은 JS의 setTimeout() 함수이며, 비동기 방식의 예입니다.
setTimeout( foo, 3000);
function foo(){
console.log("2");
}
console.log("1");
setTimeout() 함수를 호출하면 3초 뒤에 foo() 함수가 수행되는 코드입니다.
setTimeout() 함수를 호출한 후 3초라는 시간이 흘러야 foo() 함수가 수행되며, 이 시간 동안 프로그램은 다음 코드를 읽기 때문에, 위 코드는 콘솔에 1, 2 순서로 출력이 됩니다.
여기서 foo()함수를 setTimeout()함수의 콜백( callback )함수라고 합니다.
콜백 함수란 비동기 방식에서 어떤 수행이 완료되었을 때( event가 발생했을 때 ) 수행해야 할 함수를 의미합니다.
이처럼 비동기 방식에서는 함수를 호출한 쪽에서 수행 결과를 직접 처리하지 않고 콜백 함수를 통해 수행 결과를 처리합니다.
이처럼 동기와 비동기는 수행의 결과를 함수를 호출한 쪽에서 직접 처리하느냐, 아니면 다른 곳에서 처리하느냐의 차이로도 볼 수 있습니다.
Blocking / Non-Blocking
블로킹은 자신의 수행결과가 끝날 때까지 제어권을 갖고 있는 것을 의미합니다.
논블로킹은 자신이 호출되었을 때 제어권을 바로 자신을 호출한 쪽으로 넘기며, 자신을 호출한 쪽에서 다른 일을 할 수 있도록 하는 것을 의미합니다.
1) 블로킹
동기 예제 코드에서는 사용자가 입력할 때까지 프로그램은 어떠한 동작도 수행하지 않습니다.
즉, 사용자가 입력할 때까지 제어권은 nextInt()메서드에게 존재하며, 사용자가 입력을 해야만 제어권이 넘어가서 이후의 코드가 수행됩니다.
이처럼 수행 결과가 끝날 때까지 제어권을 갖고 있는 것이 blocking 방식입니다.
2) 논블로킹
비동기 예제 코드의 수행 결과는 1, 2가 순서대로 출력됩니다.
그 이유는 setTimeout(foo, 3000) 함수를 호출할 때 제어권을 바로 반납하기 때문입니다.
즉, 3초 뒤에 foo() 함수가 실행이 되지만, 제어권을 반납했기 때문에 바로 다음 코드인 console.log("1")가 수행이 됩니다.
그리고 나서 3초라는 시간이 흘렀다는 이벤트가 발생하여 콜백 함수인 foo() 함수가 수행이 되는 것이죠.
이처럼 제어권을 바로 반납하는 방식을 non-blocking 방식이라 합니다.
결국 둘은 비슷한 개념 아닌가?
분명 동기와 블로킹은 언뜻 보면 마치 동일한 개념처럼 보인다. 하지만 이 둘은 바라보는 시점에 따라 그 의미가 달라진다.
Blocking, Non-Blocking의 기준은 제어권을 어느 쪽이 가지고 있느냐로 나뉘어지지만, Sychronous, Asynchronous 는 작업의 반환에 대해 영향을 받는지 받지 않는지로 나뉘어진다.
이제 동기 vs 비동기, 블로킹 vs 논블로킹을 예제로 쉽게 설명해보겠습니다.
등장인물
- 개발팀장 : 개발팀 작업의 흐름을 조율하고, 개발팀 사원들에게 업무를 지시한다.
- 사원1, 사원2, 사원3 : 개발팀장이 지시한 일을 성실하게 수행한다.
시나리오1 (비동기 + 논블로킹)
- 개발팀장이 사원1에게 업무A를, 사원2에게 업무B를, 사원3에게 업무C를 지시하였다. (비동기적 작업 지시)
- (그리고 바쁜 개발팀장은 개발팀 업무 이외에도 다른 업무를 보기 시작한다.)
- 사원들은 각자 본인의 맡은 작업을 끝내는대로 개발팀장에게 보고한다. (논블로킹 방식의 작업 처리)
시나리오1은 일반적인 회사의 작업 '흐름'입니다. 개발팀장이 사원들에게 업무를 지시하고 사원들은 본인이 맡은 일을 수행한 후에 개발팀장에게 본인의 작업을 보고하는 방식입니다.
여기서 개발팀장이 업무들을 '비동기적' 방식으로 처리하고 있습니다. 그리고 사원들은 본인의 작업을 '논블로킹' 방식으로 수행합니다.
시나리오2 (동기 + 논블로킹)
만약에, 개발팀장이 업무를 '동기적'으로 처리한다면 아래와 같은 시나리오가 발생됩니다.
- 개발팀장이 사원1에게 업무A를 지시한다.
- 개발팀장은 사원1이 업무A를 끝맞칠때 까지 사원1 모니터 뒤에서 기다린다.. .. 끝날 때 까지.. (동기적 작업 지시)
- 사원1이 업무A를 끝내면 개발팀장이 확인한다.
- 개발팀장이 사원2에게 업무B를 지시한다.
- 개발팀장은 사원2가 업무B를 끝맞칠때 까지 사원2 모니터 뒤에서 기다린다.. .. 끝날 때 까지.. (동기적 작업 지시)
- 사원2가 업무B를 끝내면 개발팀장이 확인한다.
- ....(사원3은 생략)...
전체적인 작업의 흐름을 제어하는 개발팀장이 사원에게 업무를 지시하고, 그 사원이 해당 업무를 끝내고 보고 받을 때 까지 기다리게 됩니다.
사원2와 사원3은 업무만 지시된다면 성실하게 수행할 준비가 되어있지만, 개발팀장의 작업 흐름상 앞선 사원의 일이 끝날 때까지 작업을 진행하지 못하게 됩니다.
시나리오3 (비동기 + 블로킹)
만약에, 개발팀장이 업무를 '비동기적'으로 처리하지만 사원들이 업무를 '블로킹'하게 진행한다면 아래와 같은 시나리오가 발생됩니다.
- 개발팀장이 사원1에게 업무A를 지시하고, 사원2에게 업무B를 지시하고 싶었지만... (비동기적 작업 지시를 하고 싶었지만)
- 사원1이 개발팀장을 붙잡는다. (블로킹 방식의 작업처리)
- 그리고 사원1은 자신의 일이 다 끝날때 까지 개발팀장을 놓아주지 않는다.
- 사원1의 업무가 끝나고 보고받고 나서야, 개발팀장은 사원2에게 업무B를 지시한다.
- ...(사원2,3 생략)..
개발팀장이 '비동기적'으로 작업을 진행하고 싶다하여도, 사원들이 개발팀장을 붙잡는다면 (blocking) 개발팀장은 사원들의 업무가 끝나고 보고 될 때까지 기다리게 됩니다.
시나리오4 (동기 + 블로킹)
(시나리오2와 동일하게 진행됩니다.)
결론
동기-비동기를 말하고자 한다면 개발팀장에 입장에서, 그리고 블로킹-논블로킹을 말하고자 한다면 사원의 입장에서 생각해야 합니다. (그리고 개발팀장도 상사에게 업무를 지시 받게 된다면 블로킹vs논블로킹 관점에서 생각해볼 수 있습니다.)
이를 조합하면 4가지에 경우가 발생되며, 비동기(async)+논블로킹 방식이 갖는 장점은 다른 3가지 경우에 비교하여 독보적이라 할 수 있습니다. 흔히 '비동기로 처리했다' 라는 말을 주로 사용하는데 이는 수행하고자 하는 작업이 '논블로킹'임을 내포하는 말입니다.
이렇게만 보면 '동기' 혹은 '블로킹' 방식이 효율적이지 못한 방식같지만, 순차적으로 작업이 처리되어야 한다면 '동기' 혹은 '블로킹' 방식을 사용해야 합니다.
ref
https://programming119.tistory.com/238 정의에 대해서 잘 내림 참고
https://victorydntmd.tistory.com/8
https://siyoon210.tistory.com/147
https://dip0cean.tistory.com/61
'Java 공부' 카테고리의 다른 글
자바의 데이터 타입(Primitive type, Reference type) (0) | 2022.02.28 |
---|---|
Java 컴파일 과정 (0) | 2022.02.28 |
Java 객체 직렬화(Serialization) 와 역직렬화(Deserialization) (0) | 2021.11.14 |
자바 스레드(Thread) 정리글 (0) | 2021.11.14 |
가비지 컬렉션(Garbage Collection)이란 (0) | 2021.11.13 |