비동기 프로그래밍
비동기 프로그래밍은 중앙처리장치(CPU)를 효율적으로 사용하기 위한 기술이다.
중앙처리장치는 매 초마다 정말 많은 작업을 요청받고 처리한다. 데이터를 읽거나 쓰거나, 네트워크 통신을 주거나 받거나, 화면 픽셀을 계산하거나 모두 중앙처리장치의 허가와 지도가 필요하다. 이렇게 바쁜 중앙처리장치에게 현재 입출력 작업이 완료되길 기다리게 하는 건 정말 비효율적이다. 그래서 개발자는 중앙처리장치가 비효율적으로 낭비되지 않도록 비동기 프로그래밍 기술을 사용하여, 중앙처리장치가 입출력을 기다리는 대신 다른 업무를 처리하도록 하고 입출력이 완료되었다는 메세지를 받은 뒤에 기존 작업을 다시 시작하도록 프로그래밍한다.
등장 배경
기본적으로 프로그램은 코드 순서에 따라 순차적으로 실행된다. 그래서 코드 중간에 시간이 오래 걸리는 작업이 있으면 프로그램은 순차적으로 코드를 진행해야 하니까, 다른 작업은 처리하지 않게 된다. 사용자 입장에선 몇 초 동안이라도 프로그램이 반응하지 않는다면, 프로그램이 살았는지 죽었는지 알 길이 없다. 사용자는 인내심이 바닥나면 프로그램을 강제 종료하고 다시 시도해본다. 하지만 프로그램 버그가 아니므로 같은 문제를 겪게 될 것이고 사용자는 프로그램이 잘못되었다고 판단하게 된다.
웹 서버도 마찬가지다. 만약 웹 서버가 사용자의 요구를 처리하느라 사용자에게 반응하지 않는다면, 사용자는 서비스가 정상적으로 동작하는지 의심하게 된다. 예를 들어, 사용자가 인기있는 콘서트 티켓을 예약하는데 서비스가 30초나 응답이 없다면 정말 티켓이 예약되고 있는건지 지금이라도 새로고침하고 새로 예약해야 하는지 고통받게 된다. 사용자는 고통받는 매순간마다 다음부턴 다른 서비스를 사용하리라 다짐하고 있을 것이다. 이렇게 서비스가 사용자에게 무응답하여 겪는 불편을 해소하기 위해, 서비스가 사용자에게 적극적으로 반응할 수 있도록 비동기 프로그래밍 기술이 등장하게 된다.
C#에서 비동기 프로그래밍
C#에서 비동기 프로그래밍은 작업 기반 비동기 패턴(TAP; Task-based asynchronous pattern)을 기반으로 async/await 키워드로 구현할 수 있도록 제공하고 있다.
작업 기반 비동기 패턴 Task-based asynchronous pattern TAP
작업 기반 비동기 패턴은 Task 클래스로 비동기 작업을 통제하는 패턴이다.
Task 클래스는 비동기 작업을 모델링하여 작업을 통제하는 클래스이다.
Task 클래스로 비동기 작업의 상태를 확인할 수도 있고, 비동기 작업을 시작하거나 취소하거나 종료할 수도 있다. 당연히 예외도 처리 가능하다. Task 클래스는 내부적으로 TreadPool 큐라는 스레드 관리 서비스에 등록되어 실행된다. TreadPool은 개발자를 대신해 스레드 수를 파악하고 실행을 조정하며 처리량을 최대화할 수 있도록 부하를 분산시킨다.
[출처]
'C#' 카테고리의 다른 글
운영체제에서 제공하는 다양한 동기화 장치들에 대한 설명 (0) | 2023.11.04 |
---|---|
Task와 Thread 차이 (0) | 2023.11.04 |
32bit DLL을 64bit .Net 프로그램에서 호출하기 (0) | 2023.11.04 |
마샬링(Marshalling) vs 직렬화(Serialization) (1) | 2023.11.04 |
마샬링(Marshalling) (0) | 2023.11.04 |