본문 바로가기
카테고리 없음

동기(Synchronous) vs 비동기(Asynchronous), 블로킹(Blocking) vs 논블로킹(Non Blocking)

by 웅대 2024. 8. 22.
728x90
반응형

동기, 비동기

동기 비동기는 작업의 순서에 초점을 맞춘다.

 

동기 작업은 요청한 작업이 완료된 후 다음 작업을 진행하기 때문에 작업의 순서가 보장된다.

 

비동기 작업은 작업을 요청한 후 완료 여부를 따지지 않고 바로 다음 작업을 진행하기 때문에 작업의 순서가 보장되지 않는다.

 

https://wikidocs.net/168327

비동기의 장점은 요청을 보내고 완료 여부를 따지지 않기 때문에 여러 작업을 동시에 진행할 수 있지만 어떠한 작업이 먼저 완료되는지 알 수 없다.

 

블로킹, 논블로킹

블로킹, 논블로킹은 코드의 흐름을 제어할 수 있는 제어권에 초점을 맞춘다.

 

블로킹 방식은 함수를 호출하면 호출한 함수에게 제어권을 넘겨주기 때문에 코드의 흐름이 멈춘다.

 

논블로킹 방식은 함수를 호출하면 제어권을 자신이 가지고 있기 때문에 코드의 흐름이 멈추지 않는다.

 

동기 + 블로킹

동기/비동기작업의 순서, 블로킹제어권에 초점을 맞춘다는 것을 기억하고 다음 코드를 보자.

 

function sleep(milliseconds) {
    const start = new Date().getTime();
    let now = start;
    while (now - start < milliseconds) {
        now = new Date().getTime();
    }
    console.log("작업 끝");
}

console.log("프로그램 시작");
sleep(3000);
console.log("프로그램 끝");

 

위의 sleep 함수는 while문을 통해 원하는 시간만큼 main thread의 동작을 멈추게 한다.

 

작업의 순서가 지켜지고 제어권을 sleep 함수가 가지기 때문에 sleep 함수가 실행하는 동안 코드의 흐름이 멈춘다.

 

동기 + 블로킹 방식이다.

 

비동기 + 논블로킹

동기/비동기 작업의 순서, 블로킹 제어권에 초점을 맞춘다는 것을 기억하고 다음 코드를 보자.

 

function wait(milliseconds) {
    return new Promise((resolve, reject) => {
        setTimeout(()=>{
            console.log("작업 끝")
            resolve();
        }, milliseconds);
    })
}

console.log("프로그램 시작")
wait(3000)
console.log("프로그램 끝")

 

 

작업의 순서가 지켜지지 않고 제어권을 넘겨주지 않기 때문에 wait 함수가 실행되는 동안 코드의 흐름이 멈추지 않는다.

 

비동기 + 논블로킹 방식이다.

 

결론

작업의 순서가 지켜지면 Sync, 지켜지지 않으면 Async이다.

 

제어권을 넘겨주면 blocking, 넘겨주지 않으면 Non blocking이다.

출처

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC#%EB%8F%99%EA%B8%B0/%EB%B9%84%EB%8F%99%EA%B8%B0_+_%EB%B8%94%EB%A1%9C%ED%82%B9/%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9_%EC%A1%B0%ED%95%A9

 

https://wikidocs.net/168327

728x90
반응형

댓글