CPU는 i/o device와 다음과 같은 방식으로 데이터를 주고받습니다.
CPU와 device가 직접 데이터를 주고받는 것이 아니라 system bus라는 데이터 전송 라인과 I/O controller라는 하드웨어를 통해 데이터를 전달하게 됩니다.
System bus
- Address bus : 데이터의 출발 주소와 도착 주소를 전송합니다.
- Data bus : 실제 데이터 정보를 전송합니다.
- Control bus : read/write와 같은 각 위치에서의 데이터 처리에 필요한 명령을 전송합니다.
I/O Controller
CPU가 다양한 input처리 때문에 낭비되는 시간을 줄이기 위해서 CPU 대신 I/O device에 대한 처리를 하는 하드웨어입니다.
i/o controller도 데이터, 상태, 명령을 저장하는 레지스터들과 메모리 공간이 존재하여 데이터 처리가 가능합니다.
이때 cpu가 접근하여 데이터 처리 명령을 수행할 수 있는 i/o controller의 레지스터들을 I/O port register라고 하고,
컨트롤러가 cpu에게 제공하는 접근 가능한 레지스터들의 주소들을 저장하는 공간을 I/O Address Space라고 합니다.
이 I/O address space는 크게 두 가지 저장 방식으로 나뉩니다.
Port mapped : 미리 i/o device에 대한 명령을 System 단계에서 mapping 해놓은 것을 말합니다.
메인 메모리와 따로 존재하는 공간에 저장되어 있습니다. ex) x86 아키텍처에서는 'in', 'out' 명령으로 호출할 수 있습니다.
Memory mapped : 메인 메모리 안에 존재하여 다른 메모리들을 불러오는 방식과 같이 사용될 수 있습니다.
ex) load, store
이 두 개가 같이 사용될 수도 있습니다.
명령 처리 과정
위의 CPU가 접근할 수 있는 I/O 컨트롤러의 레지스터 주소들을 가지고 실제로 CPU가 어떻게 명령을 처리하는지에 대해 알아보겠습니다.
Programmed I/O
CPU가 반복적으로 I/O 모듈의 명령을 확인하는 방식입니다.
I/O device에서 신호가 오면 컨트롤러에서 해당 신호에 대한 i/o operation이 끝날 때까지 cpu가 Status register를 반복적으로 확인하고 만약 i/o operation이 끝났다면 cpu가 처리된 word를 받아 메인 메모리에 적고 반복이 끝납니다.
이때 cpu가 반복적으로 I/O 컨트롤러의 작업 완료를 확인하는 것을 busy waiting이라고 합니다.
이 방법은 CPU가 I/O controller의 작업이 끝날 때까지 기다리기 때문에 device가 빠르다면 효율적이고 그렇지 않다면 비효율적입니다.
Interrupt Driven I/O
programmed i/o에 interrupt 처리 단계를 적용하여 busy waiting을 줄인 방식입니다.
전에 알아본 Interrupt check bit를 이용하여 I/O controller의 처리 여부를 확인하고 작업이 끝났다면 interrupt handler에서 하나의 ISR로 처리하여 메모리에 word를 적습니다. 이를 통해 CPU가 I/O controller를 확인하며 기다리는 busy wating 단계 없이 처리할 수 있습니다.
물론 interrupt handler는 커널 모드에서 작성되기 때문에 mode switch 비용이 발생하기 때문에,
만약 device의 처리 속도가 그 비용보다 빠르다면 programmed i/o 방식이 더 효율적일 수 있습니다.
DMA(Direct Memory Access)
hard disk와 같이 블록 단위의 큰 데이터를 읽는 느린 작업들 경우엔, 위 방식들보다 더 효율적인 방식이 존재합니다.
위 방식들은 하나의 I/O operation이 끝나면 하나의 word 단위로 CPU에 전송하여 메인 메모리에 명령을 적었지만
컨트롤러에서 블록단위로 작업을 처리하고 직접 메모리에 word로 바뀐 명령 블록을 저장하여 완료되면 처리된 블록 단위당 하나의 interrupt만 발생시켜 cpu의 개입을 최소화시킵니다.
이를 위해 별도의 하드웨어인 DMA Controller가 존재합니다. 이는 i/o controller와 통합되어 있을 수도, 분리되어 있을 수도 있습니다. 또한 DMA controller와 메인 메모리에 접근하기 위한 memory bus가 존재합니다.
정리하자면, device의 데이터를 word 단위로 처리하냐, 블록 단위로 처리하냐에 따라 DMA 방식의 사용 여부를 결정한다고 볼 수 있습니다.
SMP와 APIC
위 그림에서 처럼 interrupt에 대한 처리를 두 개 이상의 Processor에서 진행하는 것을 SMP(symmetric Multi-Processor)라고 합니다. symmetric이란 대칭적이라는 의미로 다수의 processor가 어떻게든 대등하게 프로그램을 처리하는 방식을 말합니다. 이를 위해 다수의 Processor가 공유하는 메모리 공간도 따로 존재해야 합니다.
APIC(Advanced Programmble Interrupt Controller)란 SMP를 효율적으로 사용하기 위해 만들어진 PIC입니다.
processor가 여러 개 존재하기 때문에 Interrupt가 발생하면 PIC에서 어떤 processor가 interrupt handler를 실행시켜야 할지 결정해야 합니다.
APIC은 각 Processor의 상대 시간(count)을 확인하여 최대한 idle 한 상태를 가지고 있는 processor를 선택하여 interrupt handler를 적절한 processor에서 실행시켜줍니다.
또한 각 CPU마다 local APIC이 존재하여 APIC에서 준 interrupt handler를 받고 global 한 interrupt handler와 처리 순위를 비교하여 적절한 작업을 수행합니다.
'CS > OS' 카테고리의 다른 글
OS 시스템의 발전 - Time Sharing System (0) | 2022.03.25 |
---|---|
OS 시스템의 발전 - batch System (0) | 2022.03.24 |
메모리 계층 구조 - Cache (0) | 2022.03.23 |
Interrupt 처리 (0) | 2022.03.21 |
Instruction과 레지스터 (0) | 2022.03.20 |