본문 바로가기

컴퓨터 과학(CS)

[컴퓨터 과학 - CS]동기와 비동기 / 블로킹 논블로킹

728x90

안녕하십니까! 숯 같은 개발자 엄탱입니다!!

저번 주에는 제가 코로나에 걸려서 한 주간 푹 쉬었습니다 :)

여러분도 걸리셔서 자연 백신 가지세요 하하하

 

헛소리는 그만하고 바로 시작하겠습니다!!

 

동기는 블로킹이고 비동기는 논블로킹이다. (X)

동기 & 비동기와 블로킹 & 논블로킹은 서로 다른 개념이다. (O) 


급한 분들을 위한 간단 요약

동기 & 비동기 : 리턴 값을 확인 유무로 구분

  • 동기: 리턴 값을 기다리거나, 완료가 안되고 리턴 값을 받더라도 작업 완료 여부를 계속 확인을 합니다.
  • 비동기: 리턴 값을 신경 쓰지 않고 따로 동작합니다.

블로킹 & 논블로킹 : 제어권의 주체를 넘기느냐 안 넘기느냐로 구분

  • 블로킹: 제어권을 넘기고 제어권을 다시 돌려받을 때까지 기다렸다가 돌려받고 동작을 시작합니다.
  • 논블로킹: 제어권을 넘기지 않고 동작을 합니다.

 

도대체 동기와 비동기, 블로킹과 논블로킹은 어떻게 다르며 개념은 무엇일까요!?

동기와 비동기 그리고 블로킹과 논블로킹이라는 용어는 개발을 하다 보면 자연스럽게 보이는 용어입니다.

특히나 동기와 비동기는 동기는 당연한 거고 비동기는 개발을 하다 보면 많이들 사용하지만, 사용 방법은 알지만 개념을 잘 모르는 상태에서 개발을 하는 경우가 많을 거라 생각합니다. 개념을 잘 모르는 상태이다 보니 흔히들 동기는 블로킹이며 비동기는 논블로킹으로 오해하는 경우가 많지만, 엄연히 별개의 개념이라는 거!! : )

* 오해하는 이유: 여러가지 이유가 있겠지만, 대부분의 코드 동작방식이  '동기 + 블로킹'  ||  '비동기 + 논블로킹'으로 동작하기 때문이 아닐까 생각됩니다 :)

그럼 도대체 동기와 비동기 그리고 블로킹과 논블로킹은 어떻게 다를까요?

간단히 설명하자면, 동기와 비동기는 리턴 값의 확인 유무로 블로킹과 논블로킹은 제어권의 유무로 구분 지어집니다.

 

동기 & 비동기 (리턴 값 확인 유무)

  • Synchronous : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작
  • Asynchronous : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음

 

여기서 잠깐!!!
TMI지만, 제 차가 아반떼인데 운전석과 조수석의 온냉풍기 온도 조절하는 거에 sync, async라고 써져습니다.
여기서 설정을 sync로 하고 한쪽에서 조절하면 동시에 변경이 되고 async로 하면 각각 조절이 됩니다.

 

동기

동기(synchronous)는 사전적인 의미로 '동시 발생[존재]하는' 라는 의미를 갖고 있습니다.

이렇게 생각해보면, sync는 연결을 시켜서 같이 움직이게 하는 거구나라고 생각됩니다. 즉, sync 된 것들은 연관성이 생긴다는 뜻으로도 생각됩니다.

그렇다면 뭐가 연결이 되고 연관성이 있다는 것일까요? 동기는 함수 A에서 호출되는 함수 B의 작업 완료 후 리턴을 기다리거나, 완료가 안되고 리턴 받더라도 작업 완료 여부를 계속 확인을 합니다. 즉, 함수 A는 호출된 함수 B의 리턴 값을 사용해야 하기 때문에 계속 확인을 받는 거겠죠? 즉 A와 B가 연결이 되어있는 것입니다.

 

 

비동기

비동기(asynchronous)는 사전적인 의미로 ‘동시에 존재[발생] 하지 않는’라는 의미를 갖고 있습니다.

동기와는 반대로 서로 연관성이 없다고 생각하면 될 것 같습니다.

그렇다면 뭐가 연결이 되고 연관성이 없다는 것일까요?

비동기는 함수 A에서 호출되는 함수 B의 작업 완료에 관계 여부, 리턴 여부를 신경 쓰지 않고 동작합니다.

 

