생각해보면 직전 회사에 면접을 볼 때 계셨던 과장님께서 같은 질문을 3번인가 반복하셨었다.
동기와 비동기에 대해 설명해주세요.
3번 다 같은 대답을 하였었는데 최근 면접에서 아래 질문을 받고나서 스스로 깨닳았다.
Blocking과 Non Blocking에 대해 설명해주세요.
나 이거 제대로 모르구나.
면접 자리에서 깨닳고 스스로 엄청 부끄러웠다.
그동안 일하면서 알게 모르게 그 차이를 느껴왔던거 같은데 질문 받는 순간 확 느껴졌다.
그동안...
동기 == Blocking
이벤트가 발생했을 때 이벤트가 종료될 때 까지 해당 이벤트가 제어권을 가지고 있는다.
이로 인해 뒤에 들어온 모든 이벤트는 락이 걸린다.
비동기 == Non Blocking
이벤트가 발생했을 때 이벤트의 종료 여부와 상관없이 다음 이벤트를 수행한다.
수시로 이전에 호출된 이벤트의 종료 여부를 확인하고 종료되었을 경우 결과를 반환한다.
처럼 같은 의미로 이해하고 살았다.
얼추 맞지만 완전 다르다.
동기(Synchronous)
1. 함수를 호출 했을 때 작업의 완료 여부를 신경쓴다.
2. 반환될 때 까지 다음 작업(함수 호출)을 수행하지 못한다.
3. 호출한 함수에 문제가 발생하면 그 다음 함수 호출은 무한히 길어질 수 있다.
비동기((Asynchronous)
1. 함수를 호출 하고 작업의 완료 여부를 신경쓰지 않는다.
2. 반환받지 않아도 다음 작업(함수 호출)을 수행한다.
3. Casllback함수가 작업의 완료 여부를 신경쓴다.
4. A함수를 호출하고 B함수가 A함수의 Callback함수일 경우 A의 작업 완료 여부는 B함수가 신경쓴다.
5. A의 작업이 완료되면 B함수가 호출된다.
Blocking
1. 함수를 호출 했을 때 해당 함수로 부터 반환이 있을 때까지 작업을 정지한다.
Non Blocking
1. 함수를 호출 했을 때 바로 반환받아 제어권을 획득한다.
2. 할일을 하면서 호출한 함수의 결과를 계속해서 확인하거나 하지 않는다. (동기/비동기에 따라 나뉨)
동기/비동기는 Callback 여부에 따라 나뉘고
Blocking/Non Blocking은 제어권의 Return 시점에 따라 나뉜다.
즉 두 그룹의 가장 큰 차이는 관심사이다.
동기이면서 Non Blocking일 수 있는 거고 비동기이면서 Blocking일 수 있는거다.
동기 - Blocking
동기이므로 호출자가 함수의 반환을 신경쓴다.
Blocking이므로 제어권을 함수에게 넘겨준다.
일반적인 명령형 프로그래밍으로 Java가 대표적이다.
Application에서 Kernel로 Read I/O를 호출했다.
이때 제어권은 Kernel로 넘어가고 Kernel에서 Read I/O작업이 완료 되고 제어권과 결과 값이 반환될 때 까지 Application은 어떤 작업도 할 수 없다.
동기 - Non Blocking
동기이므로 함수의 반환을 호출자가 신경 쓴다.
Non Blocking이므로 제어권은 호출자에게 곧 바로 반환된다.
Application에서 Kernel로 Read I/O를 호출했다.
이때 제어권은 Kernel에서 Application으로 곧 바로 반환되었다.
이후 동기이므로 Application에서 Kernel로 계속해서 반환을 확인한다.
이 사이 Non Blocking이므로 제어권은 Application에게 있고 Application에서는 다른 작업을 수행할 수 있다.
비동기 - Blocking
비동기이므로 호출자가 반환을 신경쓰지 않는다.
Blocking이므로 제어권은 호출된 함수에게 있다.
비효율적이라 직접적으로 사용하는 모델은 없지만 Node.js와 MySQL을 함께 사용하는 경우 해당 방식으로 동작하게 된다고 한다.
비동기 - Non Blocking
비동기이므로 호출자가 반환을 신경쓰지 않는다.
Non Blocking이므로 제어권은 호출자에게 곧 바로 반환된다.
Application에서 Kernel로 Read I/O를 호출했다.
이때 제어권은 Kernel에서 Application으로 곧 바로 반환되었다.
이후 비동기이므로 Application에서는 반환을 신경쓰지 않는다.
Kernel에서는 작업이 완료되면 Callback함수를 수행한다.
이 사이 Non Blocking이므로 제어권은 Application에게 있고 Application에서 다른 작업을 수행할 수 있다.
이제 늦었지만 천천히 동기/비동기, Blocking/Non Blocking을 Java로 구현해보고 내용을 정리해서 올리고자 한다.
그럼 과제를 수행할 때 충분히 적용할 수 있을거다.
- 참고
https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx
'개발 > Java' 카테고리의 다른 글
Socket(Selector)으로 Blocking, NonBlocking 구현 (0) | 2022.02.07 |
---|---|
WebFlux로 Blocking, NonBlocking 구현 (0) | 2022.01.28 |
Reactive란 (0) | 2022.01.21 |
[java] dual pivot quick sort/정렬 (0) | 2021.08.11 |
[java] DataInputStream.read(byte[] b)와 ByteArrayOutputStream.write(byte[] b)의 b (0) | 2021.07.01 |