Interrupt란 컴퓨터 프로그램 외에 다른 디바이스의 요청을 말합니다.
대표적으로 마우스, 키보드의 입력을 예로 들 수 있습니다. 이 뿐만 아니라 disk, memory 같은 하드웨어에서 CPU에 데이터를 보내는 것도 interrupt라고 할 수 있습니다.
하드웨어에서의 Interrupt 처리
이 Interrupt가 발생했을 때 다른 디바이스보다 훨씬 처리속도가 빠른 CPU는 Interrupt가 CPU에서 처리할 수 있는 형태로 바뀔 때까지 시간을 기다리게 되고, 비효율이 발생합니다. (I/O 처리기의 계산 속도 <<<< Processor)
예를 들어 하나의 프로그램을 실행시키면 디스크에 있는 데이터를 읽어와야 하는데, disk에서 데이터를 읽는 시간은 CPU보다 몇천만배는 느립니다.
이때 CPU의 utillization을 높이기 위해서 PIC(Programmable Interrupt Controller)이라는 장치가 만들어져서 CPU와 다른 디바이스 사이에 존재하게 됩니다.
인터럽트가 발생하면 각 디바이스에서 CPU에게 정보를 보내야 하는데, 그러려면 CPU에 연결된 여러 디바이스를 위한 라인이 존재해야 합니다.
여기서 PIC이 위 그림처럼 다른 디바이스들의 여러 신호 라인을 받아주고 디바이스의 데이터가 CPU에서 처리 가능해지면 CPU에 신호를 보내주어 CPU 사용의 효율성을 높여줍니다.
디바이스에서 Interrupt가 발생해 PIC으로 보내는 요청을 IRQ(Interrupt Request)라고 하고, disk, mouse, print 같이 특정 device에 대해 각각 다르게 처리를 해야 하기 때문에 디바이스마다 고유한 IRQ number가 vector로 존재합니다.
늘어난 CPU 처리 단계
Interrput가 발생하고 데이터를 처리할 수 있는 상태가 되면 PIC에서 CPU에 신호를 전달해주어야 하고, 그에 따라 CPU에서도 그 응답에 대한 대기가 필요합니다.
따라서 CPU엔 그 신호를 대기하고 응답이 오면 상태가 바뀌는 bit와 PIC에 연결된 interrupt request line 존재하고, fetch - decode - execution로 구성된 intstruction cycle에서 Interrupt를 확인하고 처리하는 단계가 추가되었습니다.
OS에서의 Interrupt 처리
위 그림에서 같이 CPU는 instruction cycle에서 interrupt를 계속해서 확인하고, 만약 발생했다면 PC 레지스터의 주소는 inttrupt handler 라는 인터럽트를 CPU에서 처리하는 프로그램의 시작 주소로 변경됩니다. 이제 그 주소에서부터 다시 fetch - execution이 반복되는 것이죠.
이 intrrupt handler는 커널 모드에서 실행되고 PSW가 커널로 바뀌는데, 여기서부터가 OS의 영역이라고 생각할 수 있습니다.
위 그림처럼 intrrupt가 발생하면 현재 실행 중인 프로그램에서 interrupt 처리가 끝나면 실행할 명령 주소인 PC와 psw 상태를 저장하고 interrupt handler로 PC를 바꾸고 handler 실행을 위해 psw를 커널 모드로 바꿉니다.
또한 해당 interrupt 처리가 끝날 때까지 다른 interrupt의 응답을 받지 않습니다(INTR disable).
interrupt handler
interrupt handler가 커널 모드에서 실행되면 이제 fetch, execution 되는 코드는 커널 코드입니다.
핸들러는 인터럽트 발생 전 cpu에서 처리되고 있는 작업에 대한 레지스터, timer, PC, PSW의 상태 정보를 커널 스택이라는 메모리 공간에 저장해놓고 인터럽트를 처리합니다.
핸들러는 인터럽트를 발생시킨 디바이스가 무엇인지에 대한 IRQ 정보를 가지고 있고, 각기 다른 IRQ를 효과적으로 처리하기 위해 각기 다른 IRQ number에 맞는 함수를 실행시킵니다. IRQ vector에 대한 함수의 집합을 ISR(Interrupt Service Routine)이라고 합니다.
total Step - interrupt
- 하드웨어
1. 하드웨어, 디바이스 컨트롤러에서 인터럽트가 발생
2. processor에서 현재 수행 중인 instruction 까지만 처리
3. PIC에서 processor로 처리 가능한 상태의 interrupt를 받음
4. pc와 psw상태를 control stack에 저장
5. interrupt handler 주소를 pc에 저장
- 소프트웨어 (OS 코드 실행(assembly) )
1. 나머지 레지스터 정보들 저장
2. interrupt handler에서 해당 IRQ에 대응하는 ISQ를 IDT에서 찾아 실행 (process interrupt)
3. interrupt처리가 끝나면 기존 레지스터 정보들 스택에서 불러와 레지스터에 적용
4. control stack에 있던 pc, psw 상태 불러와 적용
exception
추가적으로, CPU 내부에서 발생되는 exception도 interrupt와 같은 방식으로 처리합니다.
여기서 exception이란 illegal opcode, divide by zero 등 커널에서 발생하는 에러입니다.
exception이 발생하면 interrupt request bit가 1로 바뀌며 interrupt hanlder가 실행되고 위의 작업들을 수행합니다.
이때 IDT라는 앞서 설명한 IRQ에 대응하는 ISR정보가 담겨있는 테이블이 존재하는데,
exception처리에 대한 함수들도 이 테이블에서 관리하고 있어 intterupt와 같은 방식으로 처리하는 것입니다.
instruction cycle에서, 프로그램 내부에서 발생한다는 점이 intterupt와의 차이점입니다.
'CS > OS' 카테고리의 다른 글
CPU와 I/O device (0) | 2022.03.24 |
---|---|
메모리 계층 구조 - Cache (0) | 2022.03.23 |
Instruction과 레지스터 (0) | 2022.03.20 |
하드웨어 동작의 이해 (0) | 2022.03.20 |
오퍼레이팅 시스템 - 소프트웨어를 위한 소프트웨어 (0) | 2022.03.19 |