동기화와 비동기화의 차이

서이·2023년 4월 17일
0

Java

목록 보기
27/27

Sync / Async

동기화(syncronous)
-요청과 결과가 동시에 일어나는 방식으로 요청을 보낸 후 응답을 받아야 다음 동작이 진행된다

  • 한 자원에 동시에 접근하는 것을 제한하는 방식이다.(순서를 지키겠다는 말이다)
  • 동시접근이 불가능하기 때문에 순차적으로 접근하여 작업을 진행하게 된다.
  • 다음에 실행될 명령은 현재 실행 중인 명령 종료 시 까지 대기 (대기시간 버퍼링 발생)
  • 서버와 클라이언트가 주고 받는 것이 동시에 이루어지는 형태
  • 시간적인 동기화가 필요한 곳에 많이 사용 (ex 현금 인출기)
  1. A의 계좌는 10,000원을 뺄 생각을 하고 있다.

  2. A의 계좌가 B의 계좌에 10,000원을 송금한다.

  3. B의 계좌는 10,000원을 받았다는 걸 인지하고, A의 계좌에 10,000원을 받았다고 전송한다.

  4. A, B 계좌 각각 차감과 증가가 동시에 발생한다.

  • A의 계좌와 B의 계좌는 서로 요청과 응답(1~3번 과정)을 확인한 후 같은 일을 동시에 진행했다.(4번 과정)

'계좌이체'같은 작업은 동기방식으로 처리해야 A에서 보냈는데 B에서 못 받는 상황이 없을 것이다.

반대로 비동기 방식은 위의 예제처럼 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.

  • Java 에서 synchronized 키워드를 사용하여 동기화를 설정한다.
    • 자바에서 멀티 스레드 접근 제한 키워드
    • 메소드, 블럭 단위로 적용이 가능
    • 단, 메소드 단위로 지정할 경우 메소드 전체에 lock이 걸리기 때문에 가능하면 블록 활용(임계영역은 작을 수록 좋음, 임계영역이란 프로세스 간에 공유자원을 접근하는 데 있어서 문제가 발생하지 않도록 한 번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역)

System Call 이 끝날 때까지 다른 스레드의 접근을 막아버리는 것이다.
한마디로 nextLine()에서 입력을 받을 때까지 대기하는 것과 같다.

장점 : 설계가 간단하고, 직관적이다.
단점 : 요청에 대한 결과가 반환되기 전까지 대기해야 한다.


비동기화(Asyncronous)

-요청과 결과가 동시에 일어나지 않는 방식으로 요청과 결과가 동시에 일어나지 않는다.

  • 한 자원에 대해 동시에 접근이 가능하다.
  • 현재 실행 중인 명령이 종료되지 않아도 다음 명령 실행가능
  • CallBack 함수를 통해 결과 확인
  • Ajax, Thread

System Call과 상관없이 계속 호출할 수 있다.

  1. 학생은 시험문제를 푼다.

  2. 시험문제를 모두 푼 학생은 선생에게 전송한다.

  3. 선생은 학생의 시험지를 채점한다.

  4. 채점이 다 된 시험지를 학생에게 전송한다.

  5. 학생은 선생이 전송한 시험지를 받아 결과를 확인한다.

  • 학생과 선생은 시험지라는 연결고리가 있지만 시험지에 행하는 행위(목적)는 서로 다르다.

학생은 시험지를 푸는 역할을 하고 선생은 시험지를 채점하는 역할을 한다.

서로의 행위(목적)가 다르기 때문에 둘의 작업 처리 시간은 일치하지 않고, 일치하지 않아도 된다.

장점 : 요청에 대한 결과가 반환되기 전에 다른 작업을 수행할 수 있어서 자원을 효율적으로 사용할 수있다.
단점 : 동기 방식보다 설계가 복잡하고, 논증적이다.


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

동기는 추구하는 같은 행위(목적)가 동시에 이루어지며,

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

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

학생이 시험지를 선생에게 건넨 후 가만히 앉아 채점이 끝나 시험지를 돌려받기만을 기다린다면 학생은 블록 상태이다.

하지만 학생이 시험지를 건넨 후 선생에게 채점이 완료되었다는 전송을 받기 전까지 다른 과목을 공부한다거나 게임을 한다거나 다른 일을 하게 되면 학생의 상태는 논 블록 상태이다.


  1. 동기의 예
    일반적으로 사용하는 함수들은 대부분 동기적 방식이다.
    Java의 Scanner 객체의 next()메서드 같이 사용자의 입력을 받는 함수들이 그 예이다.
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();

