동기, 비동기, 블로킹, 논블로킹이 뭘까?

최민재·2022년 5월 17일
18

공부

목록 보기
2/5
post-thumbnail

수업이 마친 후 동아리 시간에 친구들과 짧다면 짧고 길다면 긴 토론을 했습니다. "동기가 뭐고 비동기가 뭘까?" 1시간 정도의 토론에도 "그 비동기는 동시에 하는거!" 뭐 이런식으로 제대로 된 결론을 내지 못했습니다. 그때의 토론의 열기가 너무 심한 탓에 아직도 영향을 받아 이제 지금까지 공부한 동기, 비동기, 블로킹, 논블로킹에 대해서 확실하게 정리하려고 합니다!

들어가며 ⭐️

여러 강의를 보고 글을 보았지만 항상하는 처음에 하는 이야기는

관점을 어디에 두느냐에 따라 Sync, Async, Blocking, non-Blocking이 다르다고 말합니다!

sync : 동기, async : 비동기

Blocking과 non-Blocking
그리고
Sync와 Async

저는 전까지 이 두 그룹이 같은 것이라고 생각했습니다.
그래서 async는 non-blocking.. sync는 blocking이라고 생각했죠..;;

위의 말의 관점을 어디에 두느냐를 집중하면 이 두 그룹의 차이를 알 수 있죠!
관점에 대해서 간단히 말해보겠습니다.

blocking, non-blocking : 함수의 제어권에 관심을 두고 있습니다.
sync, async : 함수의 종료 결과 처리에 관심을 두고 있습니다.

저는 이렇게 두 그룹의 차이를 알고 아래의 표를 보고 정말 신기하다고 생각했습니다.

Blocking이면 Sync라고 생각했던 저의 환상이 깨지고
Non-Blocking이면 Async라고 생각했던 저의 환상이 깨지고 말았습니다.

솔직히 Blocking에 Sync와 Non-blocking에 Async는 뭔가 이해가 될 거 같은데
Blocking에 Async...
Non-blocking에 Sync....

그래서 이제 한번 알아보도록 하죠! 🔥

Blocking, Non-blocking, Sync, Async 🧱

Blocking : 만약 create() 함수가 print() 함수를 실행하면
print() 함수가 일을 다 할 때까지 제어권을 돌려주지 않는 것.

Non-blocking : 만약 create() 함수가 print() 함수를 실행하면 바로 제어권을 다시 넘겨주고 create() 함수가 다른 일을 할 수 있도록 해줍니다.

Sync : 만약 calc() 함수가 add() 함수를 실행하면 add() 함수의 결과값을 calc() 가 처리합니다.

Async : 만약 create() 함수가 print() 함수를 실행하면 print() 함수의 결과를 print() 함수에서 처리하는 것입니다.

Blocking - Sync 👊

  1. 함수A가 함수B를 호출합니다.
  2. 함수A는 제어권을 함수B에게 넘깁니다.
  3. 함수B는 제어권이 있으니 함수를 실행합니다.
  4. 함수 실행 완료 후 제어권과 리턴값을 함수A로 다시 넘깁니다.
  5. 함수A가 리턴값을 가지고 실행됩니다.

여기서 함수A는 제어권이 없기 때문에 함수A는 멈추게 됩니다. (Block)

Non-Blocking - Async 🔥


1. 함수A가 함수B를 콜백 함수와 함께 호출합니다.
2. 함수B는 거의 바로 제어권을 다시 넘겨주고 실행합니다.
3. 함수A는 함수B가 실행이 되는 동안 다른 일을 수행합니다.. (Non-Blocking)
4. 함수B가 완료되고 콜백 함수를 실행합니다. (비동기)

Blocking - Async 🤕

위의 모델은 솔직히 평소에 많이 볼 수 있습니다.
하지만 이 Blocking - Async 모델은 정말 흔하지 않고 찾기도 힘듭니다.

1. 함수A가 함수B를 콜백 함수와 함께 호출하며 제어권을 넘깁니다. (Blocking)
2. 함수B는 제어권을 가지고 함수B를 실행합니다.
3. 완료 후 콜백을 호출하고 함수A에게 제어권을 넘깁니다. (Async)
4. 함수A가 다시 실행됩니다.

제어권이 없으므로 함수A는 함수B의 일이 끝날 때까지 멈추게 됩니다.
결과의 처리는 함수B가 하므로 Async가 성립합니다.

Non-blocking - Sync 🧐

이 모델도 마찬가지로 흔한 모델은 아닙니다. 조금 어려울 수도 있지만
그래도 열심히 해봅시다!!

1. 함수A는 함수B를 호출합니다. (제어권은 바로 반환되어 가지고 있음.)
2. 함수A와 함수B는 실행됩니다. (Non-blocking)
3. 함수A는 함수B에게 실행이 끝났냐고 계속 물어봅니다.
4. 만약 물어봤을때 함수B가 끝났다면 결과값을 반환합니다. (Sync)

함수A가 함수B에게 계속 끝났냐고 물어보는 이유는 Sync로 결과값을 받아야하기 때문입니다.
그리고 제어권을 주지 않기 때문에 Non-blocking이 성립합니다.

마치며 👍

이렇게 열심히 Blocking, Non-Blocking, Sync, Async를 알아보았습니다. 그림과 글씨에 소질이 없어서 좀 그림이 삐뚤빼뚤하며 보기 더러운거 같아서 아쉬운 감이 있습니다..

profile
Android Engineer

0개의 댓글