- 42서울 Webserv 과제 진행 중 i/o의 종류와 관련된 내용을 정리한 글입니다.
- blocking, non-blocking, synchronous, asynchronous 의 개념을 정립하는 내용을 담고 있습니다.
Blocking vs Non-Blocking
- 호출된 함수가 제어권과 결과값을 동시에 넘겨주느냐 제어권을 미리넘겨 주느냐 하는 실행의 제어권과 결과값 관점에서의 개념
- blocking 에서는 제어권과 결과값을 동시에 넘겨주고 non-blocking 에서는 동시에 넘겨주지 않음.
funca(){
//
b = funcb()//3초
// b+=1
}
funcb(){
//약 10초 정도 걸리는 로직
return 3
}
- 예를 들어 다음과 같이 funca가 funcb를 호출했을 때 funcb가 blocking 방식으로 실행된다면
- funcb호출 시점에 funca라는 funcb의 호출자는 제어권을 funcb에게 넘겨줌.
- funcb에게 제어권이 넘어간 상태이기 때문에 funca는 실행되지않고 블로킹 되어있으며, funcb가 약 10초정도 모든 로직을 수행하여 결과값을 만들어 return 할때 결과값과 제어권을 동시에 넘겨주어 funca가 다시 실행되고 이때 b에는 3 이라는 funcb return 값이 들어감.
- 하지만, 만약 funcb가 non-blocking 방식으로 실행된다면
- funcb호출 시점에 funca라는 funcb의 호출자는 제어권을 funcb에게 넘겨줌.
- funcb에게 넘어간 제어권이 바로 다시 funca로 넘어오고 funca 는 funcb 결과값을 return 하지않았음에도 실행됨.
- funcb가 10초뒤 실행을 끝마치고 나면 3이라는 결과값을 리턴함.(funcb가 개별적으로 실행될 수 있도록 하기위해 별도의 쓰레드를 생성할 수 있음.)
Synchronous vs Asynchronous
- 특정 사건간의 시간상의 선후 관계과 명확히 정해져있느냐 하는 개념
- Synchronous/Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경쓰냐가 관심
- 예를 들어 i/o작업이 완전히 끝난 이후에 읽은 데이터에 대해서 계산하는 로직이 있다면, i/o작업과 그 데이터를 계산하는 작업은 synchronous라고 할 수 있다.