동기 (Synchronous), 비동기 (Asynchronous), 블로킹 (Blocking), 논블로킹 (Non-Blocking)

반응형
728x90
반응형

기준

동기/비동기

작업 완료를 누가 신경 쓰는가?

1) 동기 : '호출한 함수'가 스스로 신경쓴다.
2) 비동기 : '호출된 함수 (callback 함수)' 가 신경쓰고, '호출한 함수'는 신경쓰지 않는다.

 

블로킹/논블로킹

호출되는 함수가 바로 return 되는가? 호출한 함수가 제어권을 넘겨주는가?

1) 블로킹 : '호출된 함수'가 자신의 작업을 모두 마칠 때까지 '호출한 함수'에게 제어권을 넘겨주지 않고 대기한다.
2) 논블로킹 : '호출된 함수'에게 제어권이 넘어가지않고, '호출한 함수'가 제어권을 가지고 계속해서 다른 일을 한다.

 

위 내용은 동기/비동기, 블로킹/논블로킹을 요약한 내용이다. 계속해서 동기, 비동기, 블로킹, 논블로킹을 자세히 살펴보자. 동기/비동기, 블로킹/논블로킹의 판단 기준은 아래와 같다.

 

- 동기/비동기 - 작업완료
- 블로킹/논블로킹 - 제어권

 

 

 

동기/비동기

동기 (Synchronous)

요청과 결과가 동시에 일어난다. 어떤 작업에 대한 요청이 발생했을때, 그 요청에 대한 응답을 받을 때까지 대기해야한다. 작업에 대한 완료를 '호출한 함수'가 신경을 쓰고있다.

 

출처 : https://velog.io/@nameunzz/%EB%8F%99%EA%B8%B0sync-vs-%EB%B9%84%EB%8F%99%EA%B8%B0async

 

Thread1, Thread2가 존재할때 Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 Thread2가 끝날 때까지 대기상태다.

 

Thread1이 작업1, 작업2, 작업3, 작업4를 가지고있다.

출처 : https://1-7171771.tistory.com/131

 

 

Thread1이 작업1을 Thread2에게 보냈다. Thread1은 Thread2의 작업이 끝난 후부터 2라는 작업을 처리할 수 있다.

출처 : https://1-7171771.tistory.com/131

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

 

비동기 (Asynchronous)

요청과 결과가 동시에 일어나지 않는다. 작업에 대한 완료를 '호출 함수'가 아닌 'callback'이 신경쓴다.

출처 : https://velog.io/@nameunzz/%EB%8F%99%EA%B8%B0sync-vs-%EB%B9%84%EB%8F%99%EA%B8%B0async

 

Thread1, Thread2가 존재할때 Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 대기 없이 나머지 Task2, Task3를 실행한다.

 

Thread1이 작업1, 작업2, 작업3, 작업4를 가지고있다.

출처 : https://1-7171771.tistory.com/131

 

Thread1이 작업1을 Thread2에게 보냈다. Thread1은 Thread2의 작업의 완료 여부에 상관 없이 계속 실행한다.

출처 : https://1-7171771.tistory.com/131

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

 

 

 

블로킹/논블로킹

블로킹 (Blocking)

출처 : https://slowly-steadily.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%B8%94%EB%A1%9C%ED%82%B9-vs-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0

 

A함수가 실행될때 제어권이 B함수로 넘어가게되면 A함수는 제어권이 없는 상태로, B함수의 종료까지 대기해야한다. 작업은 총 A함수, B함수 2개를 가진 상태며, 다른 작업을 하는 동안 자신의 작업에 대한 제어권이 없을때 다른 작업이 끝날때까지 기다렸다가 자신의 작업을 멈췄던 부분부터 이어나간다. 

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

 

논블로킹 (Non-Blocking)

출처 : https://slowly-steadily.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%B8%94%EB%A1%9C%ED%82%B9-vs-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0

 

A함수가 실행되는 도중에 B함수가 호출되었다. A함수는 제어권을 B함수에 넘기지않고 그대로 자신이 가지고있으며 B함수의 완료 여부와 상관없이 작업을 계속 진행한다. 

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

 

조합

