Study

[JAVA] 동기, 비동기와 멀티스레딩

jeonniu 2022. 6. 17. 02:31

멀티스레딩과 비동기 방식을 구체적으로 설명하기 전에

데이터를 처리하는 방식인 동기와 비동기 방식에 대해 알아보자.

 

 

 

 

 

동기(Synchorunous)

요청을 보낸 후, 응답을 받아야만 다음 동작이 이루어지는 방식으로

모든 일이 순차적으로 실행된다.

 

 

동기 구조도

 

동기 방식은 설계가 매우 간단하고 직관적이라는 장점이 있지만, 결과가 주어질 때까지 무한 대기해야 한다는 단점이 있다.

 

 

예를 들어 A가 B에게 50,000원을 송금한다고 가정해보자.

 

 

동기 방식의 흐름 예시

 

1. A는 현재 B의 계좌에 50,000원을 송금 할 예정이다.

2. A는 인출한 50,000원을 B의 계좌에 송금한다.

3. B의 계좌는 50,000원을 받았다는 것을 인지한 뒤, A의 계좌에 50,000원을 받았다고 전송한다.

4. 최종적으로 A의 계좌는 50,000원이 차감되고, B의 계좌엔 50,000원이 증가한다. 

 

 

순서의 흐름을 보면 A의 계좌와 B의 계좌는 서로 요청과 응답을 확인한 후, 다음 동작을 진행하였다.

우리가 흔히 사용하는 <계좌이체>와 같은 작업은 동기 방식으로 처리해야 송금이 누락되는 상황이 발생하지 않을 것이다.

 

 

 

 

 

 

비동기 (Asynchrounous)

요청을 즉시 처리하지 않아도, 대기 시간 동안 또 다른 동작이 이루어지는 방식으로

모든 일이 병행적으로 실행된다.

 

 

비동기 구조도

 

비동기 방식은 추가적인 스레드를 시작하여 요청에 대한 응답을 처리한다.

위의 비동기 구조도를 통해 이해해보자.

 

 

1.
첫 번째 스레드는 첫 번째 요청을 가져오고,
두 번째 스레드는 첫 번째 스레드가 끝날 때까지 기다리지 않고, 두 번째 요청을 가져온다.

2.
그런 다음 두 스레드는 서로가 결과를 가져올 때까지 기다린다.
두 스레드 모두 결과를 가져왔을 때, 두 결과를 합치기 위해 재동기화 한다. 

 

 

 

정리하자면 비동기 프로그램에서는 여러 일을 동시에 처리할 수 있다.

프로그램은 실행시간이 긴 함수를 실행할 때, 해당 함수의 실행 흐름을 막지 않고(non-blocking) 프로그램을 계속 실행한다.

해당 함수가 끝났을 때, 프로그램은 실행 결과에 접근하는 구조인 것이다.

 

 

 

즉 비동기 프로그램은 실행 속도가 느린 함수를 하나 실행하고,

그 동안 추가적인 콜백(Callback) 함수들을 실행시키다가

행위가 끝날 때, 콜백 함수와 함께 결과를 호출한다.

 

 

 

비동기 방식은 자원을 효율적으로 사용할 수 있다는 장점이 있지만, 동기 방식보다 설계가 복잡하다는 단점이 있다.

 

 

예를 들어 시험을 보는 학생과 채점을 하는 선생님 사이의 관계가 있다고 가정해보자.

 

 

비동기 방식의 흐름 예시

 

1. 학생은 시험지에 적힌 시험 문제를 푼다.

2. 시험 문제를 모두 푼 학생은 선생님에게 본인의 시험지를 건낸다.

3. 선생님은 학생으로부터 받은 시험지를 채점한다.

4. 채점이 다 된 시험지를 학생에게 건낸다.

5. 학생은 선생님으로부터 건내 받은 시험 결과를 확인한다.

 

 

학생과 선생님은 '시험지'라는 연결고리가 있지만, 시험지에 행하는 행위는 서로 다르다.

학생은 시험지를 푸는 행위를 하는 반면, 선생님은 시험지를 채점하는 행위를 한다.

이처럼 서로의 행위(목적)가 다르기 때문에 이들의 작업 처리 시간은 일치하지 않는다는 것을 유추할 수 있다.

 

 

 

 

동기와 비동기 방식은 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 시각의 차이이다.

 

동기 방식추구하는 행위(목적)가 동시에 이루어지는 반면

비동기 방식추구하는 행위(목적)가 다를 수 있고, 동시에 이루어지지 않는다는 큰 특징이 있다.

 

그렇기 때문에 작업을 처리하는 상황에 맞게 두 방식을 효율적으로 사용하는 것이 중요하다.

 

 

 

 

 

멀티스레딩(Multi Threading)

하나의 프로세스 내에 여러 스레드가 동시에 작업을 수행하는 것

 

스레드 구성도

 

 

싱글 프로세서(Single-processor)에서 멀티스레딩을 실행하는 프로그램은 병렬적으로 실행되는 것처럼 보이지만

실제로는 한 프로세스가 스케줄링 알고리즘을 통해 전환(Switching)해가며 실행하는 것이다.

 

 

멀티 프로세서(Muti-processor)에서 멀티스레딩을 실행하는 로그램은 실제로 병렬적으로 실행된다.

이 때, 개별 마이크로프로세서(Individual Microprocessor)들이 함께 작동하면서 효율성이 높아진다.

 

 

멀티 프로세스 구조도

 

멀티스레딩은 대표적으로 웹 브라우저에서 활용된다.

예를 들어 서로 다른 두 탭을 통해 두 개의 파일을 다운로드 받는다고 가정해보자.

 

 

각 탭은 요청된 파일을 다운로드 하기 위해 각각 새로운 스레드를 활용한다.

멀티스레딩은 서로의 탭이 완료되기를 기다리지 않으며, 동시에 다운로드 한다.

 

 

아래 그림은 멀티 스레드 어플리케이션의 다중 작업에 대한 구조도이다.

 

멀티 스레드 어플리케이션 구조도

 

 

 

 

비동기(Asynchrounous)와 멀티스레딩(Multi-Threading)

위에 설명한 내용을 통해 우리는 비동기와 멀티스레딩의 동작 과정을 공부하였다.

 

비동기 프로그래밍은 여러 함수들이 non-blocking 으로 실행되고,

멀티스레딩 프로그래밍은 여러 함수들을 동시에 실행하는 것을 알 수 있다.

 

 

 

정확한 이해를 위해 나와 친구가 오늘 저녁 식사를 함께 한다고 가정해보자.

 

 

비동기적 행위

 

비동기는 위와 같이 작업(task)의 시퀀스에 관한 것을 의미한다.

 

 

 

멀티스레딩

 

위 상황에서 우리는 각 사람(thread)의 일련의 명령 집합을 나타내는 <When> <Do> 시퀀스를 볼 수 있다.

멀티스레딩은 위와 같이 병렬로 실행되는 여러 스레드에 관한 것, 즉 작업자(thread)에 관한 것이다.

 

 

 

 

참조: https://www.baeldung.com/cs/async-vs-multi-threading