동기/비동기, 동시성/병렬성
Computer Science/Thread 처리

동기/비동기, 동시성/병렬성

728x90
반응형

 

 

 

 


동기처리 / 비동기처리


동기 처리 (Synchronous : 요청과 결과가 동시에 일어나는..)

  • 1개의 루틴을 완료한 후 다른 루틴을 샐행하는 순차적인 방식
  • 요청과 결과가 한 자리에서 동시에 일어남
  • A노드와 B노드 사이의 작업 처리 단위(transaction)를 동시에 맞추겠다
  • 주로 하나의 작업 혹은 수행시간이 짧은 작업들을 (요청과 결과를 동기 처리하면서) 처리할때 작업처리 단위를 맞추면서 수행하는것을 말함
  • 보통 목적이 같은 일을 진행하기 때문에 요청과 결과를 동시에 일어나도록 처리 단위를 맞춘다. 

 

비동기 처리 (Asynchronous : 요청과 결과가 동시에 일어나지 않을거라는...)

  • 다중 실행 환경에서 여러개의 루틴이 선행 작업의 순서나 완료 여부와 상관없이 실행되는 방식
  • 요청한 결과가 그 자리에서 주어지지 않음
  • 노드 사이의 작업 처리 단위를 동시에 맞추기 않아도 된다.
  • 여러 작업 을 수행하는데 오래걸리는 등(네트워크통신, 데이터 추출, 입출력 작업 등) 의 작업이 있어서 
  • 프로그램의 주 실행 흐름을 멈추어서 기다리는 부분 없이 바로 다음 작업을 실행할 수 있게 하는 방식
  • 즉 코드의 실행 결과를 별도의 공간에 맡겨둔뒤 결과를 기다리지 않고 다음 코드를 실행하는 병렬처리 방식

 

 

 

동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 시각의 차이입니다.
동기는 추구하는 같은 행위(목적)가 동시에 이루어지며, 

비동기는 추구하는 행위(목적)가 다를 수도 있고, 동시에 이루어지지도 않습니다.

 

블로킹 vs 넌블로킹

코드의 여러 구간에서 요청된 작업이 마무리 될 때까지 멈춰 있는 현성을 블로킹 된 코드 라고 합니다.

코드의 성능을 향상하려면 넌블로킹 기법의 코드를 구성해야 합니다. 

보통 다중 작업을 하려면 스레드와 같은 비동기 코드를 작성해야 하는데 이때 코드가 복잡해진다. 하지만 코틀린의 코루틴을 사용하면 넌블로킹 이나 비동기 코드를 마치 동기 코드처럼 쉽게 작성하면서도 비동기 효과를 낼수 있습니다. 

 

 

 

 

 

 


동기 비동기 방식의 블록과 논블록의 차이를 간략하게 설명하자면,

 

  • 동기 블럭 : A가 실행되다가 B라는 일을 수행하는 함수를 호출해서 B를 시작한다. B라는 일이 끝나면 함수를 리턴한다. A와 B는 순차적으로 진행되기 때문에 동기이며,  B라는 일을 하는 함수를 호출하고 그 일이 끝나고 나서야 리턴되므로 블럭된 것이다. 따라서 블럭/동기 

 

  • 동기 논블럭 : A는 B라는 일을 시킨다고할때  시키고 바로 리턴한다. (논블럭)  B는 일을 시작하는데, A는 자신의 일을 하지 않는다. A의 하는 일이란 그저 B가 하는일을 확인하는 것이다. B가 결과 보고(중간 보고가 아니다) 를 했는지를 확인하는 함수를 호출하고 ,바로 리턴한다 (논블럭) 즉 결과 보고를 받을 때 까지 기다리는게 아니라, 결과 보고가 나왔는지 확인하고 바로 리턴하는 것이다.  이 짓을 계속한다. 즉 함수를 계속 논블럭으로 호출되긴 하나, A는 그저 B를 염탐할 뿐이다. 이 상태를 말한다. 그냥 염탐하지 말고 B가 일을 모두 끝마치고 리턴되길 기다리지 ;;; (그냥 블럭/동기로 하는게 나은 상황이 연출된다) 

 

  • 비동기 블럭: 일단 A는 B라는 일을 시킨다. 그리고 바로 리턴하고 (여기서는 논블럭)  B는 일을 시작하고, A도 자신의 일을 한다. A는 중간에 B라는 일이 하는 중간 결과를 보고 받아서 처리해야한다. A는 B에게 요청을 해서 중간결과를 기다린다(블록), 요청의 결과를 받고 나서 그 결과를 이용해서 A는 자신의 일을 처리한다. 동시에 B 는 또 자신의 일을 동시에 한다. (비동기) A는 다시 B에게 중간결과를 요청해서 기다린다 (블록) , 요청의 결과를 받고 A는 자신의 일을 , B는 자신의 일을 한다. 반복된다.
  • ex> 학생이 시험지를 선생에게 건넨 후 가만히 앉아 채점이 끝나서 시험지를 돌려받기만을 기다린다면 학생은 블록 상태

 

  • 비동기 논블럭 : 간단하다. A는 B의 일을 시작시키고 바로 리턴한다 (논블럭) 그리고 A와B는 각자 자신의 일을 한다 (비동기) 
  • ex>학생이 시험지를 건넨 후 선생에게 채점이 완료되었다는 전송을 받기 전까지 다른 과목을 공부한다거나 게임을 한다거나 다른 일을 하게 되면 학생의 상태는 논블록 상태

 

