Blocking/Non-blocking
블럭/논블럭은 호출된 함수가 호출한 함수에게 제어권을 건네주는 유무의 차이이다.
Blocking
A 함수가 B 함수를 호출할 때, B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것
예를 들어, 파일에서 데이터를 읽는 작업이 'Blocking'으로 수행되면, 해당 작업이 완료되어 데이터가 준비될 때까지 프로그램의 실행이 잠시 중지된다. 이는 프로그램이 데이터를 사용할 수 있을 때까지 아무런 작업도 수행하지 못하게 되어, 자원을 비효율적으로 사용할 수 있다는 단점이 있다.
Non-blocking
A 함수가 B 함수를 호출 할 때, B 함수가 제어권을 바로 A 함수에게 넘겨주면서, A 함수가 다른 일을 할 수 있도록 하는 것
즉, 특정 작업의 완료를 기다리지 않고 바로 다음 작업으로 넘어갈 수 있도록 하여 프로그램이 다른 작업을 계속 수행할 수 있게 해주므로, 자원을 보다 효율적으로 사용할 수 있다.
Synchronous/Asynchronous
동기/비동기는 일을 수행 중인 동시성이 중요하다.
Synchronous (동기)
요청이 들어온 순서대로 하나씩 처리하는 것
예를 들어, 함수 A가 함수 B를 호출 했을 때, B의 작업이 완전히 끝날 때까지 A는 대기 상태에 머무른다. 즉, 함수 B의 실행 상태를 A가 계속 체크한다.
Asynchronous (비동기)
하나의 요청이 끝나기 전에 다른 요청을 동시에 처리할 수 있는 것
예를 들어, 함수 A가 함수 B를 호출 했을 때, B의 작업이 끝나기를 기다리지 않고 바로 A의 다음 작업을 수행한다. 즉, 함수 B의 수행 상태를 A가 신경쓰지 않는다. (Callback)
Callback
어떤 이벤트가 발생하거나 특정 작업이 완료되었을 때 시스템에 의해 자동으로 호출되는 함수를 말한다.
비동기 작업을 수행할 때, 작업의 완료나 이벤트 발생을 알리기 위해 콜백 함수를 사용한다.
동기/비동기 & 블로킹/넌블로킹
Sync-Blocking
= Read/Write
- 유저모드에 있던 어플리케이션이 블록을 일으키는 시스템콜 호출
- 해당 프로세스는 정지하고 커널의 응답을 기다린다.
- 응답이 돌아오면 블록이 풀린다.
Sync-NonBlocking
= Read/Write(O_nonblock)
- Sync-Blocking에 비해 더 잦은 시스템콜로 인해 컨텍스트 스위칭이 잦고 비효율적이다.
- I/O을 즉시 완료하지만 I/O가 완료될 때까지 어플리케이션(유저모드)는 계속 시스템콜을 통해 완료됐는지 확인하고 완료된 경우에 결과를 반환한다. 만약 완료가 안된 경우에는 에러코드를 반환한다.
- 단점 : 매우 비효율적이고 I/O 지연(latency)이 발생한다.
Async-Blocking
= I/O multiplexing
- I/O는 넌블로킹으로 알림을 블로킹으로 하는 방식
- 일반적으로 어플리케이션 레이어에서 사용하지 않고 Linux 와 Unix의 I/O 다중화(multiplexing)에서 사용
Async-NonBlocking
= AIO(Async I/O), python, js에서 비동기 사용
- 리눅스에서 AIO로 구현이 됐지만 아직 완전히 구현이 되지 않아 커널에서는 사용하지 않고 유저모드에서만 사용
- python과 js의 promise나 async/await 에서 주로 사용
'Computer Science > Operating System' 카테고리의 다른 글
[OS] 프로세스 (Process) (1) | 2023.10.19 |
---|---|
[OS] Blocking & Non-Blocking I/O (0) | 2023.07.16 |
[OS] 파일 시스템 (File System) (0) | 2023.06.17 |
[OS] 메모리 (Memory) (0) | 2023.06.17 |
[OS] Thrashing (0) | 2023.06.17 |