동기와 비동기... 굉장히 많이 나오는 주제이고, 개발하다보면 많이 들리는 얘기이다.
(물론 중요한 개념인 것도 맞고)
동기/비동기, blocking/non-blocking 굉장히 헷갈린다. (나도 엄청 헷갈렸고 많이 혼용해서 사용했음...)
전에 GCD에 대해 공부하면서 명확하게 알고 있을 필요가 있어 공부해뒀었는데 글로 남겨두려고 한다.
(GCD도 포스팅해야지... 왜케 자꾸 포스팅할 것이 많아질까..)
네트워크 코드를 작성하면서 동기/비동기에 대해서 더 많이 접했던거 같다.
Thread1
이 작업을 시작 시키고, Task1
이 끝날때까지 기다렸다 Task2
를 시작한다.Thread1
이 작업을 시작 시키고, 완료를 기다리지 않고, Thread1
은 다른 일을 처리할 수 있다.blocking과 non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다.
사실 이렇게만 보면 동기랑 blocking이 비슷하고, 비동기랑 non-blocking이 비슷해보인다.
동기/비동기, blocking/non-blocking 두 그룹의 차이는 관심사가 다르다.
이 그룹은 호출되는 함수가 바로 return하느냐 마느냐가 관심사이다.
호출된 함수가 바로 return해서 호출한 함수에게 제어권을 넘겨주고
호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있으면 non-blocking이다.
호출된 함수가 자신의 작업을 모두 마칠 때까지
호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 blocking이다.
이 그룹은 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사이다.
호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면
호출되는 함수가 전달받은 callback을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 않는다면 비동기이다.
호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나
호출되는 함수로부터 바로 return 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경 쓴다면 동기이다.
동기/비동기, blocking/non-blocking에 대해 공부하다보면 아래와 같은 그림과 자주 마주치게 된다.
결과가 처리되어 나올때까지 기다렸다가 return 값으로 결과를 전달한다.
작업 요청을 받아서 별도의 프로세서에서 진행하게 하고 바로 return(작업 끝)한다.
결과는 별도의 작업 후 간접적으로 전달(callback)한다.
결과가 없다면 바로 return한다.
결과가 있으면 바로 결과를 return 한다.
(결과가 생길때까지 계속 완료 되었는지 확인)
호출되는 함수가 바로 return하지 않고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는다.
(이 조합은 사실 이점이 없어서 일부러 이 방식을 사용하진 않는다고 한다.)
(의도하지 않게 blocking+Async로 동작하는 경우가 있다고는 한다. 이는 non-blocking+Async를 추구하다 의도가 변질되어버림... 대표적으로 Node.js + MySQL 조합이라고 한다.)
상황: 급하게 알아야 하는 답을 누군가에게 물어봐야하는 상황
(이 영상이 이해하는데 도움이 될까해서 첨부해두겠다.)
헷갈리는 개념인데 너무 잘 설명해주셔서 감사합니다 마지막 예시로 이해가 됐어요!