본문 바로가기
학부/Operating System

폴링(Polling) / 인터럽트(Interrupt) / DMA(Direct Memory Access)

by ulqaef 2019. 12. 15.
728x90

/*

본 내용은 학교 수업내용을 바탕으로 하고 OSTEP(Operating Systems: Three Easy Pieces) 교재를 참고하여 정리한 내용입니다.

*/

 

 

폴링과 인터럽트를 보기 전 간단하게 컴퓨터구조와 하드웨어의 구성을 보고 진행하도록 하겠다.

 

 

컴퓨터시스템구조 모형

 

CPU와 메인메모리가 메모리버스에 연결되어 있다. 그래픽이나 다른 고성능 I/O장치들은 범용I/O버스에 연결될 수 있다.(ex. PCI) 

그 아래에는 SCSI. SATS, USB와 같은 주변장치용 I/O버스가 있다. 이 주변장치버스를 통해 디스크, 키보드, 마우스와 같은 가장 느린 하드웨어 장치들이 연결된다.

 

이러한 구조를 유지하는 이유는 비용때문이다. 버스가 고속화되려면 더 짧아져야 하는데 고속의 메모리버스는 여러 장치들을 수용할 공간도 없고 이 버스를 만드는 데는 큰 비용이 수반된다. 그렇기 때문에 고성능의 장치들을 CPU에 가깝게 배치하고 느린 장치들을 주변장치 I/O버스에 연결하도록 배치했다.

 

 

표준장치

 

하드웨어장치에는 중요한 두 가지 요소가 있다. 첫 번째는 시스템의 다른 구성요소에게 제공하는 하드웨어 인터페이스(Interface)이다. 하드웨어가 인터페이스를 제공하여 시스템 소프트웨어가 동작을 제어할 수 있도록 해야하기 때문에 모든 하드웨어장치들은 특정한 상호 동작을 위한 방식과 명시적인 인터페이스를 갖게 된다.

두 번째는 내부구조(Internals)이다. 구현 방법에 따라 다르지만 시스템에게 제공하는 장치에 대한 추상화를 정의하는 책임을 갖고 있다. 

 

위의 그림에서 인터페이스는 세 개의 레지스터, 상태(Status), 명령(Command), 그리고 데이터(Data)레지스터로 구성되어 있는 것을 알 수 있다. 상태레지스터는 하드웨어 장치의 현재 상태를 읽을 수 있는 레지스터고 명령레지스터는 하드웨어장치가 특정 동작을 하도록 요청할 때, 그리고 데이터레지스터는 하드웨어 장치에 데이터를 보내거나 받거나 할 때 사용한다. 운영체제는 이 레지스터들을 읽고 쓰는 것을 통해 하드웨어 장치의 동작을 제어할 수 있게 된다.

 

운영체제와 하드웨어장치 간에 폴링(Polling)을 통한 상호동작은 다음과 같다.

첫 번째로 풀링(Polling)을 한다. 풀링이란 운영체제가 하드웨어장치의 상태레지스터를 읽음으로써 명령의 수신 여부를 주기적으로 확인하는 것이다. 

두 번째는 운영체제가 데이터레지스터에 데이터를 전달한다. 

세 번째는 운영체제가 명령레지스터에 명령을 기록한다.

마지막으로 운영체제는 하드웨어 장치가 특정 동작을 처리하였는지 폴링 반복문을 돌면서 기다린다.(성공/실패 코드를 받게 됨)

 

 

 


 

 

 

위에서 얘기한 바와 같이 폴링(Polling)이란 하드웨어장치의 상태를 수시로 체크하여 명령을 받을 수 있는지를 확인하는 것을 말한다.

폴링을 하는동안에는 다른 프로세스에게 CPU를 양도하지 않고 하드웨어 장치가 동작을 완료하는 동안 계속 루프를 돌면서 하드웨어의 상태를  체크하게 된다. 하지만 하드웨어장치의 속도는 매우 느리게 때문에 CPU를 양도하지 않고 하드웨어장치의 상태를 계속 확인하는 것은 CPU를 많이 낭비하게 되는 것이다.

 

 

 

 

인터럽트(Interrupt)란 CPU가 프로그램을 실행하는 중에 I/O 하드웨어장치나 다른 예외 상황의 발생으로 인해 특별한 처리가 필요할 때 CPU에 이를 알려 처리하도록 하는 것을 말한다.

