1. Blocking, Non-blocking
- Blocking과 Non-blocking는 요청을 받은 쪽에서 처리가 끝나기 전에 제어권을 넘기는지, 안넘기는지에 중점을 둔다.
- Blocking(블로킹)은 단어 뜻 그대로 막히거나, 제한된, 대기하는 상태를 얘기한다.
- A 함수가 B 함수를 호출을 했을 때, B 함수가 자신의 할 일이 끝나기 전까지 A 함수에게 제어권을 주지 않으면 Block.
- A 함수가 B 함수를 호출 할 때, B 함수가 자신의 할 일이 끝나지 않았어도, 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 진행할 수 있도록 해주면 Non-block.
2. Synchronous, Asynchronous
- Synchronous과 Asynchronous는 동시에 발생한 (두 개 이상) 이벤트에서 요청한 순서가 지켜지는지, 안지켜지는지에 중점을 둔다.
- A 함수가 B 함수 호출시, B 함수의 결과를 A 함수가 처리하면 Synchronous(동기).
(수행한 작업을 A함수와 B함수 둘 다 신경써야하는 경우 -> 동기)
- A 함수가 B 함수 호출시, B 함수의 결과를 B 함수가 처리하면 Asynchronous(비동기).
(수행한 작업을 B 함수(호출된 함수)만 신경쓰고 처리하는 경우 -> 비동기)
3. Blocking, Non-blocking & Synchronous, Asynchronous 조합 (4 가지)
참고) 파란색 화살표 - A 함수, 초록색 화살표 - B 함수
1) Sync + Blocking
- A 함수가 B 함수를 호출 후 A 함수는 다른 작업을 하지 못하면서(Blocking), 그 결과를 반환 받아서 다음 작업을 진행한다(Sync).
- 일반적인 동기 함수의 동작 방식이다.
- 예시) Java의 scanner, 파일 등의 I/O 작업, 동기 함수에서 다른 동기 함수 호출
2) Async + Non-Blocking
- A 함수가 B 함수를 호출 후 A 함수는 B 함수에게 callback 함수를 전달한 후 다른 작업을 진행하고(Non-Blocking), B 함수의 작업 결과에 상관 없이 A 함수는 다음 작업을 진행한다(Async). 그리고 B 함수는 작업을 완료되면 전달 받은 callback 함수를 실행한다.
- 일반적인 비동기 함수의 동작 방식이다.
- 성능과 자원의 효율적 사용 관점에서 가장 유리한 모델이다.
- 예시) 자바스크립트 API 요청(ajax, fetch), async 방식의 파일 I/O
3) Sync + Non-blocking
- A 함수가 B 함수를 호출 후 B 함수는 바로 제어권을 돌려줘서(Non-blocking), A 함수는 다른 작업을 진행할 수 있다.
- 그러나, B 함수의 종료 처리를 A 함수에서 해야 해서, B 함수가 언제 끝나는지 계속 확인해야 한다.(Sync)
- 예시) 폴링(polling), 정보를 가지고 올 때까지 프로그래스바 표출
4) Async + Blocking
- A 함수가 B 함수를 호출 후 A 함수는 다른 작업을 못하고 대기하지만(Blocking), B 함수에서 처리해 A 함수와는 관련이 없다(Async).
- 예시) Node.js + MySQL(쿼리 자체는 비동기로 동작하지만 DB에 접근할 때 드라이버를 호출하는 과정은 동기 방식으로 동작)
** 이 개념은 비효율적으로 보이지만, 다음과 같은 이유에서 등장했다.
1. Sync+Blocking I/O의 경우 직관적이나, 여러 개의 I/O를 동시에 처리할 수 없다.
2. Non-Blocking I/O는 프로세스들의 작업을 컨트롤하는 것이 까다롭다.
3. 그렇다고 Sync+Blocking I/O와 멀티 프로세싱이나 쓰레딩을 결합해서 사용하자니, 자원 문제도 있고 프로세스 및 스레드 간 통신이나 동기화가 힘들다.
---> 따라서 직관적인 코드의 흐름을 유지하면서 작업을 병렬적으로 처리하기 위해 Linux/UnixS OS의 I/O 다중화 모델 등에서 사용된다.
Reference)
http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
Blocking-NonBlocking-Synchronous-Asynchronous
꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면
homoefficio.github.io
[운영체제] 동기와 비동기, 블로킹과 논블로킹
동기(Synchronous)와 비동기(Asynchronous) 동기/비동기는 주로 어플리케이션에서 자주 다뤄지는 개념이며, 다음 작업이 요청되는 시간과 관련되어 있다. 동기(Synchronous) 현재 작업의 응답이 끝남과 동
cotak.tistory.com
'개발 > 개발노트' 카테고리의 다른 글
[Web] Web Server? WAS? (0) | 2023.04.15 |
---|---|
[Network] REST, REST API, RESTful (0) | 2023.04.12 |
[Network] Blocking I/O, Non-blocking I/O (0) | 2023.04.08 |
[TCP/IP] 인터넷 계층 프로토콜 (IP, ICMP, IGMP, ARP, RARP) (0) | 2021.03.28 |
[DB] 트랜잭션(Transaction)의 모든 것 (개념, 특징, TCL) (0) | 2021.03.14 |