기준
동기/비동기
작업 완료를 누가 신경 쓰는가?
1) 동기 : '호출한 함수'가 스스로 신경쓴다.
2) 비동기 : '호출된 함수 (callback 함수)' 가 신경쓰고, '호출한 함수'는 신경쓰지 않는다.
블로킹/논블로킹
호출되는 함수가 바로 return 되는가? 호출한 함수가 제어권을 넘겨주는가?
1) 블로킹 : '호출된 함수'가 자신의 작업을 모두 마칠 때까지 '호출한 함수'에게 제어권을 넘겨주지 않고 대기한다.
2) 논블로킹 : '호출된 함수'에게 제어권이 넘어가지않고, '호출한 함수'가 제어권을 가지고 계속해서 다른 일을 한다.
위 내용은 동기/비동기, 블로킹/논블로킹을 요약한 내용이다. 계속해서 동기, 비동기, 블로킹, 논블로킹을 자세히 살펴보자. 동기/비동기, 블로킹/논블로킹의 판단 기준은 아래와 같다.
- 동기/비동기 - 작업완료
- 블로킹/논블로킹 - 제어권
동기/비동기
동기 (Synchronous)
요청과 결과가 동시에 일어난다. 어떤 작업에 대한 요청이 발생했을때, 그 요청에 대한 응답을 받을 때까지 대기해야한다. 작업에 대한 완료를 '호출한 함수'가 신경을 쓰고있다.
Thread1, Thread2가 존재할때 Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 Thread2가 끝날 때까지 대기상태다.
Thread1이 작업1, 작업2, 작업3, 작업4를 가지고있다.
Thread1이 작업1을 Thread2에게 보냈다. Thread1은 Thread2의 작업이 끝난 후부터 2라는 작업을 처리할 수 있다.
상황으로 이해하자. [신발가게 매장 안에서]
비동기 (Asynchronous)
요청과 결과가 동시에 일어나지 않는다. 작업에 대한 완료를 '호출 함수'가 아닌 'callback'이 신경쓴다.
Thread1, Thread2가 존재할때 Thread1에서 처리하려고 했던 일을 Thread2에게 보낸 경우, Thread2가 해당 작업을 수행하는 동안 Thread1은 대기 없이 나머지 Task2, Task3를 실행한다.
Thread1이 작업1, 작업2, 작업3, 작업4를 가지고있다.
Thread1이 작업1을 Thread2에게 보냈다. Thread1은 Thread2의 작업의 완료 여부에 상관 없이 계속 실행한다.
상황으로 이해하자. [신발가게 매장 안에서]
블로킹/논블로킹
블로킹 (Blocking)
A함수가 실행될때 제어권이 B함수로 넘어가게되면 A함수는 제어권이 없는 상태로, B함수의 종료까지 대기해야한다. 작업은 총 A함수, B함수 2개를 가진 상태며, 다른 작업을 하는 동안 자신의 작업에 대한 제어권이 없을때 다른 작업이 끝날때까지 기다렸다가 자신의 작업을 멈췄던 부분부터 이어나간다.
상황으로 이해하자. [신발가게 매장 안에서]
논블로킹 (Non-Blocking)
A함수가 실행되는 도중에 B함수가 호출되었다. A함수는 제어권을 B함수에 넘기지않고 그대로 자신이 가지고있으며 B함수의 완료 여부와 상관없이 작업을 계속 진행한다.
상황으로 이해하자. [신발가게 매장 안에서]
조합
동기 (Synchronous) / 블로킹 (Blocking)
- 동기 (Synchronous) : 호출한 함수가 작업 완료 여부를 확인한다.
- 블로킹 (Blocking) : 호출된 함수 (task1)이 제어권을 가진다.
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) : 호출한 함수가 제어권을 가진다.
Thread1은 task1의 완료 여부에 상관 없이 다른 작업을 진행할 수 있다. 하지만 task1의 완료 여부를 지속적으로 확인한다.
상황으로 이해하자. [신발가게 매장 안에서]
예제화면
흔한 게임 업데이트 진행중인 화면이다. 오른쪽 하단에 게임 업데이트가 계속 진행되고 있으며, 남은 시간 및 현재까지 업데이트된 정도를 보여주고있다. 완료 여부를 계속해서 확인하고 있는 상태로 보인다.
비동기 (Asynchronous) / 블로킹 (Blocking)
- 비동기 (Asynchronous) : Callback 함수가 작업 완료 여부를 확인한다.
- 블로킹 (Blocking) : 호출된 함수 (task1)이 제어권을 가진다.
Thread1이 task1의 작업 완료 여부를 신경쓰지 않으나, 작업이 완료될때 까지 아무것도 하지 못하는 대기 상태다. 해당 경우는 비동기인데 굳이 블로킹인 경우인데, 이는 보통 비동기 (Asynchronous) + 논블로킹 (Non-Blocking) 로 작업을 시도했을때 잘못된 경우 발생한다.
상황으로 이해하자. [신발가게 매장 안에서]
비동기 (Asynchronous) / 논블로킹 (Non-Blocking)
- 비동기 (Asynchronous) : Callback 함수가 작업 완료 여부를 확인한다.
- 논블로킹 (Non-Blocking) : 호출한 함수가 제어권을 가진다.
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
Reference.
https://deveric.tistory.com/99
https://drive.google.com/file/d/16puFZy9oM-mrjjPuQRs3NTDwhIRNy8kO/view
https://1-7171771.tistory.com/131
https://siyoon210.tistory.com/147
'Computer Science > OperatingSystem' 카테고리의 다른 글
스레드 (0) | 2022.08.02 |
---|---|
프로세스 (0) | 2022.07.31 |
운영체제 메모리 구조 (0) | 2021.12.09 |