2024. 11. 28. 17:44ㆍSTUDY/C#
해당 글은 async await 키워드를 공부하기 앞서 개념을 잡고 가기 위해 작성한 글이다.
동기, 비동기에 대해 알아보고 나아가 동기식 싱글 쓰레딩, 동기식 멀티 쓰레딩, 비동기식 싱글 쓰레딩, 비동기식 멀티 쓰레딩에 대해 공부해보려 한다.
[동기식 비동기식]
식당을 비유하여 설명하겠다.
난 1인 식당을 운영하고 있다. 한 손님이 베이컨과 토스트를 주문했다. 이후 상황을 동기식과 비동기식으로 나눠보겠다.
동기식
- 베이컨을 다 굽는다.
- 그 다음 토스트를 다 굽는다.
- 접시에 담는다.
- 손님에게 서빙한다.
비동기식
- 팬에 베이컨을 올리고 타이머를 누른다.
- 팬에 토스트를 올리고 타이머를 누른다.
- 틈틈히 청소한다.
- 베이컨 테이머가 울려 베이컨을 접시에 담는다.
- 토스트 타이머가 울려 토스트를 접시에 담는다.
- 손님에게 서빙한다.
동기식은 하나 작업을 하고 이후 작업을 하는것이라면 여러 작업을 나눠서 작업한다고 생각할 수 있다. 베이컨과 토스트가 요리될때까지 앞에서 서있는게 아니기 때문에 '틈틈히 청소한다' 는 선택지가 늘어날 수 있다. 이것으로 대략적인 동기와 비동기식을 이해할 수 있다.
조금 더 엄밀히 말하면 전자는 동기식 싱글 쓰레딩(Synchronous single threading) 후자는 비동기식 싱글 쓰레딩(Asynchronous single threading) 이다.
비동기식 멀티 쓰레딩과 동기식 멀티 쓰레딩에 대해서도 정리해보겠다. 서술하기 앞서 비동기와 멀티 쓰레딩이 동일한 개념으로 알고 있는 경우가 있는데 전혀 다르다.
비동기식 멀티 쓰레딩을 식당에 비유하면
나는 사장이고 베이컨을 굽는 직원이 있고 토스트를 굽는 직원이 있고 서빙을 담당하는 직원이 있다고 보면 된다.
베이컨 주문이 10개 들어오면 팬에 베이컨을 올리고 타이머를 누르는 작업을 10번 수행하고 10개의 타이머가 순차적으로 울릴면 차례로 뒤집는 작업을 한다. 토스트를 굽는 직원도 동일한 메커니즘이다.
반면 동기식 멀티 쓰레딩을 식당에 비유하면
나는 사장이고 베이컨을 굽는 직원이 있고 토스트를 굽는 직원이 있고 서빙을 담당하는 직원이 있는 것은 비동기식 멀티 쓰레딩과 동일하다. 하지만 베이컨 10개가 들어오면 베이컨을 한개 올리고 굽고 요리가 끝나면 새로운 베이컨을 굽는 과정을 10번 진행한다.
즉 쓰레딩은 프로그램에서 작업을 처리하는 주체 즉 쓰레드에 관한 개념이고 비동기와 동기는 작업에 대한 요청과 응답을 처리하는 방식에 관한 개념이다.
[너무 많은 아이템을 가지고 있는 인벤토리]
게임을 하나 생각해보자. 만약 어떤 게임에서 인벤토리를 열려고 하는데 인벤토리안에 정보가 너무 많아서 여는데 오래 걸린다면 어떻게 하면 좋을까?
해결 방안 1 : 비동기 프로그래밍을 활용 (코루틴 혹은 C#의 task 비동기 프로그래밍 등)
1. UI는 바로 표시하고 데이터는 비동기로 로드
- 인벤토리 창 자체는 빈 상태로 먼저 표기한다.
- 로딩 중임을 나타내는 '로딩 중...' 등 메세지를 표시한다.
2. 데이터는 백그라운드에서 로드
- 비동기 방식으로 데이터를 로드한다.
- 로드가 완료되면 데이터를 UI에 반영한다.
해결 방안 2 : 부분적으로 데이터 로드
아이템이 많을 경우, 모든 데이터를 한번에 로드하면 여전히 지연이 발생할 수 있다. 이런 경우 데이터를 작게 나누어 점진적으로 로드하는 방식을 사용할 수 있다. 만약에 탭이 나뉘어져 있다면 탭을 기준으로 나누는 것도 하나의 방법이다.
다음에는 비동기 프로그래밍을 도와주는 async await 키워드에 대해 작성하겠다.
'STUDY > C#' 카테고리의 다른 글
공용 언어 런타임(CLR)의 실행 모델 (1) | 2025.02.02 |
---|---|
[C#] async, await (0) | 2024.12.04 |
[C#] Array vs List vs ArrayList (0) | 2024.11.12 |
[C#] Class vs Struct (0) | 2024.11.06 |
interface는 인스턴스는 못 만들지만 참조는 만들 수 있다? (1) | 2024.10.03 |