Non-Blocking/Blocking 과 Async/Sync

개발하는 구황작물·2022년 8월 11일
0

Non-Blocking/Blocking, Async/Sync 이 두 개념은 같은 것처럼 보이나 사실 다른 개념이다.

사실 나에게도 어려운 개념이지만 그래도 정리를 해보자면 Non-Blocking/Blocking는 제어권을 바로 주는지 안 주는지의 차이이고, Sync/Async는 호출된 함수의 종료를 호출한 함수가 처리하는지, 호출된 함수가 처리하는지의 차이라고 정의 할 수 있다.

1. Non-Blocking/Blocking

Blocking : 자신의 작업이 진행되다 다른 주체를 호출하면 호출된 주체의 작업을 끝날 때까지 기다렸다가 자신의 작업을 시작함(제어권을 호출한 함수에게 넘기고 호출한 함수가 일이 끝나면 제어권을 다시 돌려받음)

예시를 들어보자

Blocking 예시
직원 : 과장님 여기 작성한 서류입니다.
과장 : 그래 내가 다 읽을 때까지 기다려
(서류를 읽는동안 직원은 가만히 있는다.)
과장 : 서류 다 읽었으니 가서 일하시게
직원 : 네 알겠습니다.(도로 일 하러 감)

Non-Blocking : 다른 주체의 작업에 관련없이 자신의 작업을 함
(제어권을 호출된 주체에게 넘겨주면 바로 다시 리턴받음)

예시를 들어보자

직원 : 과장님 여기 작성한 서류입니다.
과장 : 읽어볼 테니 다시 일하러 가세요.
직원 : 네 알겠습니다.(도로 돌아가 일하러 감)

Blocking 과 Non-Blocking 차이는 자신에게 제어권이 있는지 없는지로 볼 수 있다.

2. Synchronous/Asynchronous

Synchronous : 함수를 호출하고 호출된 주체가 작업이 완료되면 호출한 주체가 작업을 시작함(요청이 들어온 순서대로 하나씩 처리함)

예시를 들어보자

Synchronous 예시
직원 : 과장님 여기 작업한 서류입니다.
과장 : 알겠네
직원 : (과장이 서류를 다 읽을 때까지 기다리거나 다 읽었는지 주기적으로 물어본다.)
과장 : 자 다 읽었네 이제 바로 일하시게
직원 : 네 바로 처리하겠습니다.

Asynchronous : 함수를 호출하고 호출된 주체가 작업을 하더라도 호출한 함수 다른 요청을 처리할 수 있다.(callback함수를 전달해서 작업이 완료되면 호출한 함수에게 전달)

예시를 들어보자

Asynchronous 예시
직원 : 과장님 여기 작업한 서류입니다.
과장 : 알겠네
직원 : (과장이 서류를 읽든 말든 자기 일 하기 바쁨)
과장 : 자 다 읽었네
직원 : 네 언젠간 처리하겠습니다.

Synchronous/Asynchronous는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지로 판단할 수 있다.

Non-Blocking/Blocking 과 Async/Sync 4가지 조합의 경우

Non-Blocking/Blocking 과 Async/Sync를 공부하다보면 이 표를 꼭 보게 되어 있다. 그렇다면 Blocking/Sync, NonBlocking/Sync, Blocking/Async, NonBlocking/Asyns 에 대해 살펴보자.

Blocking/Sync

함수를 호출하면 호출된 함수에게 제어권이 넘어가고 호출된 함수가 작업을 완료하면 호출한 함수는 바로 해당 업무를 처리한다.

사원이 과장한테 서류를 넘겨주면 과장은 서류를 읽는동안 사원을 기다리게 한다(Blocking) .과장이 서류를 다 읽으면 사원은 해당 업무를 바로 처리하러간다.(Sync)

Blocking/Sync의 사용예시

  • main() 메소드에서 입력요청을 하면 입력을 할 때 까지 메서드가 작동을 멈춘다.
public class BS {
	public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(str);
    }
}

NonBlocking/Sync

함수가 호출되면 호출한 함수는 자신의 일을 하면서 주기적으로 호출된 함수에게 일을 마쳤는지 물어본다. 호출된 함수가 일을 완료하면 해당 결과를 가지고 바로 업무를 처리한다.

사원이 과장한테 서류를 넘겨주면 과장이 서류를 읽는동안 사원에게 다른 일을 하라 한다(Non-Blocking). 과장이 서류를 읽는동안 사원은 다 읽었는지 주기적으로 물어보고 과장이 다 읽으면 사원은 해당 업무를 바로 처리하러간다.(Sync)

NonBlocking/Sync예시

  • 특정 어플리케이션을 설치하는 동안 로딩율을 보여줘야 할 때 사용된다.

Blocking/Async

함수를 호출하고 호출한 함수는 제어권을 넘겨주어 대기하고(Blocking), 호출한 함수가 결과값을 리턴해 준다해서 바로 결과를 처리하지 않음(Async)

이런 경우는 개발자의 실수(Non-Blocking/Async이나 중간에 blocking 과정이 들어감)로 발생함

Non-Blocking/Async

함수를 호출한 이후에도 호출한 함수는 자기 자신의 일을 함, 이후 작업의 결과가 리턴되더라도 자신의 일을 다 끝내고나서 처리된 결과를 가지고 일을 함

사원이 과장한테 서류를 넘겨주면 과장이 서류를 읽는동안 사원에게 다른 일을 하라 지시한다(Non-Blocking). 사원은 자신의 일을 계속 진행하고 과장은 메일을 보내 결과를 보낸다. 사원은 자신의 일이 다 끝난 후 메일을 확인하고 처리된 결과를 가지고 일을 시작한다.(Async)

Non-Blocking/Async예시

  • 자바스크립트가 API 요청을 하고 다른 작업을 하다가 콜백을 통해 결과가 리턴되면 결과를 가지고 일을 하는 경우

참고

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글