동기와 비동기 예를 들어 보겠습니다!
위에 제가 TMI라고 적어 놓은 부분 중에 온냉풍기 온도 조절 장치를 sync로 맞추면 A 조절기의 온도를 조절하면 A조절기 온도가 맞춰지는 동시에 B조절기 온도 맞춰진다고 설명드렸습니다! 이 부분을 개발 관점에서 살펴보겠습니다.

sync로 맞추면 A조절기의 온도가 리턴 값이고 리턴 값을 B조절기가 확인하고 A와 B가 같이 온도가 맞춰지는 것입니다. 연결되어 있다고 볼 수 있죠??

async로 맞추면 A조절기, B조절기는 각각의 온도 리턴 값을 신경 쓰지 않습니다. 연결이 끊겼다고 볼 수 있죠??

 

블로킹 & 논블로킹 (제어권 주체)

  • Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
  • Non-Blocking : 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것

 

블로킹

블로킹에서 block은 사전적인 의미로 ‘막다’, ‘차단하다’라는 의미를 갖고 있습니다. 의미 전달이 확실하네요! 즉, 블로킹은 작업을 막는다는 의미를 갖고 있는 것 같습니다.

블로킹은 함수 A에서 B함수를 호출할 때, 제어권을 함수 A가 호출한 함수 B에 넘겨줍니다. 그렇게 되면 함수 A의 실행은 제어권을 돌려받기 전까지는 멈춰있게 됩니다.

논블로킹

논블로킹은 non + block 이기 때문에 ‘막지 않는다’라는 의미를 갖고 있겠죠!?
즉, 함수 A가 함수 B를 호출하더라도 제어권은 그대로 함수 A가 갖고 있고 함수 B를 호출한 이후에도 함수 A의 코드를 계속 실행합니다.

 

동기 & 비동기, 블로킹 & 논블로킹의 조합

그렇다면 동기와 비동기 그리고 블로킹과 논블로킹을 조합하면 어떻게 나오는지 확인해보겠습니다. 

 

1) 동기 + 블로킹 (Sync-Blocking)

동기: 함수 A는 호출한 함수 B의 리턴 값을 필요로 합니다.

블로킹: 함수 A는 호출한 함수 B에게 제어권을 주고 함수 B에게 제어권을 돌려받을 때까지 실행을 멈추고 기다립니다.

 

2) 동기 + 논블로킹 (Sync-NonBlocking)

동기: 함수 A는 호출한 함수 B의 리턴 값을 중간중간 계속 확인합니다.

논블로킹: 함수 A는 호출한 함수 B에게 제어권을 주지 않고 계속 실행합니다.

 

동기와 논블로킹의 경우는 잘 이해가 안 될 수 있기 때문에 한 가지 예를 들어 보겠습니다 :)
제 차인 아반떼의 온냉풍기 온도 조절기가 적절한 예일 것 같아 한번 예시를 들어보겠습니다!!

1 ) sync로 온도 23도 설정
- 온도 조절기 A와 온도 조절기 B는 서로의 리턴 값을 확인(동기)
- 각각 온도 조절기 A는 온냉풍기 a를 23도로 작동 , 온도 조절기 B는 온냉풍기 b를 23도로 작동 (논블로킹)

2) 온도 조절기 B의 온도를 20도로 변경
- 온도 조절기 A와 온도 조절기 B의 리턴 값이 변경된 것을 확인(동기)
- 각각 온도 조절기 A는 온냉풍기 a를 20도로 작동 , 온도 조절기 B는 온냉풍기 b를 20도로 작동 (논블로킹)

3) 비동기 + 블로킹 (Async-Blocking) - 거의 사용 X

Async-Blocking의 경우는 sync-blocking과 성능의 차이가 비슷하기 때문에 사용하는 경우가 거의 없습니다.

비동기: 함수 A는 호출한 함수 B의 리턴 값을 신경 쓰지 않습니다.

블로킹: 함수 A는 호출한 함수 B에게 제어권을 주고 함수 B에게 제어권을 돌려받을 때까지 실행을 멈추고 기다립니다.

 

4) 비동기 + 논블로킹 (Async-NonBlocking)

 

비동기: 함수 A는 호출한 함수 B의 리턴 값을 신경 쓰지 않으며, 함수 A와 함수 B는 서로 연관성이 없습니다.

논블로킹: 함수 A는 호출한 함수 B에게 제어권을 주지 않고 계속 실행합니다.

 

제가 준비한 건 여기까지입니다 :)

부족한 부분이 있거나 잘 못 알고 있는 내용이 있다면 댓글 달아주시면 감사하겠습니다 :)

728x90