[CS]비동기 프로그래밍(Asyncronous Programming)

한상욱·2024년 7월 26일
0

CS&자격증후기&잡담

목록 보기
12/21
post-thumbnail

들어가며

우리가 처음 코딩을 접하면서 실행하게 되는 모든 main 파일들은 하나의 코드를 순차적으로 실행하게 됩니다. 그렇게 마지막 코드를 실행한 후 프로그램이 종료되겠죠. 이러한 프로그램을 만약 동시에 수행을 해야 한다면 어떻게 할 수 있을까요? 이러한 것을 해결하기 위해 비동기 프로그래밍이라는 단어가 등장했습니다. 오늘은 특히, 멀티 스레드 프로그램에서 어떻게 비동기를 처리하는지 그리고 어떠한 것들이 중요한지 알아보도록 하겠습니다.

동기식 vs 비동기식

동기식과 비동기식이라는 단어가 생소할 수 있겠습니다. 프로그래밍이 아니더라도 해당 단어는 많은 곳에서 사용되는 단어이긴 한데요. 한번 개념과 차이를 알아보겠습니다.

1. 동기식

동기식은 모든 절차가 순서대로 진행되는 것을 의미합니다. 흔히, 동기 방식이라고 하는 것은 하나의 클럭을 태우면 다음 클럭을 태우듯이 클럭의 시작과 종료를 붙여서 데이터를 전송하는 것이죠. 이러한 것을 프로그래밍 관점에서는 코드의 실행과 종료가 맞물린다고 할 수 있겠습니다. (뭔 소리일까?)

#include <stdio.h>

void main() {
	printf("Hello\n"); // 1번 코드
    printf("World!\n"); // 2번 코드
}

위 코드에서는 "Hello"가 먼저 출력되고 나서 "World"가 출력될 것입니다. 그렇다면 1번 코드가 실행이 종료되자마자 바로 2번코드가 실행되었다고 할 수 있겠죠. 바로 이러한 프로그래밍 흐름이 동기식 방식입니다.

2. 비동기식

비동기식은 이러한 동기식과 상반되게 코드가 종료되는 것을 기다리지 않습니다.

#include <stdio.h>

void sayHello() {
	printf("Hello\n"); // 1번 코드
}

void sayWorld() {
    printf("World!\n"); // 2번 코드
}

void main() {
	sayHello();
    sayWorld();
}

이렇게 되면 sayHello() 이후에 sayWorld()를 실행하게 되는데요. 비동기식 관점에서는 두 함수가 동시에 실행되는 것입니다. (멀티 쓰레드 프로그램 관점에서)main 함수는 보통 main 쓰레드에 할당되어 코드를 실행하는데요. 비동기식으로 동작시키기 위하여 sayHello(), sayWorld()를 각각 새로운 쓰레드에 동작시키도록 한다면 두 함수는 동시에 실행된다고 할 수 있을 것입니다. 하지만, 이렇게 동시에 실행되는 것은 실제로 각 쓰레드 context#1, context#2가 서로 문맥 교환(Context Switching)이라는 것을 통해 여러 context를 번갈아가며 수행하며 동시에 수행하는 것처럼 보이게 되는 것이죠.

이미지 출처 : 처음 만난 리덕스

동기화

자, 멀티 쓰레드 프로그램에서는 비동기식 방식을 이용해 코드를 동시에 수행한다고 했습니다. 이렇게 되면 생길 수 있는 문제가 있는데요. 바로, 서로 동일한 값을 참조하는 경우입니다.

context#1이 a라는 변수를 참조해서 연산을 수행한다고 하겠습니다. 동시에 context#2는 a라는 변수를 4로 바꾸는 연산을 수행한다면 어떻게 될까요? 원하는 결과를 얻는 것이 힘들지 않을까요? 이러한 동시성을 보장하기 위해서는 각 쓰레드 즉, 연산을 수행하는 동안 변화를 Lock 할 필요가 있습니다.

이러한 경우, 세마포어, 뮤텍스, 임계 영역과 같은 atomic한 접근을 보장하는 운영체제 기능으로 동시 접근을 방지할 수 있어야 합니다.

Dead Lock

자, 근데 저렇게 동시 접근을 방지한다면 모든 문제가 해결되는 것일까요? 만약 context#1과 context#2가 비동기식 연산을 수행한다고 하겠습니다. 동기화를 통해 동시성이 보장된 상태에서 동시에 같은 값을 번갈아가며 참조한다고 할 경우 context#1은 context#2가 연산이 종료될 때까지 기다려야 합니다. 반대로 context#2가 context#1의 연산이 종료될 때까지 기다리겠죠. 이러한 경우 서로 무한정 기다리게 됩니다. 이러한 경우를 교착 상태 (Dead Lock)이라고 하죠.

이러한 경우에는 교착상태가 지속되는 원인을 찾아 미리 방지하는 것이 중요합니다.

profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글