본문 바로가기

CS 과목(CS科目)/운영체제(OS)

asynchronous(비동기) programming, asynchronous I/O, asynchronous communication

동기와 비동기 개념과 차이 — Koras02코딩웹 (tistory.com)

 

동기와 비동기 개념과 차이

데이터를 받는 방식인 동기와 비동기. 이 둘의 개념에 대해 알아보고 둘의 차이점을 알아보도록 하겠습니다. 1. 동기(synchronous: 동시에 일어나는) - 동기는 말 그대로 동시에 일어난다는 뜻입니다

koras02.tistory.com

위 사이트도 참조하여 동기, 비동기의 정의를 요약해보았다. 

동기의 정의

1. 결과가 반드시 [동시]에 일어나야 한다. 

2. 요청(or 호출)을 하면, 실행이 끝날 떄까지 기다려야 한다. 

비동기의 정의

1. 결과가 반드시 [동시]에 일어나지x

2. 요청(or 호출)을 하면, 그 실행이 끝나지 않더라도 다른 작업을 수행할 수가 있다. (물론, non-blocking IO의 경우)

 

synchronous(동기) programming : programming 관점에서, 여러 작업(task)들을 순차적으로 실행하도록 개발.  

 

asynchronous(비동기) programming :  여러 작업(task)들을 독립적으로 실행하도록 개발

음식을 만드는 프로그램을 Synchronous하게 programming해보기

 

각각의 task들을 순차적으로 실행을 하면 된다.

그러나 일상에서 우리가 음식을 할 때에는 위 task들을 동시에 한다.

동시에 준비하는 것이 더 빠르기 때문이다.

그럼 아래에서 asynchronous하게 음식 프로그램을 programming해보자. 

위와 같이 여러 사람들에게 task를 분배를 하면 빨리 음식을 준비할 수가 있다. 

그러나 꼭 여러 사라들이 task를 실행한다고 해서 음식이 빨리 끝나는 것은 아니다.

아래를 보자. 

 

1. 햇반은 전자레인지(리소스)를 이용해서 데운다.

2.. 동시에 국은 가스레인지(리소스)를 이용해서 데운다.

3. 햇반과 국을 데움과 동시에 김치를 썰고, 스팸을 굽는다. 

-> 혼자 음식을 준비해도 여러 사람들이 음식을 준비하는 것보다 더 빨리 음식을 준비할 수가 있다. 

 

음식을 준비하는 사람들 : Thread

햇반 데우기, 국 끓이기 : I/O 작업 ( 전자레인지, 가스레인지가 햇반을 다 데우고, 국을 다 끓이는 것을 기다려야 하기 때문)

-> 햇반 데우기(I/0) 작업을 다 끝내지 않아도 동시에 김치를 썰 수가 있고,  국 끓이기(I/0) 작업을 다 끝내지 않아도 동시에 스팸을 구울 수가 있기에, 위 I/0 작업은 non blocking I/O라고 볼 수가 있다. 

 

Asynchronous Programming != multithreading

Asynchronous Programming : 여러 작업을 동시에 실행하는 프로그래밍 방법론

multi threading : Asynchronous programming의 한 종류에 불과.

-> 즉, multi threading은 asynchronous programming에 대해서 포함 관계에 들어가 있다. 

왼쪽이 multi 스레딩을 이용, 오른쪽이 non block I/O를 이용

Multi 스레드의 단점

1.스레드를 많이 만들게 됬을 때, 문맥 교환이 자주 일어난다는 issue가 생길 수 있다.

2. race condition이 발생할 수도 있다..

Multi 스레드의 장점

1. 멀티 코어를 잘 활용할 수 있다는 장점이 있다.

Non block I/O의 장점

 I/0 작업과 CPU 작업을 동시에 실행할 수 있기에 싱글 스레드여도 여러 가지일들을 동시에 수행이 가능하다.

-> 멀티 스레드와 non block I/O를 적절히 잘 이용을 하면, VER4와 같이 좋은 성능을 내는 프로그램을 만들 수가 있다. 

즉, 스레드는 최대한 적게 쓰면서도, non block I/O를 통해 전체 처리량을 늘릴 수가 있다. (실무에서는 이 전략을 사용함)

 

Synchronous I/0 vs ASynchronous I/0 ( I/0 Level에서의 (a)synchronous의 의미)

 

 

원래 thread A에서는 block I/O 작업을 해야 하는데, block 처리가 되는 것을 꺼려해서, thread B를 생성해서 다른 코어에서

실행시키도록 한다. 

이렇게 되면, thread B는 BLOCK 상태이므로, 스레드가 정지 상태가 되지만, Thread A는 계속해서 CPU 작업을 할 수가 있

다. 

-> Thread B에서 I/O 값을 최종적으로 받아서 마지막에 Thread A에 전달을 하면 된다. 

 

Micro Service Architecture(MSA) 사이의 Communication

하나의 서비스는 기능과 역할에 따라 여러 개의 Micro Service로 구성되고 이들 사이에는 빈번하게 communication이 발생.

synchronous communication

A,B,C는 각각 마이크로 서비스이다.

문제점 : 만약 C에서 에러가 발생하여 응답 불능 상태에 빠지게 되면, 서버 전체가 마비가 될 수가 있다. 

Solution : Asynchrous communication

 

Asynchrous communication

produce event : 다른 마이크로 서비스에게 어떠한 메시지를 Queue에 삽입

consume event : 어느 마으크로 서비스가 Queue에 있는 메시지를 읽어 오는 것

-> 마이크로 서비스 사이에 메시지 Queue를 하나를 만든다.( 더이상 API를 통해 데이터를 주고 받지는 않는다.)

A와 B로 예를 들어 보자.

A는 자신의 작업을 수행하다가 B에게 주고 싶은 메시지가 있으면 , 메시지 Queue에 넣고 자신의 일을 이어 나간다.

B도 자신의 일을 하면서 계속해서 메시지 Queue에 데이터가 있는지 확인을 하고 , 데이터가 있으면 읽어 와서 계속해서 자

자신의 일을 이어나간다. 

장점 : 더 이상 ok signal을 받을 필요가 없어진다. 

그러므로 만약 C에서 에러가 발생을 해도 B는 자신의 일을 묵묵히 할 뿐, C의 에러에 더 이상 영향을 받지 않는다. 

 

MSA 개발 TIP

1. Asynchronous communication이라고 해서 무조건 Message Queue만을 이용해야 하는 것은 아니다.

 -> 만약 A가 B로부터 데이터를 원하면 B에서 API를 만들어서 A에서 호출을 해야 한다.(그 대신 B에서 오류가 나도 A가 영향을 받지 않게 개발을 해야 한다.)

2. Message Queue는 마이크로 서비스들 사이에서 데이터가 오가고 하는 속도가 API 방식보다 상대적으로 느리기에 능사는 아니다.

3. 위 그림과 같이 데이터의 흐름이 단방향이여도 되는 경우에는 Asynchronous communication으로 개발을 한다.