동기 (Synchronous) / 블로킹 (Blocking)

- 동기 (Synchronous) : 호출한 함수가 작업 완료 여부를 확인한다.

- 블로킹 (Blocking) : 호출된 함수 (task1)이 제어권을 가진다.

출처 : https://www.inflearn.com/questions/65766

 

Thread1은 Task1이 끝날때까지 아무것도 하지 못하고 대기해야한다. 실행, 흐름이 순차적이기 때문에 프로그램을 제어하기 쉽다. 

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

예제코드
import java.util.Scanner;

/**
 * 동기 + 블로킹
 */
public class BlockingAndSync {
    public static void main(String[] args) {
        System.out.println("메시지를 입력하세요 : ");

        Scanner scanner = new Scanner(System.in);

        /* 제어권이 넘어갔다. 입력이 되기 전까지 그 다음 로직이 실행되지 않는다. */
        String message = scanner.nextLine();
        
        /* 입력이 된 후, 결과를 받아서 그때 처리된다. */
        System.out.println(message);
    }
}

 

 

동기 (Synchronous) / 논블로킹 (Non-Blocking)

- 동기 (Synchronous) : 호출한 함수가 작업 완료 여부를 확인한다.

- 논블로킹 (Non-Blocking) : 호출한 함수가 제어권을 가진다.

출처 : https://www.inflearn.com/questions/65766

 

Thread1은 task1의 완료 여부에 상관 없이 다른 작업을 진행할 수 있다. 하지만 task1의 완료 여부를 지속적으로 확인한다.

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

예제화면

 

흔한 게임 업데이트 진행중인 화면이다. 오른쪽 하단에 게임 업데이트가 계속 진행되고 있으며, 남은 시간 및 현재까지 업데이트된 정도를 보여주고있다. 완료 여부를 계속해서 확인하고 있는 상태로 보인다.

 

 

비동기 (Asynchronous) / 블로킹 (Blocking)

- 비동기 (Asynchronous) : Callback 함수가 작업 완료 여부를 확인한다.

- 블로킹 (Blocking) : 호출된 함수 (task1)이 제어권을 가진다.

 

출처 : https://www.inflearn.com/questions/65766

 

Thread1이 task1의 작업 완료 여부를 신경쓰지 않으나, 작업이 완료될때 까지 아무것도 하지 못하는 대기 상태다. 해당 경우는 비동기인데 굳이 블로킹인 경우인데, 이는 보통 비동기 (Asynchronous) + 논블로킹 (Non-Blocking) 로 작업을 시도했을때 잘못된 경우 발생한다.

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

비동기 (Asynchronous) / 논블로킹 (Non-Blocking)

- 비동기 (Asynchronous) : Callback 함수가 작업 완료 여부를 확인한다.

- 논블로킹 (Non-Blocking) : 호출한 함수가 제어권을 가진다.

출처 : https://www.inflearn.com/questions/65766

 

Thread1이 task1의 완료 여부를 신경쓰지 않고 다른 자신의 작업을 진행한다. 성능과 자원 효율면에서 가장 우수하다.

 

 

상황으로 이해하자. [신발가게 매장 안에서]

 

 

예제코드
function getData() {
  let data;

  $.ajax({
    type: 'post',
    url: 'https://recordboy.github.io/',
    data: {
      // 전송 데이터
    },
    success: function (result) {
      // 통신 성공시 결과값 할당
      data = result;
    },
  });

  return data;
}

console.log(getData()); // undefined

출처 : https://velog.io/@recordboy/%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%99%80-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98Callback-Function

 

 

 

 

 

Reference.

https://deveric.tistory.com/99

https://slowly-steadily.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%B8%94%EB%A1%9C%ED%82%B9-vs-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0

https://drive.google.com/file/d/16puFZy9oM-mrjjPuQRs3NTDwhIRNy8kO/view

https://1-7171771.tistory.com/131

https://siyoon210.tistory.com/147

https://www.youtube.com/watch?v=oEIoqGd-Sns

https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking

반응형

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

스레드  (0) 2022.08.02
프로세스  (0) 2022.07.31
운영체제 메모리 구조  (0) 2021.12.09

Designed by JB FACTORY