본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/CS(ComputerScience)

[CS] 동기와 비동기의 차이, 멀티스레드와 비동기의 차이

by 미노드 2024. 3. 21.

동시성 이슈를 해결하는 과정에서 개념을 정리해볼 필요가 있어 정리하게 되었습니다.

동기와 비동기, 이게 무슨 이야기인지 정리해보려 합니다.

synchronize (동기화) 란 무엇인가??

현재 상태를 적용하는 것을 말하는 동기화, 내가 무언가 조치를 취했다면, 해당 내용이 반영되어야 합니다.
이를 위해 동기화를 말하는 것이며, 동시성을 이야기도 합니다.
동기화를 지원 이유는 공유자원을 다루면서 정합성이 깨지는 것을 방지하기 위해 사용하기도 합니다.

그럼 동기는 무엇인가요?
위의 동기화 와는 다르게, 프로그래밍에서 작업을 처리하는 방식에 대해 정할 때, 동기적으로 처리 또는 비동기적으로 처리 라고 이야기 할 수 있습니다.
동기화와 이름이 비슷하지만 구분해야 하는 개념이기에 먼저 적어봤습니다.

동기(Synchronous)

동기적인 작업은 순차적으로 실행되며, 각 작업은 이전 작업이 완료된 후에 실행됩니다.
일반적으로 코딩할 때 선언한 순서대로 작업이 수행되어야 하는 것입니다.
때문에 시작과 끝이 명확하게 구분됩니다.
중간에 다른 메서드나 작업을 수행하려면, 블로킹 되어 현재 작업이 중단되기도 합니다.

비동기(Asynchronous)

비동기적인 작업은 순차적으로 수행되지 않는 것입니다.
즉 어느 작업을 미리 선언해두고 다른작업을 수행한 뒤에, 선언해둔 내용의 결과를 나중에 받을 수 있습니다.
중간에 대기를 해야 하는 작업이라면, 요청해두고 다른 작업을 먼저 수행하는 것이 유리하다보니 이때 사용합니다.
때문에 비동기로 처리하는 작업은 작업의 중단 없이(non-blocking) 처리가 가능합니다.
무언가 다른 작업을 끝낸 후, 비동기로 요청한 작업이 끝나지 않았다면 대기할 수도 있으며, 대기 시간을 지정하여 실패 처리로 할 수도 있습니다.

동기 에 대한 내용은 상당히 이해가 빨리 되었으나, 비동기에 대한 내용은 이해가 어려울 수 있습니다. 
그림으로 표현하면 다음과 같습니다.

동기는 다른작업 추가 수행 을 하려면 작업2가 끝난 뒤에 해야 하지만,
비동기는 작업2를 다른곳에 맡겨두고 다른작업 추가 수행 후 작업2의 결과를 받을 수 있습니다.

비동기로 처리 하기 위해 작업2를 백그라운드에 맡기던지, API로 요청을 한다던지, 아니면 다른 스레드를 생성해서 처리한다던지 같은 작업이 필요합니다.

중요한 부분은 비동기 처리가 멀티스래드와 같지 않은가? 라는 부분은 구분이 필요합니다.
구분이 필요하다는 것은 같지 않은 것이며 차이점이 존재합니다.
이를 위해 싱글스레드와 멀티스레드를 정리해야 합니다.

싱글스레드

스레드 하나에서 순차적으로 작업을 처리하는 것입니다.

멀티스레드

작업처리 단위인 스레드를 여러개 만들어 스레드마다 작업들을 순차적으로 처리합니다.즉 싱글스레드와 멀티스레드 차이는 스레드를 하나로 작업을 처리하는지, 스레드를 여러개로 만들어 처리하는지 를 이야기 하는 것입니다.
여러 스레드를 만들더라도, 스레드마다 각 처리되는 고유 순서들은 순차적으로 처리되며,
이를 시간선으로 보면 동시에 처리되는 것입니다.

그림만 보더라도 멀티스레드와 비동기처리 방식은 비슷한 것으로 보입니다.
그런데 비동기 처리는 싱글스레드 에서 가능한 부분 이라서, 같은 개념으로 볼 수는 없습니다.
실제로 자바스크립트도 싱글스레드에서 async를 지원합니다.
어떻게 구분하면 좋을지 정리해보면 다음과 같습니다.
비동기 처리는 단일 스레드에서 필요한 작업을 기다리지 않고 수행하는 것 입니다.
내가 이사를 하고 짐정리를 하는동안 밥준비로 짜장면을 배달요청시켜두고 짐정리를 끝낸 뒤 배달온 짜장면을 먹는 것입니다.
동기적으로 처리한다면, 짐정리를 끝낸 뒤, 짜장면을 먹으러 가게로 가서 주문하고 먹는 것이겠지요.
만약 멀티스레드라면, 짜장라면을 끓이면서, 이삿짐 정리도 같이 하는 것입니다.
다만 나 혼자 하는것이라 싱글스레드로 보일 수 있겠지만, 어짜피 cpu가 자원할당 하는거라 보면 됩니다.
결국 같이 한꺼번에 다 하는 것입니다.
그런데 비동기 처리는 하나의 작업을 요청해두고 끝날때 까지 기다리지 않는 것이 핵심입니다.
기다리지 않고(non-blocking) 다른 작업을 수행한 뒤, 비동기로 처리해둔 작업이 끝났다면 결과를 받아 바로 다음작업으로 넘어갈 수 있고, 작업이 안끝났다면 기다리거나 timeout 시켜 처리할 수도 있습니다.

정리

비동기를 위해서 멀티스레드를 잠시 이용할 수도 있고, 또는 다른 곳에 요청함으로써 단일스레드로 작업을 계속 수행할 수도 있습니다.멀티스레드와 비동기가 같은 것은 아니라는 점, 정리해 두려 합니다.

작업을 비동기로 처리한다는 개념도 어떤 작업을 수행하는데 있어 시간이 걸리는 작업
또는 외부에서 작업이 필요한 경우 요청해두고 다른작업을 마저 수행하는 것을 의미합니다.
때문에 비동기로 처리하는 작업에 대해서 정리해 두는 것도 필요합니다.
자바에선 future나 callback 을 사용합니다.