운영체제는 디바이스를 폴링하는 대신에 I/O를 요청한 프로세스를 블록시키고 CPU를 다른 프로세스에게 양도한다. 장치가 작업을 끝마치면 하드웨어 인터럽트를 발생시키고 CPU는 운영체제가 미리 정의해 놓은 인터럽트서비스루틴(ISR) 또는 인터럽트핸들러(Interrupt Handler)를 실행한다. 인터럽트핸들러는 입출력요청, I/O를 대기중인 프로세스 깨우기 등을 하여 프로세스가 작업을 계속할 수 있도록 한다.

 

 

 

 

 

폴링

위의 그림은 프로세스1이 실행 중에 DISK로부터 I/O요청을 발생시키게 된다. (이 때 특별한 인터럽트가 없다면) 운영체제는 I/O요청이 완료될 때까지 반복적으로 폴링을 한다(P). 디스크가 I/O요청의 처리를 완료하게 되면 프로세스1은 다시 동작한다.

 

 

 

 

 

인터럽트

위의 그림은 프로세스1이 실행 중에 있다가 디스크로부터 I/O요청을 받고 요청을 처리하는 동안에 운영체제는 프로세스2를 CPU에서 실행시키게 된다. 프로세스1에 대한 디스크요청이 완료가 되면 인터럽트를 발생시켜 운영체제는 프로세스1을 다시 CPU에서 실행시킨다.

 

 

 

 

 

이 처럼 인터럽트를 사용하면 CPU연산과 I/O장치 작업을 중첩시켜서 수행할 수 있게 된다. 그렇기 때문에 인터럽트를 통해 I/O처리를 하는 것이 폴링을 하는 것보다 CPU의 사용률을 높일 수 있는 방법이다. 하지만 무조건 인터럽트가 폴링보다 좋다고 할 수는 없다. 

예를 들어 어떠한 작업이 단 한 번의 폴링으로만 끝날 정도의 빠른 하드웨어장치라면 인터럽트보다는 폴링이 더 효율적이라고 할 수 있다.

왜냐하면 인터럽트를 사용하게 되면 현재 실행중인 프로세스를 다른 프로세스로 문맥교환(Context Switching)하게 되고 이 때 많은 비용이 수반되기 때문이다. 그렇기 때문에 빠른 하드웨어 장치라면 폴링이 더 효율적이고 느린 하드웨어장치라면 인터럽트가 더 효율적이라고 할 수 있다.

 

 

 


 

DMA(Direct Memory Access)란 CPU의 간섭없이 메모리와 하드웨어 장치 간의 데이터전송을 하는 것이다.

 

앞서 공부한 방식에서 고려해야 할 부분이 또 있다. 만약 많은 데이터를 디스크로 전달하기 위해서 programmed I/O(PIO)를 사용한다면 CPU가 다른 프로세스를 처리하기 위해 사용될 수 있는 시간들이 허비되게 된다. 

위의 그림에서는 프로세스1이 실행되는 중에 디스크에 어떤 데이터를 기록하려고 하는 상황이다. I/O를 발생시켜 데이터를 메모리에서 DISK로 1 word씩 복사한다.(C) 복사가 완료되면 디스크에서 I/O처리를 하고 CPU가 다른 처리를 할 수 있게 된다.

 

이러한 문제를 해결하기 위해 DMA(Direct Memory Access)를 사용한다. DMA라는 단어 그대로 메모리와 장치 사이에 직접 데이터전송을 하는 것이다.

 

 

 

 

데이터를 하드웨어 장치로 전송한다고 할 때 운영체제는 DMA에 데이터의 메모리주소와 전송할 데이터의 크기, 대상 장치를 프로그램한다. 이 시점에 데이터를 전송하기 위한 작업들은 끝나기 때문에 운영체제는 다른 작업을 수행할 수 있게 된다. DMA동작이 끝나면 DMA컨트롤러가 인터럽트를 발생시켜 운영체제가 전송이 완료되었음을 알도록 한다

 

 

728x90
반응형

'학부 > Operating System' 카테고리의 다른 글

병행성(1) - 락(LOCK)  (0) 2019.12.14
멀티레벨페이지테이블(Multi-level Page Table)  (0) 2019.12.13
TLB(Translation-Lookaside Buffer)  (0) 2019.12.13
페이징(Paging)  (0) 2019.12.13

댓글


`