수업이 마친 후 동아리 시간에 친구들과 짧다면 짧고 길다면 긴 토론을 했습니다. "동기가 뭐고 비동기가 뭘까?" 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 : 만약 create()
함수가 print()
함수를 실행하면
print()
함수가 일을 다 할 때까지 제어권을 돌려주지 않는 것.
Non-blocking : 만약 create()
함수가 print()
함수를 실행하면 바로 제어권을 다시 넘겨주고 create()
함수가 다른 일을 할 수 있도록 해줍니다.
Sync : 만약 calc()
함수가 add()
함수를 실행하면 add()
함수의 결과값을 calc()
가 처리합니다.
Async : 만약 create()
함수가 print()
함수를 실행하면 print()
함수의 결과를 print()
함수에서 처리하는 것입니다.
여기서 함수A는 제어권이 없기 때문에 함수A는 멈추게 됩니다. (Block)
1. 함수A가 함수B를 콜백 함수와 함께 호출합니다.
2. 함수B는 거의 바로 제어권을 다시 넘겨주고 실행합니다.
3. 함수A는 함수B가 실행이 되는 동안 다른 일을 수행합니다.. (Non-Blocking)
4. 함수B가 완료되고 콜백 함수를 실행합니다. (비동기)
위의 모델은 솔직히 평소에 많이 볼 수 있습니다.
하지만 이 Blocking - Async 모델은 정말 흔하지 않고 찾기도 힘듭니다.
1. 함수A가 함수B를 콜백 함수와 함께 호출하며 제어권을 넘깁니다. (Blocking)
2. 함수B는 제어권을 가지고 함수B를 실행합니다.
3. 완료 후 콜백을 호출하고 함수A에게 제어권을 넘깁니다. (Async)
4. 함수A가 다시 실행됩니다.
제어권이 없으므로 함수A는 함수B의 일이 끝날 때까지 멈추게 됩니다.
결과의 처리는 함수B가 하므로 Async가 성립합니다.
이 모델도 마찬가지로 흔한 모델은 아닙니다. 조금 어려울 수도 있지만
그래도 열심히 해봅시다!!
1. 함수A는 함수B를 호출합니다. (제어권은 바로 반환되어 가지고 있음.)
2. 함수A와 함수B는 실행됩니다. (Non-blocking)
3. 함수A는 함수B에게 실행이 끝났냐고 계속 물어봅니다.
4. 만약 물어봤을때 함수B가 끝났다면 결과값을 반환합니다. (Sync)
함수A가 함수B에게 계속 끝났냐고 물어보는 이유는 Sync로 결과값을 받아야하기 때문입니다.
그리고 제어권을 주지 않기 때문에 Non-blocking이 성립합니다.
이렇게 열심히 Blocking, Non-Blocking, Sync, Async를 알아보았습니다. 그림과 글씨에 소질이 없어서 좀 그림이 삐뚤빼뚤하며 보기 더러운거 같아서 아쉬운 감이 있습니다..