[운영체제] Blocking, Non-blocking & Synchronous, Asynchronous
cs-study에서 스터디를 진행하고 있습니다.
기본 개념
- Blocking
- 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
- NonBlocking
- 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것
- Synchronous
- 요청이 들어온 순서에 맞게 하나씩 처리하는 것
- Asynchronous
- 하나의 요청이 끝나기도 전에, 다른 요청을 동시에 처리할 수 있는 것
Synchronous와 Blocking은 무언가를 기다리게 하고, Asynchronous와 Nonblocking은 기다리지 않고 바로 바로 처리된다.
Synchronous & Asynchronous
한 작업이 다른 작업을 호출하는 경우, 호출되는 함수의 작업 완료 여부를 누가 신경을 쓰는 지에 따라 나뉜다. "신경 쓴다"는 방법으로는 끝났으면 끝났다는 말을 들을 때까지 기다리기와 끝났는지 계속 물어보는 방법 2가지가 있다.
- Asynchronous: 호출하는 함수가 작업 완료 여부를 신경 쓰지 않는다.
- 호출하는 함수에게 Callback을 전달해서 작업을 완료하면 실행하도록 한다.
- 기다리지도, 물어보지도 않는다.
- Asynchronous를 구현하기 위해 호출된 함수의 작업은 별도의 thread로 빼서 실행하며 완료되면, 호출한 함수에게 알려준다.
- Synchronous: 호출하는 함수가 작업 완료 여부를 확인한다.
- 호출하는 함수는 호출되는 함수의 작업 완료 여부 또는 작업 완료 후 리턴을 기다리고 있다.
- 또는 주기적으로 계속 물어본다.
Blocking & Nonblocking
한 작업이 다른 작업을 호출하는 경우, 호출되는 함수가 바로 리턴을 하는 지 여부에 따라 나뉜다. 누구한테 제어권 (작업을 할 권리)가 있는 지가 관건이다.
- Nonblocking: 호출된 함수가 바로 리턴한다.
- 호출된 함수가 제어권을 바로 호출한 함수에게 넘겨주어 다른 일을 할 수 있도록 한다.
- 제어권은 호출한 함수에게 있다.
- Blocking: 호출된 함수가 자신의 작업을 완료할 때까지 리턴하지 않는다.
- 호출된 함수는 자신의 작업을 완료하면, 호출한 함수에게 제어권을 넘겨주므로 호출한 함수는 다른 일을 하지 않고 대기한다.
- 제어권은 호출된 함수에게 있다.
Sync-Blocking & Async-Nonblocking
Sync-Blocking
- Synchronous + Blocking
- 호출하는 함수는 호출된 함수의 작업 완료/리턴을 계속 기다린다.
- 호출된 함수는 자신의 작업이 완료되면 리턴한다.
따라서 호출한 함수는 함수를 호출한 후, 리턴을 받기 전까지 다른 일을 하지 않고 대기한다.
Async-Nonblocking
- Asynchronous + Nonblocking
- 호출하는 함수는 호출된 함수의 작업 완료 및 리턴을 기다리지 않는다.
- 호출된 함수는 호출되면 바로 리턴한다.
Sync-Nonblocking
- Synchronous + Nonblocking
- 호출하는 함수는 호출된 함수의 작업 완료 및 리턴을 끝났는지 계속 기다린다.
- 호출된 함수는 호출되면 바로 리턴한다.
따라서 호출한 함수는 호출 이후 제어권을 바로 받기 때문에 작업을 계속하면서, 호출했던 함수의 작업 완료는 주기적으로 확인한다.
Async-Blocking
- Asynchronous + Blocking
- 호출하는 함수는 호출된 함수의 작업 완료 및 리턴을 기다리지 않는다.
- 호출된 함수는 자신의 작업이 완료되면 리턴한다.
호출한 함수는 호출한 함수의 리턴을 기다리지 않지만, 호출된 함수는 자신의 작업이 끝날 때까지 제어권을 넘겨 주지 않기 때문에 호출된 함수의 작업이 완료될 때까지 대기하게 된다. 즉, Sync-Blocking과 유사하게 동작하며, 이 방식에 비해 별다른 이점이 없다.
그러나 Async-Nonblocking을 추구하다 의도치 않게 Async-Blocking이 되는 경우가 있다. 다시 말해, 호출한 함수가 호출된 함수를 신경 쓰지 않고 다른 일을 하게 하도록 하고 싶은데, 어쩔 수 없이 호출된 함수를 기다리게 되는 경우이다. 대표적인 예시는 Node.js와 MySQL의 조합이다. Node.js에서 Callback 함수를 통해 Asynchronous 방식을 택하여도 DB 작업 호출 시 MySQL 드라이버를 호출하게 되는데, 이 드라이버가 Blocking 방식이기 때문이다.
정리
I/O 작업
입출력 작업은 커널 레벨에서만 수행할 수 있으므로 프로세스 및 스레드는 커널에게 I/O를 요청해야 한다. 즉, 프로세스 및 스레드는 호출하는 함수, I/O 작업은 호출되는 함수가 된다.
I/O Blocking
- 프로세스/스레드가 커널에게 I/O를 요청하는 함수 (recvfrom) 호출
- 커널 작업 완료
- 작업 결과 리턴
- 커널 작업 중에 프로세스/스레드는 자신의 작업을 중단하고 대기한다.
- 커널 작업 중 CPU 자원을 쓰지 않으므로 자원 낭비가 심하다. (물론 I/O 작업 완료 대기 중인 프로세스의 CPU 제어권을 뺏어서 다른 프로세스에게 주고, I/O가 끝나면 CPU의 제어권을 다시 넘겨 받는 방식으로 구현할 수도 있다.)
- 여러 클라이언트가 접속하는 서버인 경우, I/O 작업을 호출한 작업은 중지되어도 다른 클라이언트가 실행하는 작업은 중지되면 안 되기 때문에 클라이언트 별로 스레드를 생성하게 되어 클라이언트의 수가 매우 많아진다.
I/O Nonblocking
- 프로세스/스레드가 커널에게 I/O를 요청하는 함수 (recvfrom) 호출
- 커널은 곧바로 리턴
- 커널 작업이 완료되면 데이터를 리턴
커널 작업 중에 프로세스/스레드는 자신의 작업을 진행한다.
출처
- http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
- https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Network/%5BNetwork%5D%20Blocking%20Non-Blocking%20IO.md
- https://ozt88.tistory.com/20
예상 면접 질문 및 답변
Synchronous & Asynchronous와 Blocking & Nonblocking의 차이
Synchronous와 Asynchronous는 순서와 결과의 관점이라면, Blocking과 Nonblocking은 제어의 관점이라 볼 수 있다.
Synchronous & Asynchronous & Blocking & Nonblocking 차이
동기
동기란, 요청이 들어온 순서에 맞게 하나씩 처리하는 방식이다.
비동기
비동기란, 하나의 요청이 끝나기도 전에, 다른 요청을 동시에 처리를 할 수 있는 방식이다.
블로킹
커널과 같이 제어할 수 없는 대상의 작업이 끝날 때까지 기다려야 하는 방식이다.
ex) I/O 작업이 다 끝날 때까지 해당 애플리케이션은 기다려야 한다.
논블로킹
커널과 같이 제어할 수 없는 대상의 작업이 완료되기 전에, 제어권을 넘겨 받을 수 있는 방식이다.
ex) I/O 작업이 끝나기도 전에 해당 애플리케이션이 수행하던 로직을 추가로 수행할 수 있게 됩니다.
'스터디 > CS 스터디' 카테고리의 다른 글
[데이터베이스] 인덱스란? (실습 포함) (0) | 2021.12.13 |
---|---|
[네트워크] 로드 밸런서 (0) | 2021.12.12 |
[네트워크] 라우팅 (0) | 2021.12.07 |
[운영체제] 페이징 교체 알고리즘 (0) | 2021.12.04 |
[운영체제] 페이징과 세그멘테이션 (3) | 2021.12.03 |
댓글