📣
해당 포스트는 운영체제 공룡책과 고건 교수님의 OLC 강의 등을 참고하여
작성되었습니다.
인터럽트란 무엇일까요??
오늘의 주제는 인터럽트가 핸들링되는 방식이기 때문에 인터럽트는 아주 간략하게 정리를 해볼게요!
인터럽트는 CPU에서 돌아가는 프로세스가 시스템콜이 필요한 I/O를 포함한 다양한 작업들과 다양한 예외 사항을 커널에게 처리해달라고 요청해주는 도구라고 보시면 될것 같아요!
인터럽트가 발생되면 인터럽트 핸들러가 기존 돌아가던 프로세스의 상태를 저장하고,
인터럽트 벡터 테이블에서 어떤 인터럽트인지를 검사한 후, 해당하는 인터럽트 서비스 루틴을 실행하는 순서로 작동합니다.
자세한건 위키피디아에 잘 설명되어있습니다!
그럼 가볼까요??
1. CPU와 Interrupt Bit
CPU는 계속 Cylcle을 돌아가갑니다.
Fetch, Decode, Execute, Wrtie Back하죠
이 그림처럼요!!ㅋㅋㅋㅋ
근데 여기에 생소한 것이 하나 보이시죠??
바로 Interrupt Request Bit입니다.
이 친구는 평소에는 사이클이 그냥 돌도록 놔두다가
다음과 같이 I/O 작업이 들어오면,
Interrupt request Bit가 걸려서, CPU 사이클이 원래대로 돌지 않고,
프로그램 카운터 레지스터에 인터럽트 핸들러의 새로운 주소를 저장합니다.
그럼.. 그 다음 명령어는 인터럽트 핸들러에서 Fetch하게 되겠죠??
인터럽트는 다음과 같이 Interrupt Request Bit를 통해 작동합니다.
1. PIC (Programmable Interrupt Controller)
근데, 방금 디스크와 Interrupt Request Bit 사이에 처음 보는 친구가 있었죠??
Programmable Interrupt Controller, 줄여서 PIC라고 읽습니다.
그냥 디스크나 프린터에서 바로 Interrupt Request Bit로 쏴주면 안돼??? 라고 하실 수 있겠지만,
사실 우리가 한번에 하나의 하드웨어 장치만 사용하는게 아니잖아요???
동시에 여러개의 요청이 들어올 수도 있기 때문에, PIC로 요청 관리가 필요합니다!
어떻게 관리하느냐..!
이 그림을 보면서 하나씩 설명해드릴게요!!
(1) IRQ line
가장 먼저 맨 위의 Interrupt Request Line(IRQ Line)를 통해 요청이 들어오게 됩니다.
interrupt vector 번호를 장치에 할당합니다.
각각의 IRQ Line은 index를 가지는데, 몇번째 index 라인이냐에 따라서 interrupt vector 값이 나오게 됩니다.
어떤 기기의 요청인지 vector 번호로 파악하는거에요!
맨 아래 Vector도 나가는거 보이시죠??
(2) IMR (Interrupt Request Register)
IMR은 장치들을 마스킹하는 역할을 합니다.
즉, 특정 장치가 인터럽트를 발생 시키도록 두거나, 발생하지 않도록 프로그래밍하여 관리할 수 있는거죠!!
딱 이정도 역할입니다!
(3) IRR (Interrupt Mask Register)
IRR에서는 IMR에서 마스킹되지 않은 장치들만 요청을 할 수 있게 해주는 장치인데,
인터럽트가 처리되기 전 보류, 저장되는 역할입니다.
(4) PR (Priority Register)
인터럽트 요청의 우선순위를 지정하고, 우선순위가 가장 높은 요청 순대로 처리되게 해주는 역할을 해요!
CPU는 이 IRR을 검사하여 서비스할 인터럽트 요청을 결정하는거죠ㅎㅎ
(5) ISR (Interrupt Service Routine)
이 친구는 인터럽트가 수신될 때 실행되는 루틴입니다!
인터럽트 서비스에 필요한 작업을 하는 친구라고 하는데.. 이 친구가 정확히 뭘 하는 애인지 잘 모르겠네요...
아마 인터럽트에 맞춰서 PIC 안의 레지스터에서 read write하거나 그때 그때 필요한 작업을 해주는 친구 같은데...
아시는 분은 댓글 부탁드립니다..!
자 지금까지를 정리해보면...
Masking되고, Priority 검사를 통과한 장치 Vector 넘버와 Interrupt가 CPU에 Request로 날아갑니다.
그리고 Interrupt Request Bit을 설정하면,
CPU가 일을 처리한 다음,
ACK(처리 완료했다는 신호)를 PIC로 보냅니다.
ACK를 PIC가 기다리는 이유는 한번에 여러 요청을 처리할 수 없기 때문에
PIC가 ACK가 올 때 까지 다른 장치 요청을 받지 않고 대기하고 있어야 하기 때문이죠!!!
4. 멀티 프로세스 환경에서의 인터럽트 처리
방금까지는 CPU가 하나여서 한번에 하나의 요청밖에 처리 못했지만...
요즘은 멀티 프로세스 시대잖아요?? 맥북 M1 pro만 봐도 10코어니까요..!!!
여기서 사용되는 것이 APIC입니다.
모든 I/O장치들이 Multi APIC에 요청하고, 이 Multi APIC는 아까 봤던 PIC와 비슷한 역할을 합니다.
그리고 각각 CPU에 달려있는 Local APIC는 timer가 달려있어서 정기적으로 인터럽트를 걸어주는 역할만 합니다.
자, 이런 환경에서 효율적으로 인터럽트를 처리해주는 방법이 두가지 있는데
SMP와 AMP입니다!!!
하나씩 설명할게요!
1) SMP(Symmetric Multiprocessing)
번역하면 대칭형 멀티 프로세싱 방식으로, 모든 CPU가 비슷한 양으로 인터럽트 처리를 하기를 바라는 시스템입니다.
각각의 프로세스가 독립적으로 작업을 처리하는데, APIC가 어떤 프로세스가 Interrupt를 처리할지 고릅니다.
이 고르는 기준은 두가지를 사용하는데 하나는 정적, 하나는 동적인 방식이에요!
정적인 방식인 Static Distribution은 그냥 이미 만들어진 static table을 통해 정해진 곳에 보내기만 하는 방식이고..
반면에 동적 방식인 Dynamic Distribution은 로드밸런싱 알고리즘을 사용하는데,
우선순위가 낮은 프로세스를 돌리는 CPU에게 요청을 보내는 거에요!!
그리고 인터럽트 카운터라는게 있는데, 각각의 CPU코어가 처리한 인터럽트 수를 세서, count가 적은 곳에 인터럽트를 보내는 방식도 함께 사용합니다ㅎㅎ 좀 무섭죠? 내가 일한 양을 체크하고 있다니...
CPU 부하가 이미 균등할 때는 count 방식을 사용하고, 특정 CPU에 부하가 좀 치우쳤다 싶으면 Dynamic Distribution의 로드밸런싱을 사용해서 부하를 분산시킨다고 합니다ㅎㅎ
참고로 전 iOS 개발자인데... iOS는 이 SMP를 사용하더라고요!
2) AMP(Asymmetric Multiprocessing)
다음은..! 비대칭형 멀티 프로세싱입니다..!!
이 친구는 특정 인터럽트 처리가 특정 프로세스에만 할당 되는 인터럽트 처리 방식이에요!
모든 CPU에 PIC를 가지고 있으며, CPU마다 자신이 담당하는 인터럽트를 정해놓고 그 인터럽트만 처리하는거죠..!
모든 CPU에 PIC가 있고 해당하는 인터럽트를 다이렉트로 처리하기 때문에,
다른 프로세스가 인터럽트를 처리하는지랑 상관없이 병렬로 처리할 수 있습니다ㅎㅎ
근데...
이 방식은 로드밸런싱이 잘못되면.. 즉, 처음에 담당할 때 배분이 잘못되면 특정 CPU에 부하가 엄청 걸리게 되고,
만약 해당 CPU가 망가지면 그 CPU가 처리하는 인터럽트는 하나도 처리할 수 없기 때문에
대형 서버가 아니라면, 원래는 AMP를 사용하다 현재는 SMP를 사용한다고 하더라고요..!!!
처음으로 다른 이야기 안하고 깔끔하게 운영체제만 정리한 것 같은데... 어렵지 않으셨죠???
읽으시느라 수고하셨슴당~!!
'운영체제' 카테고리의 다른 글
[운영체제] Linux의 CPU 스케줄링 (CFS 알고리즘)을 파보자! (4) | 2023.02.08 |
---|---|
[운영체제] 프로세스 생성(fork)을 파보자! (3) | 2023.02.06 |
[운영체제] System Call(시스템콜)을 파보자! (7) | 2023.02.04 |