이 4가지는 IO(입출력)를 처리할 때 접할 수 있는 용어들이다.
Blocking&Non-Blocking
Blocking&Non-Blocking은 단어 그대로 현재 작업이 block(차단, 대기)되느냐 아니냐의 차이다.
Blocking은 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것이다.(제어권이 넘어간 것)
Non-Blocking은 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것이다.(제어권을 돌려받는 것)
Sync&Async
동기/비동기는 요청한 작업에 대해 순서가 지켜지는지, 결과에 관심이 있는지에 대한 관점에 있다.
A프로세스가 본인 작업을 하다가 B프로세스에게 어떤 작업을 요청한다고 가정해 보자.
Sync는 본인이 하던 작업을 멈추고 B프로세스의 완료되면 자신의 다음 작업을 수행한다.
Async는 B프로세스 작업의 완료 여부에 상관없이 자신의 다음 작업을 그대로 수행한다.
이후 결과가 돌아오면 이 결과에 대해 처리를 할 수도 있고 안 할 수도 있다!
만약 3개의 작업을 요청했을 때 응답에서 그 순서가 지켜진다면 Sync이고 지켜지지 않는다면 Async이다.
성능
비동기가 요청한 작업에 대하여 완료 여부를 신경 쓰지 않고 자신의 다음 작업을 수행한다는 것은,
I/O작업 와 같은 느린 작업이 발생할 때 다른 작업을 처리하면서 동시에 멀티 작업을 수행할 수 있다는 것이다.
이는 전반적인 시스템 성능 향상에 도움을 줄 수 있다.
대표적인 예로 자바스크립트에서 비동기로 작업을 요청하면 브라우저에 내장된 멀티 스레드에서 작업이 동시에 처리된다.
Blocking&Non-Blocking / Sync&Async의 조합
위 개념들을 공부할 때 크로스오버한 이 사진이 무조건 나온다고 한다.
상사가 사원에게 업무를 지시하는 과정으로 예를 들어보자
A. Blocking/Sync
- 사원이 상사에게 보고서를 전달한다.
- 상사는 사원에게 "내가 보고서 다 읽을 때까지 거기서 기다리세요."라고 한다.(blocking)
- 사원은 상사가 보고서를 다 읽을 때까지 기다린다.
- 상사는 보고서를 다 읽고 나서 사원에게 결과를 전달한다.
- 사원은 결과를 받고 바로 처리하러 간다.(sync)
import java.util.Scanner;
public class BlockingExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("보고서를 읽어 주세요: ");
String report = scanner.nextLine(); //입력이 끝날 때까지 대기 (Blocking)
System.out.println("상사가 보고서를 읽었습니다: " + report); //입력 후 처리(sync)
System.out.println("결과를 처리하러 갑니다.");
}
}
대표적인 예로 Scanner로 입력요청을 할 때 Blocking을 사용한다.
제어권이 넘어갔기 때문에 사용자가 입력하는 동안 아래 코드는 실행되지 않고, 결과를 받는 즉시 처리한다.
B. Non-Bloking/Sync
- 사원이 상사에게 보고서를 전달한다.
- 상사는 사원에게 "보고서 읽을 테니까 다른 일 하고 있으세요"라고 한다.(Non-Blocking)
- 사원은 본인 일을 하지만 중간중간 끝났는지 완료 여부를 물어본다. (sync)
- 사원은 해당 결과를 받고 바로 처리하러 간다.(sync)
C. Blocking/Async
- 사원이 상사에게 보고서를 전달한다.
- 상사는 사원에게 "내가 보고서 다 읽을 때까지 거기서 기다리세요."라고 한다.(blocking)
- 사원은 상사가 다 보든 말든 관심 없지만 기다려야 한다.
- 상사는 보고서를 다 보면 사원에게 메일로 결과를 보냈으니 가라고 한다.(Async)
- 사원은 돌아가서 시간이 남을 때 결과를 처리한다. (Async)
사원은 Async라 "어차피 결과가 오든 말든 바로 처리하지도 않을 건데 왜 기다려야 되지?ㅂㄷㅂㄷ" 할 거다.
보통 Non-Blocking/Async 하려다가 개발자의 실수나 기타 이유로 위와 같이 동작하는 경우가 있다고 한다.
하지만 Async-blocking의 경우 sync-blocking과 성능의 차이가 또이또이하기 때문에 사용하는 경우는 거의 없다고 한다.
D. Non-Blocking/Async
- 사원이 상사에게 보고서를 전달한다.
- 상사는 사원에게 "보고서 읽을 테니까 다른 일 하고 있으세요"라고 한다.(Non-Blocking)
- 사원은 본인 일을 하러 간다.
- 상사는 보고서를 다 보면 메일에 결과를 담아 보낸다.(Async)
- 사원은 나중에 메일을 확인하고 결과를 처리한다.(Async)
Non-Blocking과 Async의 차이
이 둘의 차이가 좀 헷갈렸다.
`Non-Blocking`은 요청을 보낸 주체가 '제어권'을 돌려받는가? 이고
`Async`은 요청 보낸 작업의 '결과에 대한 관심'이라고 생각하면 될 것 같다.
`Non-Blocking`은 작업의 처리할 때 제어권을 돌려받아 다른 작업을 수행하는 것이고
`Async`는 작업을 요청한 후 그 작업의 완료 여부를 신경 쓰지 않고 있다가
작업이 완료되면 어떤 방식으로든 알림을 받게 되고, 나중에 그 알림을 확인하고 결과를 처리하는 것이다.
참고
10분 테코톡 🐰 멍토의 Blocking vs Non-Blocking, Sync vs Async
# 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
'👶🏻 CS > Operating System' 카테고리의 다른 글
교착상태와 해결법 (0) | 2024.11.15 |
---|---|
캐시 (0) | 2024.11.12 |
Concurrent(동시성) vs Parallel(병렬성) (0) | 2024.11.09 |
가상메모리와 페이지 교체 알고리즘 (0) | 2024.11.08 |
프로세스와 스레드 (0) | 2024.11.07 |
임계 구역(Critical Section)과 뮤텍스, 세마포어, 모니터 (0) | 2024.11.01 |