on
동기, 비동기, 블로킹, 논블로킹
동기, 비동기, 블로킹, 논블로킹
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
from http://devfunny.tistory.com/656 by ccl(A) rewrite - 2021-12-14 22:02:43