본문 바로가기

개발

[CS] 동시성과 병렬성 그리고 비동기

반응형

안녕하세요 도깨비 개발자입니다.

익숙한듯 익숙하지 않은 비동기, 동기 그리고 동시성, 병렬성 개념을 한번에 정리해보겠습니다.

 

프로그래밍 언어중 싱글 쓰레드인데 비동기 처리를 지원하는 경우와 멀티 쓰레드를 지원하는 경우를 심심치 않게 볼수 있습니다.

 

NodeJs: 8 엔진 기반으로 구동되며, 비동기 I/O와 이벤트 기반 아키텍처

FastAPI:  Python 기반의 웹 프레임워크로, 비동기 HTTP 서버를 구축하기 위해 설계

Java: 정적 타입 언어로 멀티스레딩에 따른 스레드 기반 처리가 강력

 

최근에 개선된 비동기 기능을 추가한 Python과 Javascript는 async/await으로 비동기 처리를 동기화합니다.

Java의 synchronized는 다수의 쓰레드 환경에서 공유 자원 접근에 따라 발생하는 동시성 문제를 해결해줍니다.

자칫하다간 async/await과 synchronized을 동일한 기능으로 오해할수 있는데요.

아래 내용을 통해 명확히 구분할수 있습니다.

 

동기와 비동기

출처 https://blog.kakaocdn.net/dn/vfrGx/btsGZXuZMya/PnivQtTP4d1QzEyOFJT4a0/img.png

 

순서가 존재하고, 앞 순서가 종료된후에 테스크가 수행되면 동기입니다. 순서가 존재하지 않고, 앞 순서가 끝나지 않아도 실행 가능하면 비동기입니다.

그림상으로 봤을때는 비동기와 병렬성에 차이가 없다 생각하시겠지만, 비동기의 정의를 다시 한번 더 봐주세요.

task1이 끝나지 않고 task2, task3등등이 가능하다 까지가 비동기입니다.

NodeJS는 I/O처리를 비동기적으로 하기에, 싱글 쓸레드임에도 파일, 네트워크같은 I/O 처리에서 성능을 입증받았습니다.

 

 

동시성과 병렬성

 

웹 어플리케이션은 상대적으로 오래 걸리는 대기 시간이 존재합니다.

  • 네트워크를 통해 클라이언트로부터 전송되는 데이터
  • 시스템이 읽고 프로그램에 전달할 디스크 내의 파일 내용
  • 데이터베이스 작업

cpu를 통한 연산은 실행 시간으로 부를수 있습니다.

  • 오디오 또는 이미지 처리.
  • 이미지 픽셀 연산
  • 머신러닝에서  "행렬"과 "벡터" 곱셈

 

하나의 테스크에 대기 시간이 길경우 다른 테스크를 처리 했다가 돌아오는게 효율적입니다.

한순간에 한 테스크를 다루되, 대기 시간에 다른 작업을 하는게 동시성입니다

 

실행 시간이 긴 경우도 존재합니다. 대기 시간은 아예 없는데, 연산 내용이 많아 여러 사람이 필요한 경우죠.

한순간에 여러 테스크를 다루는게 병렬성입니다

 

I/O Bound와 CPU Bound

동시성과 병렬성은 I/O Bound와 CPU Bound로 적용 환경을 구분할수 있습니다.

 

I/O Bound: 대부분의 시간을 I/O 계산 작업에 소비해, 성능이 I/O 처리 능력에 의해 제한되는 상태

CPU Bound: 대부분의 시간을 CPU 계산 작업에 소비해, 성능이 CPU 처리 능력에 의해 제한되는 상태

 

I/O는 대기 시간이 상대적으로 길어 동시성이 적합하고, CPU Bound는 절대적인 실행 시간이 필요해 병렬성이 적합합니다.

 

 

 

 

 

이상입니다