Computer Science

[CS] 동기와 비동기 그리고 블로킹과 논블로킹

프로그래민 2021. 12. 29. 20:52
반응형

프로그래밍을 하거나 컴퓨터 과학을 학습할 때, 동기와 비동기 그리고 블로킹과 논블로킹이란 단어들을 쉽게 접할 수 있다. 다만 '동기==블로킹', '비동기==논블로킹'이란 개념을 쉽게 가질 수 있는데, 이는 잘못된 개념이다. 두개념들 사이에는 서로 연관관계가 없고, 별개의 개념이다. 두 개념은 서로 다른 관점을 가지고 있다. 간단히 정리하자면 다음과 같다.

  • 동기 vs 비동기 : 처리해야 할 작업들을 어떠한 흐름으로 처리 할 것인가에 대한 관점 (2개이상의 주체)
  • 블로킹 vs 논블로킹 : 처리되어야 하는 작업이 전체적인 작업 흐름을 막느냐 안막느냐에 대한 관점 (2개이상의 대상)

이렇게 두 개념이 작업에 대해 서로 바라보는 관점이 다르기때문에 이 두 개념은  비동기+논블로킹, 동기+논블로킹, 비동기+블로킹, 동기+블로킹 이렇게 공존할수도 있다.

 

동기(Synchronus)와 비동기(Asynchronous)

동기와 비동기

동기와 비동기의 차이는 호출되는 함수의 작업 완료를 신경쓰는지의 여부차이이다. 즉 작업을 수행하는 2개이상의 대상에 대해 다음 작업이 요청되는 시간과 관련이 있다. 

동기

  • 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청
  • 함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 대기
  • 작업 완료 여부를 계속해서 확인

비동기

  • 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청
  • 함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 처리
  • 작업 완료 여부를 확인하지 않음

 

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

블로킹과 논블로킹

블로킹과 논블로킹의 차이는 제어권을 어떻게 처리하는지에 대한 차이이다. 즉, 2개 이상의 작업 대상에 대해 제어권을 가져와 작업흐름을 막는지 안막는지와 관련이 있다.

블로킹

  • 제어권이 호출된 함수로 넘어감
  • 제어권을 가지게된 호출된 함수가 작업을 모두 끝낸 후 값과 제어권을 원래함수로 리턴
  • 기존 함수는 제어권이 없는 상태라 아무작업도 안함

논블로킹

  • 함수가 호출되어도 제어권은 그대로 있음(실제로는 제어권을 넘겨주지만 바로 돌려받음)
  • 기존 함수가 제어권을 가지고 있기에 다른 작업을 수행 가능

 

동기와 비동기, 블로킹과 논블로킹의 조합 예시

동기와 비동기, 블로킹과 논블로킹의 조합

아래는 간단한 예시이다. 상위 프로세스로써 선생님, 하위 프로세스로써 학생들을 예로 들어보았다.

동기 + 블로킹

요청받은 함수의 작업이 끝나야 제어권 돌려받음 + 요청자는 결과가 나올때까지 계속 확인

선생님 : 입실
학생1 : 1번문제 푸는중...
선생님 : 학생 확인
학생2 : 2번문제 푸는중...
선생님 : 학생 확인
학생3 : 3번문제 푸는중...
선생님 : 학생 확인
선생님 : 퇴실

동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰고, 블로킹 방식이기에 학생들의 작업이 완료되지 않으면 선생님은 다른 작업을 할 수 없다.

 

동기 + 논블로킹

제어권은 바로 돌려줌 + 요청자는 결과가 나올때까지 계속 확인

선생님 : 입실
학생1 : 1번문제 푸는중...
선생님 : 학생 확인, 딴짓
학생2 : 2번문제 푸는중...
선생님 : 학생 확인, 딴짓
학생3 : 3번문제 푸는중...
선생님 : 학생 확인, 딴짓
선생님 : 퇴실

동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰고, 논블로킹 방식이기에 학생들의 작업 완료 여부와 상관 없이 선생님은 다른 작업을 할 수 있다.

 

비동기 + 블로킹

요청받은 함수의 작업이 끝나야 제어권 돌려받음 + 결과는 요청받은 함수가 알려줌

선생님 : 입실
학생1 : 1번문제 푸는중...
학생2 : 2번문제 푸는중...
학생3 : 3번문제 푸는중...
선생님 : 퇴실

비동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰지 않고, 블로킹 방식이기에 학생들의 작업이 완료되지 않으면 선생님은 다른 작업을 할 수 없다.

 

비동기 + 논블로킹

제어권은 바로 돌려줌 + 결과는 요청받은 함수가 알아서 돌려줌

선생님 : 입실
선생님 : 퇴실
학생1 : 1번문제 푸는중...
학생2 : 2번문제 푸는중...
학생3 : 3번문제 푸는중...

비동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰지 않고, 논블로킹 방식이기에 학생들의 작업 완료 여부와 상관 없이 선생님은 다른 작업을 할 수 있다.

 

 

출처
https://cotak.tistory.com/136#%EB%B-%--%EB%-F%--%EA%B-%B-%--%-B%--%EB%B-%--%EB%A-%-C%ED%--%B-
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
https://joooing.tistory.com/entry/%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9
https://deveric.tistory.com/99
https://siyoon210.tistory.com/147
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
https://cotak.tistory.com/136
반응형