CS 공부

Blocking & Non-Blocking I/O(+동기/비동기) 본문

CS공부/컴퓨터네트워크

Blocking & Non-Blocking I/O(+동기/비동기)

kluiop1 2021. 6. 30. 18:18

Blocking I/O

blocking I/O 작업은 유저레벨에서 직접 수행할 수 없다. 실제 I/O를 수행하는것은 커널레벨에서만 가능하다. 유저 프로세스(또는 쓰레드)는 커널에게 I/O를 요청해야한다. I/O에서 블로킹 형태의 작업은 유저 프로세스가 커널에게 I/O를 요청하는 함수를 호출하고, 커널이 작업을 완료되면 함수가 작업 결과를 반환한다.

 

I/O 작업이 진행되는동안 유저 프로세스는 자신의 작업을 중단한 채 대기해야한다. I/O작업이 CPU자원을 거의 쓰지 않기 때문에 이런 형태의 I/O는 리소스 낭비가 심하고 비효율적이다.

 

리눅스 소켓 통신 방식이 블로킹 방식

 

Non-Blocking I/O

Blocking 방식의 비효율성을 극복하고자 만들어진 것이 Non-Blocking 방식이다.

Non-BlockingI/O작업을 진행하는 동안 유저 프로세스의 작업을 중단시키지 않는다.

유저 프로세스가 커널에게 I/O를 요청하는 함수를 호출하면, 함수는 I/O를 요청한 다음 진행상황과 상관없이 바로 결과를 반환한다.

 

이렇게 보면 동기/비동기(Synchronous/Asynchronous)와 비슷한 것 같지만 블로킹/논 블로킹은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사다.

호출된 함수가 바로 리턴해서 호출된 함수에게 제어권을 넘겨주고 호출한 함수가 다른일을 할 수 있는 기회를 주면 논 블로킹이고 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 블로킹이다.

 

동기/비동기(Synchronous/Asynchronous)는 호출되는 함수의 작업 완료 여부를 누가 신경쓰냐가 관심사이다.

호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면 호출 되는 함수가 전달받은 callback을 실행하고 호출하는 함수는 작업 완료 여부를 신경 쓰지 않으면 비동기이다.

 

호출하는 함수가 호출되는 함수의 작업을 완료 후 리턴을 기다리거나 또는 호출되는 함수로부터 바로 리턴 받더라도 작업 완료 여부를 호출하는 함수 스스로 계속 확인하며 신경쓰면 동기화이다.

 

NonBlocking-Sync

해당 조합은 일단 호출되는 함수는 바로 리턴하고 호출하는 함수는 작업 완료 여부를 신경 쓰는 것이다.

신경쓰는 방법은 아예 완료를 기다리거나 완료되었는지 물어보는 방법이 있는데 NonBlocking 함수를 호출했다면 기다릴 필요는 없고 물어보는 일이 남는다.

NonBlocking 메서드 호출 후 바로 반환을 받아서 다른 작업을 할 수 있게 되지만, 메서드 호출에 의해 수행되는 작업이 완료된 것은 아니며 호츌하는 메서드가 호출되는 메서드 쪽에 작업 완료여부를 계속 문의한다.

 

Blocking-Async

호출되는 함수가 바로 리턴하지 않고 호출하는 함수는 작업 완료 여부를 신경 쓰지 않는 것

Blocking-Async는 별다른 장점이 없어 일부러 사용할 필요는 없지만 NonBlocking-Async 방식을 사용하는데 그 중에 하나라도 Blocking으로 동작하는 놈이 포함되어 있다면 의도하지 않게 Blocking-Async으로 동작할 수 있다.

 

 

 

 

 

참고: https://bk-investing.tistory.com/38

https://grip.news/archives/1304

https://ozt88.tistory.com/20

'CS공부 > 컴퓨터네트워크' 카테고리의 다른 글

HTTP 스트리밍 및 대쉬(dash) & CDN  (0) 2021.08.02
DNS 서비스 & 동작원리  (0) 2021.08.02
로드밸런싱  (0) 2021.06.30
UDP란  (0) 2021.06.26
HTTP & HTTPS  (0) 2021.06.26