sc.nextInt() 결과 사용자가 입력을 하면, 그 값은 num이라는 변수에 담긴다.
즉, nextInt() 메서드를 호출하고 그결 과를 자신이 직접 처리 했다.
따라서 위의 코드는 동기적 방식이라 할 수 있다.

2) 비동기의 예
다음은 JS의 setTimeout() 함수이며, 비동기 방식의 예시이다.

setTimeout(foo, 3000);

function foo(){
 	console.log("2"); 
}
console.log("1");

setTimeout() 함수를 호출하면 3초 뒤에 foo()함수가 수행되는 코드이다.
이 시간 동안 프로그램은 다음 코드를 읽기 때문에 위 코드는 1,2 순서로 출력이 된다.

여기서 foo()함수를 setTimeout()함수의 콜백함수라고 한다.
콜백 함수란 비동기 방식에서 어떤 수행이 완료되었을 때(event가 발생했을 때) 수행해야 할 함수를 의미한다. 이처럼 비동기 방식에서는 함수를 호출한 쪽에서 수행 결과를 직접 처리하지 않고 콜백 함수를 통해 수행 결과를 처리한다.

이처럼 동기와 비동기는 수행의 결과를 함수를 호출한 쪽에서 직접 처리하느냐 아니면 다른 곳에서 처리하느냐의 차이로도 볼 수 있다.

블록 과 논블럭의 차이

블록 과 논블럭은 동기, 비동기와 연결되는 개념입니다.

블록이란?
블록이란 동기의 개념에서 만들어진 상태로
브라우저가(크롬) 실행되는 시간이 10분(요청)이라고 가정했을시에
브라우저가(크롬) 이 오픈(결과) 되기전까지 다른 브라우저(사파리 등등)은 계속 대기해야 하는 상태를 블록 상태라고 부릅니다.

동기 예제 코드에서는 사용자가 입력할 때까지 프로그램은 어떠한 동작도 수행하지 않습니다.

즉, 사용자가 입력할 때까지 제어권은 nextInt()메서드에게 존재하며, 사용자가 입력을 해야만 제어권이 넘어가서 이후의 코드가 수행됩니다.

이처럼 수행 결과가 끝날 때까지 제어권을 갖고 있는 것이 blocking 방식입니다.

블로킹은 자신의 수행결과가 끝날 때까지 제어권을 갖고 있는 것을 의미합니다.

논블록이란?
논블록이란 비동기 개념에서 만들어진 상태로
브라우저가(크롬) 실행되는 시간이 10분(요청)이라고 가정했을시에
브라우저가(크롬) 이 오픈(결과) 되기전까지 다른 브라우저(사파리 등등)은 시간을 대기 하지 않고 제약없이 자유롭게 사용할수 있는 상황을 논블록 상태 라고 부릅니다.

논블로킹은 자신이 호출되었을 때 제어권을 바로 자신을 호출한 쪽으로 넘기며, 자신을 호출한 쪽에서 다른 일을 할 수 있도록 하는 것을 의미합니다.

비동기 예제 코드의 수행 결과는 1, 2가 순서대로 출력됩니다.

그 이유는 setTimeout(foo, 3000) 함수를 호출할 때 제어권을 바로 반납하기 때문입니다.

즉, 3초 뒤에 foo() 함수가 실행이 되지만, 제어권을 반납했기 때문에 바로 다음 코드인 console.log("1")가 수행이 됩니다.

그리고 나서 3초라는 시간이 흘렀다는 이벤트가 발생하여 콜백 함수인 foo() 함수가 수행이 되는 것이죠.

이처럼 제어권을 바로 반납하는 방식을 non-blocking 방식이라 합니다.

블럭과 논블럭 정리
블록이란 동기의 개념에서 만들어진 상태
논블록이란 비동기 개념에서 만들어진 상태


분명 동기와 블로킹은 언뜻 보면 마치 동일한 개념처럼 보인다. 하지만 이 둘은 바라보는 시점에 따라 그 의미가 달라진다.
Blocking, Non-Blocking의 기준은 제어권을 어느 쪽이 가지고 있느냐로 나뉘어지지만, Sychronous, Asynchronous 는 작업의 반환에 대해 영향을 받는지 받지 않는지로 나뉘어진다.

profile
작성자 개인이 잊을 때마다 보라고 정리한 글

0개의 댓글

관련 채용 정보