1. I/O 모델의 종류
- Blocking
- 호출된 함수가 작업을 완료할 때 까지 제어권을 반환 하지 않고 프로그램의 실행을 멈추게 만드는 방식
- 즉 해당 작업이 끝날 때까지 다음 줄의 코드가 실행되지 않는다.
- 장점
- 코드가 직관적이고 이해하기 쉽다.
- 순차적으로 작업이 수행되므로 코드 흐름이 명확하다
- 단점
- 한번에 하나만 수행되어 비효율적일 수 있다.
- 네트워크 요청이나 파일 시스템 작업처럼 시간이 오래 걸리는 작업에서 프로그램이 멈추게 되어 성능에 영향을 줄 수 있다.
- Non-Blocking
- 호출된 함수가 작업을 시작하자마자 제어권을 즉시 반환하여 프로그램의 실행을 멈추지 않고, 다른 작업을 계속 수행할 수 있도록 하는 방식.
- 작업이 완료되면 나중에 특정 시점에서 결과를 처리한다.
- 장점
- CPU와 I/O 자원을 효율적으로 사용할 수 있다.
- 여러 작업을 병렬로 처리하여, 응답성을 향상시킨다.
- 서버나 애플리케이션에서 다수의 요청을 동시에 처리한다.
- 단점
- 코드가 복잡해 질 수 있다.
- 콜백 지옥에 빠질 수 있지만 Promises나 async/await 같은 기능으로 어느 정도 해결할 수 있다.
- 논블로킹이 항상 더 빠른 것은 아니며, 잘못된 사용은 성능 저하를 초래한다.
1)Synchronous blocking I/O
- 애플리케이션에서 시스템 콜을 호출하면 해당 애플리케이션은 I/O Buffer에 데이터가 차기전까지 blocking된 상태로 대기한다.
- 시스템 콜이 결과 값을 반환하기 전까지 애플리케이션은 아무것도 하지 않고 기다린다.
- 이때 호출한 애플리케이션은 CPU를 사용하지 않고 있다가 결과값을 받은 후에 작업을 시작하기 때문에 꾀나 효율적이라고 볼 수 있다.
2)Synchronous non-blocking I/O
- 애플리케이션에서 시스템 콜을 호출한다.
- I/O buffer에 데이터가 차든 안차든 결과값을 바로 반환한다.
- 이때의 결과값은 아직 데이터가 차지 않았다는 에러 코드(EAGAIN or EWOULDBLOCK)를 반환하게 된다.이러한 방식은 굉장히 비효율적이다. 왜냐하면 어플리케이션과 커널간의 Context Switch가 매우 빈번하게 발생하기 때문이다.
- 어플리케이션은 원하는 결과값을 받지 못했으므로 다시 커널에게 시스템 콜을 보낸다. 여러번 에러코드를 받은 후 원하는 결과를 얻게 된다.
3)Asynchronous blocking I/O
- 어플리케이션은 마찬가지로 커널에게 시스템 콜을 보낸다.
- 아직 데이터가 차지 않았으므로 에러코드를 받게 된다. 이때 select()함수가 어플리케이션을 Blocking상태로 만든다.
- 커널로부터 response를 받은 경우 Blocking상태에서 벗어나게 된다.
4)Asynchronous non-blocking I/O (AIO)
- 어플리케이션의 request에 즉각적으로 response하게 된다.
- 다른 스레드에서 I/O 작업을 하는 동안 어플리케이션은 다른 작업을 할 수 있게 된다.
- I/O 작업을 끝마친 스레드는 callback을 이용하여 어플리케이션에게 알리게 된다.
2. 참고
1) 입출력 모델 : https://velog.io/@ellyheetov/IO-%EB%AA%A8%EB%8D%B8