동기/ 비동기는 주로 어플리게이션에서 다뤄지는 개념이며, 다음 작업이 요청되는 시간과 관련이 있다.
동기(Synchronous)
- 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 기다린다.
- 작업 완료 여부를 계속해서 확인한다.
비동기(Asynchronous)
- 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.
- 함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 처리한다.
- 작업 완료 여부를 확인하지 않는다.
자바스크립트는 Single Thread 기반의 언어로 한번에 한 명력씩만 수행된다. 따라서 시간이 많이 걸리는 작업을 진행하는데 다른 작업을 동시에 실행할 수 없으면 굉장히 비효율적인 서비스를 만들 수 밖에 없다. 이런 약점을 보완하기 위해 자바스크립트는 비동기로 동작하며 콜백 함수를 사용해 Non-Blocking하게 프로그래밍을 하면 빠르게 동작할 수 있다.
이런 자바스크립트의 비동기 - 논블록킹 프로그래밍을 가능하게 해주는 것이 바로 메시지큐와 이벤트루프 모델이다.
동기와 비동기의 차이는 함수의 실행 결과를 어디서 처리하느냐에 따라 다르다.
동기: 함수를 실행하고, 결과를 함수를 호출한 곳에서 받아서 처리해야한다.
비동기: 함수를 실행하고, 결과를 함수를 호출한 곳에서 처리할 필요가 없다. 보통 콜백함수에서 처리하는 경우가 많다.
동기 예시
function add(a,b) {
return a + b;
}
const result = add(2, 3);
console.log(result); // 5
비동기 예시
function add(a,b) {
return a + b;
}
let result;
setTimeout(() => {
result = add(2, 3)
}, 2000);
console.log(result); // undefined
블로킹(Blocking)과 논블로킹(Non-Blocking)
블로킹/논블로킹은 주로 멀티 스래딩, I/O에서 사용되는 개념이며 함수 결과값의 리턴 시점과 함수의 제어권에 따라 차이가 난다.
블로킹: 제어권이 호출 함수에게 넘어가서 작업을 모두 마칠 때까지 제어권을 넘기지 않고 대기하게 만든다.
논블로킹: 제어권이 호출 함수와 동시에 넘어가서 호출한 함수가 다른 일을 할 수 있는 기회를 준다.
블로킹 예시
function loop() {
while(true) {}
return true;
}
var token = loop();
if (token) console.log("here");
위 코드의 경우 메인 실행 함수에서 loop 함수를 실행하면 "here"이라는 출력값은 볼 수 없다. 왜냐면 loop 함수의 제어권이 넘어가서 무한루프가 종료되지 않으면 값을 반환하지 않기 때문이다.
논블로킹 예시
function loop() {
while (true) {}
return true;
}
setTimeout(loop, 0);
console.log("here");
여기서는 "here"이라는 출력값을 볼 수 있는데 setTimeout 함수는 수행과 동시에 값이 리턴되며, loop함수가 콜백 함수로 실행되기 때문이다.
동기와 비동기에 관한 상세한 개념 설명은 다음 블로그 글을 참고하면 좋을것 같다.
참고 자료
파이썬 실습 자료
'📒 Tech Note > CS 기본기 뚝딱' 카테고리의 다른 글
[운영체제] IPC(Inter-Process Communication, 프로세스 간 통신)란? (0) | 2022.08.25 |
---|---|
[운영체제] 프로세스란? (0) | 2022.08.25 |