본문 바로가기
카테고리 없음

[CS] I/O 기초

by hbIncoding 2024. 8. 20.

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