1. 실무에서는 위의 분류를 구분안한다.
블로킹/동기는 같이 말하며, 논블로킹/비동기도 함께 묶어 말한다. 애초에 구분할 필요가 없다.


2. 굳이 구분할 경우 
먼저 블로킹/논블로킹은 동시성과는 무관한 이야기이다.
단지 메소드 호출 한 후로 시간이 오래 걸리면 블로킹이다. 즉 메소드가 얼마나 오래 걸리냐의 문제로 블로킹과 논블로킹은 귀결된다. 예를들어 "Hello world" 프린트하고 리턴하는 경우에 논블로킹으로 말할 수 있다.
 (시간이 오래 걸린다는 것은 상황에  따라 지극히 주관적인것을 감안한다. 즉 김용무협소설에서의 차 한잔 마실 시간 느낌?)


동기/비동기는 동시성에 관한 이야기이다.
즉 쓰레드 혹은 프로세스가 분리되서 진행되면 비동기이다.  


 

예시 출처

private.tistory.com/24

https://hamait.tistory.com/930


물리적 스레드 /  논리적 스레드


물리적 스레드

물리적 스레드는 물리적 코어를 논리적으로 쪼갠 논리적 코어다. 

4코어 8스레드, 6코어 12개 스레드 등..

 

논리적 스레드

 

  • 논리적인 스레드는 동시성을 갖고 있다.
  • 병렬적으로 실행되는 것 처럼 보이지만, 여러개의 작업들이 짧은 시간에 번갈아가며 처리되어 병렬로 처리되는 것처럼 보이도록 실행되는 성질을 동시성이다.
  • 대표적으로 자바가 동시성을 갖고있다. 

 

 

 

그림 출처: 케빈의 알기쉬운 RxJava 강의


동시성 / 병렬성


동시성

  • 논리적 개념
  • 싱글코어와 멀티코어에서 모두 동작 가능
  • 하나의 cpu(작업흐름?)에서 동시에 여러 작업을 하는것처럼 보이도록함 
  • java에서는 특정 작업을 UI 스레드에서 작업하지 못하도록 강제하는 경우가 있기에 다른 스레드로 작업을 보내 사용하는 경우가 있음

 

동시성은 결합(coupling)을 없애는 전략이다. 

즉, 무엇(what) 언제(when) 분리하는 전략이다.

무엇과 언제를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다. 

구조적 관점에서 프로그램은 거대한 루프 하나가 아니라 작은 협력 프로그램 여럿으로 보인다.

따라서 시스템을 이해하기 쉽고 문제를 분리하기도 쉽다. 



 

 

병렬성

 

  • 물리적 개념

 

 

 

728x90
반응형

'Computer Science > Thread 처리' 카테고리의 다른 글

Android Thread 처리 방법  (0) 2021.04.29
background thread 에서 UI thread 접근하기  (0) 2021.04.29