프로그래밍에서 동기식, 비동기식이란 무엇인가요?
프로그래밍에서 동기식, 비동기식이란 무엇인가요?
동기식, 비동기식 각각의 장단점 혹은 사용하는 법이나 자주 쓰이는 용도 등이 궁금합니다.
특히나 jQuery AJAX 등에서 async 옵션으로 동기/비동기를 선택할수있다는데
이게 무엇이 다른지 어떤 용도로 사용하는지 궁금합니다.
안녕하세요.
예를 들어 설명하겠습니다.
a라는 함수와 b라는 함수가 있다고 할 때..
동기식(sync)은 a함수가 완료되야만 b함수를 실행할 수 있고
비동기식(async)은 a, b 함수를 동시에 실행할 수 있다고 보면 됩니다.
당연히 비동기식은 여러개를 한 번에 실행하니 효율성이 좋은 장점이 있는 방면, 선후관계를 명확히 해야 되는 경우에는 사용할 수 없는 단점이 있습니다.
동기식은 순서대로 실행되는게 설계하기가 쉬운 방면 비동기식에 비해 비효율적인 면이 있습니다.
동기/비동기의 차이점은 호출되는 함수의 작업 완료 여부를 누가 신경쓰는가의 차이 입니다.
호출되는 함수의 작업 완료를 호출한 함수가 신경쓰면 동기
호출되는 함수의 작업 완료를 호출된 함수가 신경쓰면 비동기
두가지의 차이점을 작업의 흐름을 기준으로 생각해본다면
동기는 작업의 흐름을 호출한 함수가 관리하기 때문에 일정하게 코드가 실행되기 때문에 작업이 순차적으로 수행되지만,
비동기는 호출한 함수가 언제 끝날지 알 수 없기때문에 작업의 순서를 보장 받을 수 없습니다.
하지만 성능적 효율성을 생각해본다면
동기는 함수의 호출 후 호출의 완료될때까지 다음 코드로 넘어갈 수 없지만,
비동기는 함수의 호출 후 다음코드를 작업하고 호출된 함수가 완료될때 알림을 받아 처리할 수 있기때문에 보다 효율적으로 동작합니다.
- 보다 정확하게 설명을 하려면 blocking/non-blocking과 함께 설명해야 하지만 여기서는 생략하겠습니다.
jQuery를 이용한 ajax call을 예제로 설명해보자면,
$(function() { syncCall(); asyncCall(); }); function syncCall() { writeLog("syncCall Start!!"); $.ajax({ async: false, method: "POST", url: "/echo/html/", data: {delay: 2} }) .done(function() { writeLog("sync Done!!"); }); writeLog("syncCall End!!"); } function asyncCall() { writeLog("asyncCall Start!!"); $.ajax({ async: true, method: "POST", url: "/echo/html/", data: {delay: 2} }) .done(function() { writeLog("async Done!!"); }); writeLog("asyncCall End!!"); } function writeLog(message) { $(".message").append('<p>' + message + '</p>'); }syncCall()의 경우에는 동기방식으로 작동하게되고, ajax 요청 처리하게 됩니다.
syncCall Start!! -> sync Done!! -> syncCall End!!
asyncCall()의 경우에는 비동기방식으로 작동하게 되고, ajax 요청 만하고 다음 코드가 실행됩니다.
asyncCall Start!! -> async End!! -> async Done!!
동기식이라는 것은 호출자(caller)와 비호출자(callee) 간에 시작과 끝을 서로 맞춘다는 것 입니다. 다른 말로 표현하자면 cpu 제어권이 오직 1개만 있어 호출자가 비호출자를 호출할 때 제어권을 넘겨주고, 비호출자가 실행이 완료되면 호출자에게 제어권을 반환해주는 개념입니다. 즉 호출자가 비호출자를 호출하면 비호출자가 제어권을 넘겨줄 때까지 호출자는 기다리고 있습니다. 기다린다는 표현이 말해주듯 프로그램은 아무것도 하지 않고 기다리기 때문에 성능이 낮아질 수 있습니다. 흔히 말하는 랙이 이러한 기다리는 현상입니다. 성능은 낮지만 개발이 편해서 예전부터 많이 사용하던 방식입니다.
비동기식이라는 것은 호출자와 비호출자간에 시작과 끝이 맞지 않는다는 것 입니다. 다른 말로 호출자와 비호출자의 제어권을 공유하지 않습니다. 호출자와 비호출자 간에 제어권을 주고받지 않고 그냥 따로 실행합니다. 그렇기 때문에 호출자가 비호출자의 실행종료를 기다릴 필요가 없어 성능에 이득이 있습니다. 하지만 단점은 비호출자가 실행되고 난 결과값을 받을 방법이 없어지는데 jQuery ajax에서는 비동기 함수 호출시 콜백함수라는 것을 같이 넘겨줘서(Promise를 사용하면 약간 다름) 비동기 함수의 실행이 종료되면 해당 콜백함수를 실행해달라고 전달해줍니다. 이 방법이 약간 직관적이지 않고 콜백함수의 실행시간을 알 수 없다는 문제점 때문에 초보자에게 난해할 수 있습니다.
비동기식 방식은 여러가지 장점이 있지만 단점도 분명하기 때문에 IO작업이 있는 경우에 한해서 사용하길 권장합니다. IO는 파일을 읽거나 네트워크 통신을 하는 것을 말합니다. 파일 읽기와 네트워크 통신은 cpu사용률에 비해 하드웨어에서 지연시간이 많기 때문에 비동기 방식으로 개발하여 cpu 사용효율을 높이곤 합니다.
안녕하세요~! 아하(Aha) 지식답변자 다라닝입니다.
질문하신 내용에 대하여 아래와 같이 답변 드립니다.
진행처리 과정을 의미합니다.Sync는 요청한 결과를 기다리지않고 동시에 진행하며
Async는 반대로 동시에 일어나지 않는것을 말합니다.
앞선작업이 다음 작업에 영향을 미치는지에 따라 옵션으로 주시면 됩니다!
부족하지만 도움이 되셨기를 바라며 추가적인 문의가 필요하시면 답변 부탁드려요!동기는 그 함수가 호출되고 요청 결과를 기다리는 방식을 말하고,
비동기는 그 함수가 호출되도 요청 결과를 기다리지 않는 방식을말합니다.
동기는 그냥 호출만 하는 것이라 직관적이고 간단하지만 요청 결과를 받을 때까지 아무것도 못하고 기다려야 합니다.
반면에 비동기는 동기 호출 방식보다 복잡하지만 요청 결과를 기다리지 않고 다른 작업을 할 수 있습니다. 따라서 자원을 효율적으로 사용할 수 있습니다.