개발놀이터

동기, 비동기 프로그래밍 본문

CS 지식/네트워크

동기, 비동기 프로그래밍

마늘냄새폴폴 2023. 3. 16. 02:09

이번 포스팅에선 동기화 프로그래밍, 비동기화 프로그래밍에 대해서 알아보도록 하겠습니다. 

 

동기화 프로그래밍과 비동기화 프로그래밍은 네트워크 공부를 하다보면 쉽게 접할 수 있는 주제입니다. 그만큼 중요한 주제이기도 하죠. 이번 포스팅에선 동기화, 비동기화 프로그래밍이 무엇인지, 둘의 차이는 무엇인지, 둘의 장단점은 무엇인지, 둘의 사용처는 어디인지에 대해서 자세히 알아보도록 하겠습니다. 

 

 

동기화, 비동기화의 특징

동기화

동기는 Synchronous 줄여서는 sync라고도 부릅니다. 동기는 Blocking Architecture라고도 불리고 반응형 시스템을 위한 프로그래밍을 할 때 사용하면 좋습니다. 

 

동기는 굉장히 엄격한 순서를 가지고 동작하는데 request한번 response한번 이렇게 한 세트로 동작하는데 request를 보낸 스레드가 response를 받을 때까지 무한정 기다리는 특징이 있습니다. 

 

 

비동기화

비동기는 Asynchronous 줄여서 async라고도 부릅니다. 비동기는 Non-Blocking Architecture라고도 불리고 동기와 다르게 멀티스레드로 동작한다는 특징이 있습니다. Non-Blocking이라는 의미는 통신이 진행되는 동안 여러개의 실행이 동시다발적으로 일어난다는 의미입니다. 

 

동기 프로그래밍은 여러개의 연관된 실행이 다른 일이 끝날 때 까지 가디리지 않고 동시에 수행됩니다. 여러명의 개발자가 같은 시간에 프로젝트를 동시에 수행할 수도 있고 이는 애플리케이션의 확장을 도와주는 역할을 합니다. 

 

 

Javascript

자바스크립트는 동기와 비동기의 특징을 모두 담고 있는 언어입니다. 자바스크립트는 비동기 언어 동시 프로그래밍 언어라고도 불리며 이는 많은 유연성을 제공한다는 의미입니다. 

 

자바스크립트는 동기 프로그래밍처럼 싱글 스레드로 동작하지만 비동기처럼 Non-Blocking으로 동작합니다. 

 

자바스크립트를 생각해보시면 carousel이 움직이고 있는 도중에 다른 버튼이 동작하지 않으면 안되겠죠? 그런 특성 때문에 자바스크립트는 비동기의 특징을 담고 있는 언어 중 하나입니다. 

 

자바스크립트의 멋있는 점은 동기 그리고 비동기의 특징을 모두 가지고 있다는 것인데 이는 싱글스레드와 멀티스레드, 동기화와 비동기화의 특징을 모두 담고 있다고 볼 수 있습니다. 

 

이런 유연함을 가지고 개발자들은 동기화의 특징인 개발자 친화적이라는 장점과 비동기화의 특징인 유저 친화적이라는 장점을 모두 가지고 있습니다. 이 개발자 친화, 유저 친화에 대해서는 뒤에서 자세히 설명하도록 하겠습니다. 

 

 

동기 vs 비동기 차이점과 각각의 장단점

비동기는 Non-Blocking Architecture이고 그렇기 때문에 각각의 실행이 다른 실행에 영향을 받지 않고 동시다발적으로 실행됩니다. 동기는 Blocking Architecture이고 그렇기 때문에 각각의 실행이 다른 실행에 의존적인 모습을 보여줍니다. 

 

이 둘의 특징에 대해서 좀 더 자세히 알아보죠

 

동기 vs 비동기 차이점

  • 비동기는 멀티스레드이고 각각의 실행이나 프로그램이 병렬적으로 실행됩니다. 동기는 싱글스레드이고 각각의 실행이나 프로그램이 한번에 하나씩 실행됩니다.
  • 비동기는 Non-Blocking입니다. 그렇기때문에 서버에 다수의 요청을 보낼 수 있습니다. 막히지 않으니까요 동기는 Blocking이기 때문에 한번에 하나씩만 서버에 요청을 보낼 수 있습니다. 그리고 서버에서 응답을 보낼 때까지 기다려야하죠.
  • 비동기는 다수의 실행을 한번에 처리할 수 있기 때문에 수율(throughput)이 좋습니다. 비동기는 그렇지 않기 때문에 속도가 느리죠. 

 

