# Blocking I/O & Non-Blocking I/O
I/O 란?
입출력 장치로 부터 어떤 데이터를 주거나 보내는 역할.
동기 & 비동기 : 흐름의 관점
블러킹 & 넌 블러킹: 제어권의 관점
Blocking / Non-blocking
행위자가 취한 행위 자체가, 또는 그 행위로 인해 다른 무엇이 막혀버린, 제한된, 대기하는 상태. 대개의 경우에는 나 이외의 대상으로 하여금 내가 Block 당하겠지만(Blocked), 어찌 되었든 문자 자체로는 나라는 단일 개체 스스로의 상태 를 나타냅니다.
호출된 함수
가 자신이 할일을 모두 마칠 때 까지 제어권을 계속 가지고서호출한 함수
에게 바로 돌려주지 않으면 Block호출된 함수
가 자신이 할일을 마치지 않더라도 바로 제어권을 건네주어(return)호출한 함수
가 다른 일을 진행할 수 있도록 해주면 Non Block→ 제어권 : 행동할 수 있는 권리
1
2
3
4
5
6
7
8
9
10
11
12
def 호출자() {
functionA()
functionB()
functionC()
}
def functionA() {
/*
엄청난 로직
*/
return something
}
Synchronous / Asynchronous
동시에 발생하는 것들. 동시라는 것은 즉, 시라는 단일계 에서 같이,함께 무언가가 이루어지는 두 개 이상의 개체 혹은 이벤트를 의미한다.
호출된 함수
의 수행 결과 및 종료를호출한 함수
가 (호출된 함수
뿐 아니라호출한 함수
도 함께) 신경쓰면 Synchronous호출된 함수
의 수행 결과 및 종료를호출된 함수
혼자 직접 신경 쓰고 처리한다면 Asynchronous
실생활 예제로 이해해보자!
등장인물
- 개발팀장: 개발팀 작업 흐름을 조율하고, 사원들에게 업무를 지시함
- 사원1, 사원2, 사원3 : 개발팀장이 지시한 일을 성실하게 수행한다.
비동기 + 논블로킹
- 시스템콜이 즉시 IO개시 여부를 반환한다. 사용자프로세스는 다른일을 할 수 있고(CPU는 다른 업무를 볼 수 있다), IO는 백그라운드에서 처리된다.
- IO 응답이 도착하면 신호나 콜백으로 IO전달을 완료한다.
- 개발팀장이 사원1에게 업무 A를, 사원2에게 업무B를, 사원3에게 업무 C를 지시하였다. → 비동기
- (그리고 바쁜 개발팀장은 개발팀 업무 말고 다른것도 업무 중..)
- 사원들은 각자 본인의 맡은 작업을 끝내는대로 개발팀장에게 보고한다.(논블로킹)
→ 개발팀장이 업무들을 ‘비동기적’ 으로 처리하고 사원들은 본인의 작업을 ‘논블로킹’방식으로 수행
동기 + 논블로킹
- 동기블로킹의 개선안이지만 비효율적이다. 왜냐하면 위에서 정리했듯이 논블로킹방식은 정상데이터가 올 때 까지 계속 시스템콜을 하며 문맥교환을 한다.
- IO 지연(latency) 초래한다.
만약에, 개발팀장이 업무를 ‘동기적’으로 처리 한다면,,?
- 개발팀장이 사원1 에게 업무A를 지시한다.
- 개발팀장은 사원1이 업무 A를 끝마칠때 까지 사원1 모니터 뒤에서 기다린다.. 끝날때까지!! → 동기적 작업 지시
- 사원1이 업무 A를 끝내면 개발팀장이 확인한다.
- 개발팀장이 사원2 에게 업무 B를 지시한다.
- 개발팀장은 사원2가 업무 B를 끝마칠때까지 모니터 뒤에서 기다린다.. 끝날때까지 !! → 동기적 작업
- 사원2가 업무 B를 끝내면 개발팀장이 확인
전체적인 작업의 흐름을 제어하는 개발팀장이 사원에게 업무를 지시하고, 그 사원이 해당 업무를 끝내고 보고 받을 때 까지 기다리게 됩니다.
사원2와 사원3은 업무만 지시된다면 성실하게 수행할 준비가 되어있지만, 개발팀장의 작업 흐름상 앞선 사원의 일이 끝날 때까지 작업을 진행하지 못하게 됩니다.
비동기 + 블로킹
- IO는 논블로킹이고 알림(notify)가 블로킹인 방식이다.
- select() 시스템함수 호출이 사용자프로세스를 블로킹한다.
- 비효율적이다.
만약에, 개발팀장이 업무를 ‘비동기적’으로 처리하지만 사원들이 업무를 ‘블로킹’하게 진행한다면 아래와 같은 시나리오가 발생됩니다.
- 개발팀장이 사원1에게 업무A를 지시하고, 사원2에게 업무B를 지시하고 싶었지만… (비동기적 작업 지시를 하고 싶었지만)
- 사원1이 개발팀장을 붙잡는다. (블로킹 방식의 작업처리)
- 그리고 사원1은 자신의 일이 다 끝날때 까지 개발팀장을 놓아주지 않는다.
- 사원1의 업무가 끝나고 보고받고 나서야, 개발팀장은 사원2에게 업무B를 지시한다.
- …(사원2,3 생략)..
개발팀장이 ‘비동기적’으로 작업을 진행하고 싶다하여도, 사원들이 개발팀장을 붙잡는다면 (blocking) 개발팀장은 사원들의 업무가 끝나고 보고 될 때까지 기다리게 됩니다.
동기 + 블로킹
두번째 시나리오와 같게된다.
- 프로그램이 블로킹을 일으키는 시스템 함수를 호출
- 한 작업당 한 번의 사용자-커널사이의 문맥교환 발생
- 정지된 프로그램은 CPU를 사용하지 않고 커널의 응답을 대기
- 프로그램 관점에서 보면 마치 처리로직이 오래걸리는 것 같지만, 사실은 커널의 일을 기다리느라 블록되어 있는 것이다. 이게 개선 포인트