오늘은 운영체제가 인터럽트를 처리하기 위한 방법을 알아보도록 하겠습니다.
인터럽트를 처리하기 전에 우리는 잠깐 mode change의 내용을 떠올려봅시다.
2023.09.23 - [Computer Science/운영체제] - [운영체제] 3-3. 프로세스 스위치
mode change를 통해서 user mode에서 kernel 모드로 진입하게 되는데, 이러한 kernel mode entry pointsms 총 3가지가 있습니다. Interrupt, Trap, System call.
우리는 Interrupt를 처리하는 과정을 다루면서 동시에 Trap와 System call을 어떻게 처리하는지 알아봅시다.
Interrupt
우선 간략하게 Interrupt에 대해서 다시 알아봅시다. Interrupt는 비동기 사건이 발생했음을 운영체제에 알리기 위한 수단입니다. Interrupt의 종류에는 여러가지가 있습니다. 보통 여러가지 Interrupt는 PIC(Programmable Interrupt Controller)에 의해 CPU에게 전달됩니다.
하지만 특수한 Interrupt인 Clock이 있습니다. Clock Interrupt는 1ms에 한번씩 실행되는 Interrupt입니다. 너무 자주 발생되기도 하고 중요한 Interrupt이므로 Clock Interrupt는 CPU에게 직접 Interrupt를 전달합니다.
Interrupt 처리
Interrupt 처리는 다음과 같은 방식으로 진행됩니다.
- Interrupt가 걸렸을 때, user mode였다면 kernel mode로 mode change를 진행합니다.
- 현재 context를 kernel stack에 저장합니다.
- 현재 발생된 Interrupt가 어떤 Interrupt인지 확인합니다.
- IDT(Interrupt Descriptor Table)에서 Interrupt에 해당하는 주소를 찾아서 해당 주소의 메서드를 수행합니다. 해당 메서드의 수행과정을 ISR(Interrupt Service Routine)이라고 합니다.
- 만약 Interrupt 처리 도중 또 다른 Interrupt가 발생했다면, 위의 과정을 반복합니다.
크게는 이러한 흐름으로 Interrupt를 처리합니다.
우리가 더 고려해야할 것은 ISR입니다. ISR은 Interrupt를 처리하기 위한 해결책인데, 이 ISR은 Interrupt에 따라 많은 시간을 소요할 수도, 그렇지 않을 수도 있습니다. 따라서 우리는 ISR을 Urgent Part, Remaining Part로 나눕니다. Interrupt가 들어오면 가장 먼저 빠르게 Urgent part를 수행합니다. 후에 다른 Interrupt가 들어오기도 전에 가장 중요한 부분을 처리하는 것이 효율적이기 때문입니다.
이러한 방식으로 Interrupt를 수행하다가, Urgent Interrupt를 모두 수행하게 되면 해당 context를 끝내기 위해 remaining part를 수행합니다. 하단의 그림을 확인해봅시다.
각 Interrupt를 같은 색으로 표현해보았습니다. 주목해야할 것은 가장 마지막에 빨간색 박스로 되어있는 부분입니다. 리눅스에서는 해당 부분을 return from ~ 으로 부르면서 특수한 동작을 수행합니다.
Return from Interrupt
Interrupt로부터 user mode로 돌아가기 위한 Return 과정에서 리눅스는 다음과 같은 루틴을 거칩니다.
- Remaining Part 실행
- 프로세스의 signal의 변동 사항이 있는지 확인
- Schedular가 필요한지 확인
- 새로운 프로세스가 있는지 확인
해당 과정을 확인하면서 return 과정에서 추가로 필요한 수행과정이 있는지를 확인합니다. 이러한 부분은 다음 글에서 더 다뤄보겠습니다.
Trap
Trap은 software Interrupt라고도 불립니다. software Interrupt는 동기 이벤트입니다.
이러한 종류로는 아래의 몇가지 종류로 나뉩니다.
divide_by_zero : 0으로 나누는 동작
invalid machine code : 잘못된 instruction
segmentation fault : 접근할 수 없는 주소에 접근
protection fault : ROM과 같은 읽기 전용 공간에 write 수행
page fault : 실행할 내용이 메모리에 없는 과정.
이 중에서 특히 page fault는 처리 가능한 과정으로, page fault Interrupt가 발생했다면, 보조기억장치에 있는 데이터를 메모리로 옮기는 과정을 수행하게 됩니다.
이러한 Trap이 발생했을 때 처리되는 과정은 Interrupt와 동일합니다.
System call
프로세스가 커널에 있는 기능들을 이용하려고 할 때 호출하는 함수들을 의미합니다. fork, exec, open, read와 같은 명령어들이 있습니다.
System call이 호출되었다면 IDT에 명시되어 있는 sys_call_table에서 해당하는 메서드의 주소를 따라가 실행하는 과정으로 동작됩니다.
Interrupt를 처리하는 방식에 대해 알아보았습니다. 감사합니다.
'CS > OS' 카테고리의 다른 글
[운영체제] 디스크 스케쥴링 (1) | 2023.11.12 |
---|---|
[운영체제] I/O 제어 (1) | 2023.11.11 |
[운영체제] 입출력 관리 (0) | 2023.11.11 |
[운영체제] 리눅스의 파일 시스템 (0) | 2023.11.02 |
[운영체제] 파일 시스템 (1) | 2023.10.28 |