동기 vs 비동기 장단점

동기 프로그래밍 이점

  • 예측 가능한 결과 : 동기 프로그램은 예측가능한 실행을 보여줍니다. 선형적인 동작이라고도 할 수 있습니다. 코드의 흐름을 파악하는 디버깅을 진행할 때 유용한 모습을 보여줍니다. 
  • 더 적은 메모리 사용 : 동기 프로그래밍은 한번에 하나의 일만 처리하기 때문에 여러개의 작업에 대한 상태를 많이 저장해둘 필요가 없습니다. 이는 더 적은 리소스가  필요하다는 의미이고 이는 곧 메모리의 사용이 적어진다는 의미입니다. 
  • 이해하기 쉬운 코드 : 동기 프로그래밍은 따라가기 쉬운 코드를 작성할 수 있습니다. 작업들은 특정한 순서를 따라 움직이고 그렇기 때문에 우리는 너무 복잡하지 않게 될 것입니다. 
  • 더 효율적이다 : 동기 프로그램은 예측 불가능한 이슈나 에러를 만나기 쉽지 않기 때문에 더 효율적입니다. 
  • 더 적은 오버헤드 : 동기 프로그램은 더 적은 오버헤드를 가지고 있습니다. 동기 프로그램은 동시에 다수의 작업을 관리하는 짐이 없기 때문에 오버헤드가 적습니다. 

동기 프로그래밍의 단점

  • 느린 실행속도 : 동기 프로그램은 비동기 프로그램에 비해 느린 속도를 가지고 있습니다. 왜냐하면 앞선 작업이 끝날 때까지 기다려야하기 때문입니다. 
  • 확장하기 어려움 : 동기 프로그램은 확장하기 꽤나 까다롭습니다. 새로운 작업을 하나 추가하는 것은 곧 그만큼의 성능적인 디메리트를 가지고 간다는 것이기 때문입니다. 
  • 동시다발적으로 작업하는 것에 제한이 있다 : 동기 프로그래밍은 동시에 여러 작업을 처리할 수 없기 때문에 동시다발적으로 작업하는 일에 대해서는 적합한 방법이 아닐 수 있습니다. 

 

비동기 프로그래밍 이점

  • 빠른 실행속도 : 비동기 프로그램은 동기 프로그램에 비해 더 빠른 속도를 보여줍니다. 작업들은 병렬적으로 실행되고 각각의 작업들은 서로의 작업을 기다릴 필요가 없기 때문입니다. 
  • 확장하기 쉬움 : 비동기 프로그램은 확장하기 쉽습니다. 여러개의 작업들이 동시에 실행될 수 있기 때문입니다. 
  • 동시에 처리하기 쉽다 : 비동기 프로그램은 동시에 처리하는 것이 가능합니다. 많은 작업들이 동시에 실행되는 것에 제한이 없습니다. 
  • 높은 수율(throughput) : 비동기 프로그램은 높은 수율을 가지고 있습니다. 더 짧은 시간에 더 어려운 작업을 수행할 수 있습니다. 

 

비동기 프로그래밍의 단점

  • 복잡하다 : 비동기 프로그램은 동기 프로그램에 비해 더 복잡합니다. 다수의 작업이 동시에 실행되어야 하기 때문에 디버그하기 힘들고 이해하기도 힘듭니다.
  • 더 많은 메모리를 소모한다 : 비동기 프로그램은 동시에 다수의 작업을 관리하기 위한 더 많은 메모리를 요구합니다. 
  • 높은 오버헤드 : 비동기 프로그램은 같은 시간에 다수의 작업을 처리해야 하기 때문에 높은 오버헤드가 발생할 수 있습니다. 
  • 에러의 위험을 가지고있다 : 비동기 프로그래밍은 더 많은 에러를 야기합니다. 왜냐하면 예측 불가능한 에러로 인한 데드락이 야기될 수도 있습니다. 

 

 

