Synchronous/Asynchronous 방식과 Blocking/Non-Blocking 방식에 대해서

2024. 9. 10. 13:30OperatingSystem

Synchronous 방식

Synchronous 방식은 스레드가 어떤 함수 작업을 수행할 때 함수 작업 안에 다른 여러가지 작은 작업들을 전체적인 관점에서 순차적으로 완료하는 방식입니다. 예를 들어 다음 그림과 같이 스레드#1 가 함수를 호출 시 함수 안에는 A,B,C I/O 작업이 존재합니다. 스레드#1이 실행하는 함수가 Synchronous 방식으로 작동한다면 전체적으로 볼때 작업들은 순차적으로 완료되어 A -> B -> C 작업 순으로 완료될 것입니다.
다음 그림에서 A, C I/O 작업은 블로킹(Blocking) 방식이기 때문에 A, C 작업을 호출한 스레드는 작업이 완료될 때까지 대기하는 것을 볼수 있습니다. 반면에 B 작업은 논블로킹(Non-Blocking) 방식이기 때문에 B 작업이 끝날때까지 대기하지 않고 다음 작업들을 계속 진행합니다. 하지만 여기서 주목할 점은 스레드#1이 함수를 진행하는 방식이 Synchronous 방식이기 때문에 C 작업을 시작하기 전에 계속 B 작업이 완료 되었는지 요청하는 것을 볼수 있습니다. 왜냐하면 Synchronous 방식은 각각의 작업을 순차적으로 완료해야 하기 때문입니다.

스레드#1은 함수 안에서 작은 I/O 작업인 A, B, C 작업을 순차적으로 완료한다

Synchronous 방식의 장단점

장점

  • 코드가 전체적으로 순차적으로 작동하기 때문에 디버깅 및 유지보수가 쉽고 코드 파악이 쉽습니다.

단점

  • 긴 시간이 걸리는 I/O 작업이 여러개 있는 경우 성능상 느릴수 있습니다.

Asynchronous 방식

Asynchronous 방식은 Synchronous 방식과는 다르게 스레드가 어떤 함수 작업을 수행할 때 함수 작업 안에 다른 여러가지 작은 작업들이 존재한다면 해당 작은 작업들을 순차적으로 처리하지 않습니다. 작은 작업 함수들의 대기 방식에 따라 작업을 완료하는 순서가 다를 수 있습니다. 예를 들어 다음 그림과 같이 스레드#1이 함수를 호출할 때 함수 안에는 A, B, C I/O 작업이 존재합니다. 호출자인 스레드#1은 A, B, C 작업을 호출합니다.
다음 그림을 보면 A, C 작업은 논블로킹 방식으로 작동하고, B 작업은 블로킹 방식으로 작동합니다. 그래서 쓰레드#1이 A, C 작업을 호출할 때는 끝날때까지 대기하지 않고 바로 다음 작업을 진행합니다. 반면에 B 작업을 호출할 때는 B 작업이 끝날 때 까지 쓰레드#1은 대기합니다.

스레드#1은 함수 안에서 A, B, C 작업을 수행하는데 순차적으로 완료되지 않는다

위 그림과 같이 Asynchronous 방식은 작업들간에 대기 방식에 따라서 작업 완료 순서가 다를수 있습니다. 위 그림과 같은 경우 B -> A -> C와 같은 순서로 작업이 완료될 수 있습니다.

Asyncrhonous 방식의 장단점

장점

  • 코드가 순차적으로 완료되지 않을 수 있기 때문에 긴 시간이 걸리는 I/O 작업을 먼저 수행하면서 다른 작업을 진행할 수 있습니다.

단점

  • 코드가 전체적으로 순차적으로 완료되지 않을 수 있기 때문에 디버깅 및 유지보수가 어렵고 코드 파악이 어렵습니다.

블로킹(Blocking) 방식과 논블로킹(Non-Blocking) 방식

블로킹 방식은 작업을 호출한 스레드가 작업이 끝날때 까지 대기하는 방식이고 논블로킹 방식은 작업을 호출한 스레드가 대기하지 않고 다른 작업을 계속 진행하는 방식입니다. 따라서 블로킹/논블로킹의 차이는 작업을 실행할 때 호출한 스레드의 대기 방식의 여부의 차이인 것을 알수 있습니다.

Synchronous/Asynchronous와 Blocking/Non-Blocking 조합

  • Synchronous + Blocking : 작업을 호출한 스레드가 함수 작업이 끝날 때까지 대기합니다.
  • Synchronous + Non-Blocking : 작업을 호출한 스레드가 대기하지 않고 다음 작업을 진행합니다.
  • Asynchronous + Blocking : 작업을 호출한 스레드가 작업이 끝날 때까지 대기합니다.
  • Asynchronous + Non-Blocking : 작업을 호출한 스레드가 대기하지 않고 다음 작업을 진행합니다.

위 4가지 조합의 수행 과정을 그림으로 표현하면 다음과 같습니다.

 

정리

Synchronous 방식과 Asynchronous 방식은 함수 실행시 전체적인 관점에서 순차적으로 함수 안에 작은 작업들을 완료하느냐 안하느냐에 차이입니다. 그리고 함수 안에 어떤 한 작업을 실행할때 작업을 호출한 스레드가 대기하느냐, 대기하지 않느냐에 차이에 따라 Blocking 방식과 Non-Blocking 방식의 차이로 구분됩니다.

 

 

References

https://choi-geonu.medium.com/%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%93%A4%EC%9D%B4-%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A0-%EB%8F%99%EC%8B%9C%EC%84%B1-2-%EB%B8%94%EB%A1%9C%ED%82%B9%EA%B3%BC-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-e11b3d01fdf8