컴퓨터 입출력

인터럽트란

인터럽트는 컴퓨터에서 발생하는 특수한 제어신호로 인터럽트가 발생하게 되면 인터럽트 당한 시점의 레지스터와 pc값을 저장한 후 CPU의 제어를 인터럽트 처리 루틴으로 넘긴다.

인터럽트는 크게 하드웨어 인터럽트, 소프트웨어 인터럽트로 나뉘며 현대의 운영체제는 인터럽트 동작 방식을 통해 구동된다. 입/출력 장치의 입/출력의 과정에서도 인터럽트가 발생하며 CPU는 인터럽트가 발생했다는 것을 인지하여 입/출력이 완료되었음을 알아 차리게 된다.

인터럽트가 있기에 컴퓨터는 예외 상황이 발생하면 현재 하던 작업을 중단하고 서브루틴을 수행하여 우선적으로 인터럽트에 대하여 처리할 수 있게 된다. 만약 인터럽트가 없다면 컴퓨터는 매번 실행되는 일이 모두 끝날 때까지 기다려야 할 것이다.

I/O 방식

I/O 방식에는 크게 폴링, 인터럽트 방식, DMA 방식이 있으며 이 3가지에 대해서 알아보도록 하겠다.

  • 폴링 방식 : 폴링 방식은 while문을 생각하면 쉽다. CPU에서 입출력이 완료 되었는지 주기적으로 입출력 장치의 버퍼를 확인한다. 가장 간단한 방식이지만 CPU가 주기적으로 확인해야 하는 방식이기 때문에 효율적이지 못하다.
  • 인터럽트 방식: 인터럽트 방식은 컴퓨터에서 일어나는 인터럽트 신호를 통해 CPU에 입/출력이 완료되었음을 알려주는 방식이다. 입/출력이 발생하면 Device Controller에 연결되어 있는 Local Buffer에 데이터가 쌓이게 되고 이 Buffer가 가득차면 Device Controller는 인터럽트 신호를 발생시켜 CPU에 입/출력 작업이 완료되었음을 알린다. 이는 주기적으로 CPU가 확인해야하는 폴링 방식에 비해 효율적이다.

  • DMA 방식: DMA 방식은 DMA Controller에 입/출력에 대한 제어를 넘기고 메모리에 내용을 직접 읽고 쓰는 것을 의미한다. CPU에서 입/출력할 일이 생기게 되면 CPU는 입/출력을 수행할 메모리에 대한 주소의 값을 DMA에 넘겨주고 DMA에 제어권을 넘긴다. 이후 DMA는 입/출력 장치와 데이터를 주고 받으면서 모든 입/출력 과정이 끝났을 때 인터럽트를 발생시킨다. 이 방식은 Buffer가 쌓일 때마다 인터럽트를 발생시키는 방식보다 인터럽트가 덜 발생하기 때문에 효율적이다.

    -> DMA는 입/출력 과정에서 데이터 버스의 사용이 필요하다. 하지만 CPU와 DMA가 동시에 데이터 버스에 대한 사용을 할 수 없기 때문에 CPU가 데이터 버스에 대한 사용권을 한 차례(Cycle)을 넘겨주는데 이를 Cycle Stealing이라고 한다.

동기 , 비동기 방식 입출력

  • 동기 방식 : 동기 방식이란 입출력이 완료 될 때까지 아무 작업을 하지 않고 완료를 기다리는 것이다. 예를 들면 빨래를 세탁기에 널었는데 세탁기가 빨래를 모두 할 때 까지 다른일을 하지 않고 기다리는 것으로 볼 수 있다.

    프로그램의 입출력 방식이 동기 방식으로 수행되면 코드는 수행되다가 해당 입출력이 완료되어 결과를 반환할때까지 멈추어 있게 된다.

  • 비동기 방식: 비동기 방식은 입출력에 대하여 시켜놓고 다른일을 하는 것을 말한다. 위에서 빨래를 하면서 아무일도 하지 않고 기다렸다면 빨래를 하도록 해놓고 나는 컴퓨터도 하고 요리도 하고 다른일을 하다가 완료되었으면 이에 대해 통보받는 것을 의미한다. 비동기함수는 결과를 즉시 리턴하며 작업이 완료되었음을 알려준다.

공유하기