VisualStudio/C#

[C#] 동기와 비동기 개념

usingsystem 2022. 8. 10. 15:44
728x90

동기식 싱글 쓰레딩, 동기식 멀티 쓰레딩, 비동기식 싱글 쓰레딩, 비동기식 멀티 쓰레딩에 대해서 정리하려 한다.

동기식 비동기식

지금부터 나는 개발자이며 내가 개발한 게임을 플레이하는 유저다.

열심히 코딩해서 친구 목록을 출력하는 함수를 개발했다. 그리고 조금 과장해서 게임에서 친구가 2만 명 정도 된다.

게임에 접속해서 친구 목록을 출력하는 버튼을 클릭하고 NPC와 대화를 하려 한다.

 

여기서 예상되는 결과는 두 가지로 나뉜다.

 

첫 번째, 2만 명의 친구를 출력하는 동안 게임이 멈추고 출력이 끝나면 NPC와 대화가 진행된다.

 

두 번째, 화면이 멈추지 않고 NPC와 대화하는 도중에 친구 목록을 출력한다.

 

전자가 동기 방식이고 후자가 비동기 방식이다. 이 두 차이를 이해하는 것이 동기 비동기를 이해하는 첫걸음이다.

 

 

설명이 부족하다면 현실에 비유한 예를 들어보자

난 1인 식당을 운영하고 있다. 한 손님이 베이컨과 토스트를 주문했다.

 

첫 번째 : 베이컨을 다 굽는다. 그 다음 토스트를 다 굽는다. 접시에 담는다. 손님에게 서빙한다.

 

두 번째 : 팬에 베이컨을 올리고 타이머를 누른다. 팬에 토스트를 올리고 타이머를 누른다. 틈틈이 청소한다. 베이컨 타이머가 울려 베이컨을 접시에 담는다. 토스트 타이머가 울려 토스트를 접시에 담는다. 손님에게 서빙한다.

 

이제 조금 감이 잡혔을 것 같다. 전자는 동기식,  후자가 비동기식이다.

 

조금 더 엄밀히 말하면 전자는 동기식 싱글 쓰레딩(Synchronous single threading)후자는 비동기식 싱글 쓰레딩(Asynchronous single threading)이다.

 

지금 후술 할 내용이 이해가 안 된다면 다음 목차로 넘어가도 된다.

서술하기 앞서 비동기와 멀티 쓰레딩이 동일한 개념으로 알고 있는 경우가 있는데 전혀 다르다.

 

비동기식 멀티 쓰레딩을 식당에 비유하면

나는 사장이고 베이컨을 굽는 직원이 있고 토스트를 굽는 직원이 있고 서빙을 담당하는 직원이 있다고 보면 된다.

베이컨 주문이 10개 들어오면 팬에 베이컨 올리고 타이머를 누르는 작업을 10번 수행하고 10개의 타이머가 순차적으로 울리면 차례로 뒤집는 작업을 하게 된다. 토스를 굽는 직원도 동일한 메커니즘이다.

 

반면 동기식 멀티 쓰레딩을 식당에 비유하면

나는 사장이고 베이컨을 굽는 직원이 있고 토스트를 굽는 직원이 있고 서빙을 담당하는 직원이 있는 것은 비동기식 멀티 쓰레딩과 동일하다.

하지만 베이컨 주문이 10개 들어오면 베이컨을 한 개 올리고 굽고 요리가 끝나면 새로 베이컨을 하나 굽고 이러한 과정을 10번 반복한다. 우리가 알고 있는 보편적인 멀티 쓰레딩 개념이 바로 동기식 멀티 쓰레딩이 아닐까 한다. 

 

쓰레딩은 프로그램에서 작업(Task)을 처리하는 주체 즉 쓰레드에 관한 개념이고

비동기와 동기는 작업에 대한 요청과 응답을 처리하는 방식에 관한 개념이다.

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

데이터를 받는 방식인 동기와 비동기. 이 둘의 개념에 대해 설명하는 게시물은 매우 많은데 프로그래밍적으로 생각했을 때 이해가 가지 않아서 쉽게 이해를 할 수 있는 동기와 비동기의 예가 어떤것들이 있는지 검색을 해봤습니다.

 

 

동기(synchronous : 동시에 일어나는)

 - 동기는 말 그대로 동시에 일어난다는 뜻입니다. 요청과 그 결과가 동시에 일어난다는 약속인데요. 바로 요청을 하면 시간이 얼마가 걸리던지 요청한 자리에서 결과가 주어져야 합니다.

  • 요청과 결과가 한 자리에서 동시에 일어남
  • A노드와 B노드 사이의 작업 처리 단위(transaction)를 동시에 맞추겠다.

 

 

비동기(Asynchronous : 동시에 일어나지 않는)

 - 비동기는 동시에 일어나지 않는다를 의미합니다. 요청과 결과가 동시에 일어나지 않을거라는 약속입니다. 

  • 요청한 그 자리에서 결과가 주어지지 않음
  • 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.

 

 

 동기와 비동기는 상황에 따라서 각각의 장단점이 있습니다. 

 동기방식설계가 매우 간단하고 직관적이지만 과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점이 있고, 

 비동기방식동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있습니다.

출처: https://private.tistory.com/24 [오토봇팩토리:티스토리]

728x90