Sync, Async, Blocking, Non-Blocking

Gunjoo Ahn·2022년 8월 22일
0

동기와 비동기, 블로킹과 논블로킹

위 주제는 모아놓고 보면 항상 헷갈릴 수 밖에 없는 주제이다. 하지만 실행 순서를 제대로 숙지하기 위해서는 한 번쯤은 제대로 정리할 필요가 있다.

정말 잘 정리된 블로그가 있어서 참조에 링크를 달았다. 이 블로그의 예시를 보면 확실하게 이해할 수 있을 것이다. 다만 해당 블로그와 별개로 개인적으로 이해한 방식으로 설명해보고자 한다.

Sync, Async

Sync, Async 개념을 쉽게 이해하는 전제는 어떠한 일은 나 대신에 동시에 처리해줄 다른 녀석이 있다는 것이다. 애초에 서로 다른 개체끼리 무언가를 맞추는 것이 동기화이다.

다른 녀석에게 무언가 시켰는데, 이 녀석이 시킨 것을 완료하는 것을 지켜보는 것이 동기(sync)다. 결과를 반환 받으면서 동기화한 것이다.

반대로 완료하는 것을 지켜보지 않고 내 할 일을 하는 것이 비동기(async)이다. 결과를 반환 받지 않기에 동기화 하지 않는 것이다.

이 개념에 블로킹과 논블로킹은 상관 없다.

Blocking, Non-Blocking

제어권에 대한 이야기가 많지만, 간단하게 현상으로 이해하자면 로직을 진행하고 있는 주체인 내가 멈추냐 안멈추냐이다. 블로킹은 시킨 애의 로직이 완료되기를 기다린다. 논 블로킹은 시킨 애가 알아서 할 테니 일단 기다리지 않고 내 할 일을 계속하는 것이다. 이러니 그대로 사용하면 블로킹은 동기로 동작하고, 논 블로킹은 비동기로 동작하는 것이다.

Examples

Sync - Blocking

// Blocking
Result result = otherToDoSomething.send(&todo);
// result가 올 때까지 blocking 되어 있으며 결과를 확인하므로 동기이다.
if( result != null ){
	...
}

Sync - Non-Blocking

// Non-Blocking
otherToDoSomething.send(&todo, &result);
while( !result.finish  ){ // 작업이 끝났는지 확인하는 루프로 blocking되어 있는 것
	sleep(1);
}
// otherToDoSomething.send()함수 자체는 non-blocking 이지만,
// result에 값이 써질 때 까지 기다리므로,
// 코드 상 결과를 확인하는 것이다. 따라서 동기이다.

Async - Blocking

이런 경우가 무엇이 있나 찾아보니, Async - Non-Blocking을 사용하는 와중에 Blocking이 껴있으면 Async - Blocking으로 동작한다고 한다. 대표적인 예시가 Node.JS에서 MySQL을 이용할 때라고.

Async - Non-Blocking

Node.JS가 Async - Non-Blocking이다.

// https://expressjs.com/ko/starter/hello-world.html
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

console.log('hello world')

// 실제로 실행은 안해봤는데 아마 hello world가 먼저 찍히고,
// Example app listening on port 3000이 찍힐 것이다.

Reference

https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

profile
Backend Developer

0개의 댓글