동기 vs 비동기 사용처

만약 동기 프로그래밍은 사용한다면 single task에 집중하는 경우 사용하면 좋습니다. 혹은 일이 매우 의존적이고 병렬적으로 일을 수행하지 않는 곳에서 사용하면 좋습니다. 

 

동기 프로그래밍 사용처

  • Web Page : 웹 페이지를 동기적으로 로딩함으로써 우리는 해당 페이지의 내용물을 찾고 카테고리화하는 Search Engine Optimization 엔진을 작동하기 더 쉬워집니다. 
  • Video Rendering : 비디오를 렌더링하는 작업은 CPU에 큰 부하를 가져다줍니다. 그러므로 병렬적으로 이를 수행하게 되면 시스템이 죽어버릴 수도 있습니다. 

 

비동기 프로그래밍은 각자에 의존하지 않으면서 많은 양의 작업을 해야하는 경우나 작업들이 시간이 오래걸리는 경우에 사용하면 좋습니다. 

  • Database Manipulation : 특히 많은 정보를 가지고 있는 데이터베이스의 경우 데이터베이스에서 정보를 검색할 때 많은 양의 쿼리가 수행되는 경우에 사용하면 좋습니다. 각각의 작업에 대해 다른 스레드를 부여함으로써 우리는 우리의 애플리케이션 동작이 결과를 기다리는 동안 안정을 취할 수 있게 해줍니다. 
  • Dashboards : 만약 우리가 이전에 많은 정보를 가진 복잡한 대쉬보드를 가지고 있다면 우리는 실제 시간으로 업데이트된 각각의 파트를 유지하기위해 다른 스레드를 부여할 수 있습니다. 이렇게 함으로써 시스템을 핸들링하기 더 쉬워집니다. 

 

결론적으로 만약 우리의 애플리케이션이 비교적 단순하다면 비동기 프로그래밍을 사용하는 것은 일반적으로 추천되지 않습니다. 비동기 프로그래밍은 속도를 높여주지만 그만큼 복잡하고 에러가 증가할 수도 있습니다. 

 

 

 

여기까지 동기, 비동기 프로그래밍에 대해서 알아봤습니다. 요즘 너무 딥한 내용을 공부해서 환기를 시킬겸 조금 쉬운 주제를 선택했는데요. 기본적인 개념에 해당하는 내용인만큼 이해하는데 크게 어려움을 느끼진 않은 것 같습니다. 

 

동기 프로그래밍, 비동기 프로그래밍은 면접에서 자주 물어보는 질문 중 하나니까요. 잘 준비하셔서 면접에서 좋은 결과 있기를 바라겠습니다. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

 

 

출처

https://www.mendix.com/blog/asynchronous-vs-synchronous-programming/

 

Asynchronous vs. Synchronous Programming: Key Similarities and Differences

Asynchronous vs. synchronous programming: What are the similarities and differences? Learn about these two distinct approaches here.

www.mendix.com

=> 동기, 비동기 프로그래밍에 대한 docs

 

https://datamyte.com/synchronous-vs-asynchronous/

 

Synchronous vs Asynchronous | Full Guide - DataMyte

This article will take a closer look at synchronous and asynchronous programming models, and how they differ from each other. Read here to learn more.

datamyte.com

=> 동기, 비동기 프로그래밍에 대한 장단점

 

https://distantjob.com/blog/synchronous-vs-asynchronous-programming/

 

Synchronous vs. Asynchronous Programming: What You Need to Know

Synchronous vs. asynchronous programming: what´s the difference? Here´s what you need to know about these two different programming types.

distantjob.com

=> 동기, 비동기 프로그래밍의 사용처

 

'CS 지식 > 네트워크' 카테고리의 다른 글

Stateless, Stateful 프로토콜  (0) 2023.03.22
로드 밸런싱전략 (동적 로드밸런싱, 정적 로드밸런싱)  (0) 2023.03.18
OSI 7 계층, TCP / IP 4 계층  (0) 2023.03.02
GraphQL  (2) 2023.02.25
RESTful API  (0) 2023.02.25