인터럽트 (Interrupt)

Labda-dev·2021년 11월 10일
6
post-thumbnail

친구에게 물었다.

"니가 마우스로 롤 아이콘을 더블 클릭해. 그럼 무슨 일이 일어날까?"

친구는 말했다.

"파일을 실행해"

과연 파일을 실행하는 과정에는 얼마나 다양한 일들이 일어날까?
일단 크롬으로 유튜브를 보고 있는 상황이라고 가정하고 시작해보자.

1. 마우스 이동

마우스와 같은 사용자의 입력 장치에 딜레이를 최소화하여 바로바로 반응하는 것은 꽤나 중요한 문제다.
딜레이가 길다면 PC를 사용하는 사용자 입장에서는 특히 한국인들은 답답함을 느낄 수 밖에 없을 것이다.
결국 마우스와 같은 입력 장치에 대한 처리(마우스 움직임을 커서에 반영하는 것)는 굉장히 우선순위가 높은 일 중 하나다.

따라서 마우스가 움직이게 되면 연결된 usb 케이블을 통해 cpu에게 '핫라인'으로 알리게 된다.

"빨리 하던거 멈추고 나부터 해줘! 급해!"

급하다는 알림을 받은 cpu는 일단 나중에 써먹기 위해 크롬의 '현재 상태를 저장(백업)'한다.
그리고 cpu가 가진 여러 개의 '핫라인' 중 몇 번째 핫라인에서 누구에게 알림이 온지 확인한다.
USB를 통해 마우스에게서 알림이 왔다는 것을 확인한 cpu는 '긴급 대응 매뉴얼'에서 'USB 마우스한테 알림왔을 때 대응 방법'을 찾고 실행한다.

그렇다면 'USB 마우스에게 알림왔을 때 대응 방법'에는 어떤 내용이 적혀있을까.
일단 USB를 통해서 마우스에게 '물어본다'.

"너 지금 뭐했어?"

마우스가 대답해온다.

"나 지금 오른쪽으로 X만큼 아래쪽으로 Y만큼 움직였어!"

그렇게 cpu는 마우스에게 (X, Y, 이동) 이라는 정보를 전달받았다.
전달받은 정보를 이용하여 모니터 픽셀에서 커서를 옮기라고 그래픽 카드에게 요청하게 된다.
그리고 아까 '상태를 저장(백업)'해뒀던 크롬의 상태를 다시 가져와서 유튜브 영상을 이어서 재생한다.


이러한 과정이 인터럽트(Interrupt)가 발생했을 때의 동작 과정이다!

각 파트의 실제 명칭을 이용하여 인터럽트에 대해 설명하면 다음과 같다.


1. 마우스가 움직이게 되면 연결된 usb 케이블을 통해 cpu에게 '핫라인'으로 알리게 된다.

마우스와 같은 입력 장치가 동작해서 그 동작이 Host PC에 반영해야하는 상황이 되면 IRQ(Interrupt ReQuest)가 발생하게된다.
IRQ는 cpu 칩에 존재하는 물리적인 IRQ 핀(Interrupt ReQuests line)에 전기 신호가 발생하는 것으로 cpu에 인터럽트 요청을 전달한다.

IRQ는 일반적으로 인터럽트 요청 자체의 의미와 물리적인 핀(장소)의 의미가 혼용되어 사용된다.

일반적인 범용 PC에서는 16개의 IRQ가 있으며 ps/2, Serial, COM 등 cpu 설계 과정에서부터 픽스된 케이스와 적절히 USB 등이 할당되는 예비용으로 비워둔 IRQ가 존재한다.

상기 케이스에서는 USB가 연결되어 있는 IRQ(일반적으로 IRQ9)에 전기 신호가 발생해 인터럽트 요청이 발생된다.

그렇다면 마우스는 어떻게 USB를 거쳐 cpu의 IRQ까지 어떻게 신호를 보낼 수 있을까?
해당 내용은 이 포스팅 마지막에서 아주 잠깐 간단하게 다루도록 하겠다.

2. 급하다는 알림을 받은 CPU는 일단 나중에 써먹기 위해 크롬의 '현재 상태를 저장(백업)'한다.

해당 내용은 아래 5번에서 함께 다룬다.

3. USB를 통해 마우스에게서 알림이 왔다는 것을 확인한 cpu는 '긴급 대응 매뉴얼'에서 'USB 마우스한테 알림왔을 때 대응 방법'을 찾고 실행한다.

'긴급 대응 매뉴얼'은 당연히 긴급하게 처리해야하는 대상과 각 대상에 맞는 적절한 대응 방법이 적혀있을 것이다.

마찬가지다.

'긴급 대응 매뉴얼'은 일반적으로 인터럽트 벡터 테이블(Interrupt Vector Table)이라고 불리며 '긴급 처리 대상'인 인터럽트의 유형과 '적절한 대응 방법'인 인터럽트 핸들러(Interrupt Handler)로 구성되어 있다.

인터럽트 핸들러는 ISR(Interrupt Service Routine)이라고도 불린다.

이러한 인터럽트 핸들러는 커널에 기본적으로 정의되어 박혀있거나 디바이스 드라이버 등을 통해 추가적으로 등록된다.
결국 IVT에 등록된 핸들러 중 발생한 인터럽트에 대해 적절한 인터럽트 핸들러를 실행시키게 되는 것이다.

4. 그렇다면 'USB 마우스에게 알림왔을 때 대응 방법'에는 어떤 내용이 적혀있을까.

자연스럽게 마우스로부터 받은 데이터의 유형에 따라 핸들러에서 적절하게 처리할 것이다.
상기 케이스의 경우에는 '마우스의 이동'에 대한 데이터를 수신했을 것이다.

그렇다면 마우스가 이동한 X, Y축 정보와 더불어 마우스의 감도, 마우스 가속 여부 등의 여러 정보를 종합하여 마우스가 이동할 픽셀을 계산할 것이고 계산된 픽셀만큼 커서를 이동시키도록 그래픽 작업을 GPU에게 요청하게 될 것이다.

5. 그리고 아까 '상태를 저장(백업)'해뒀던 크롬의 상태를 다시 가져와서 유튜브 영상을 이어서 재생한다.

이렇게 인터럽트 발생 시 상태를 저장하고, 인터럽트에 대한 처리가 완료되면 저장했던 상태를 불러와 이어서 실행한다.
이러한 '현재 상태 저장', '저장했던 상태 불러오기'를 컨텍스트 스위칭(Context Switching)이라고 부른다.

cpu를 점유하고 실행 중이던 Task(Process, Thread)의 현재까지 실행된 코드 위치(PC: Program Counter)를 비롯한 각종 레지스터의 값, Task의 우선순위 등의 각종 정보를 PCB(Process Control Block)에 저장한다.
그리고 변경할 Task(크롬)의 PCB를 읽어 cpu에 세팅하고 PC를 기준으로 이어서 실행시키게 된다.

2. 마우스 더블 클릭

더블 클릭 역시 마우스 이동과 다른 점이 거의 없다.
그저 인터럽트 핸들러 내부에서의 동작이 달라질 뿐이다.

마우스의 이동 정보를 받아 계산 후 커서를 이동시키던 기존 핸들러의 동작에 반해, 클릭이 눌렸음을 확인하고 다음 클릭과의 간격이 지정된 주기보다 짧은 경우 더블 클릭으로 인식할 것이다.

이후 지정된 커서 위치에 해당하는 파일의 정보(경로 등)를 가져온 후 해당 파일을 실행시키려 할 것이다.



마무리가 좀 붕 뜨는 느낌이 있는 것 같다.

음.. 어쨌든 다음 파트에서는 파일을 실행시키는 과정에 대해서 포스팅해보도록 하겠다!

끝!!!!


[+] 마우스에서부터 cpu의 IRQ까지는 어떻게 연결되어 있을까?

USB 마우스에서의 인터럽트는 USB 프로토콜에 기반해 Interrupt Transfer를 이용한 Polling mechanism이다.
폴링(Polling)은 사실 인터럽트의 반대되는 개념으로 인터럽트를 받을 cpu가 주기적으로 다음과 같이 확인하는 방식이다.

"혹시 내가 뭐 급하게 해야하는거 있어?"

위에서 실컷 인터럽트 설명을 하다가 왜 인터럽트가 아닌 폴링이냐고 묻는다면 USB 칩셋의 가성비를 위해 그렇게 설계됐다고 대답을 할 수 있겠지만, 이 부분에 대한 내용을 이 포스팅에서 다루기에는 적절하지 않을 뿐더러 내가 당당하게 글을 작성할만큼 아는 것도 아니다.

그러므로 이 글에서는 간단하게 개념만 알아보고 디테일한 동작은 직접 USB 구조 및 프로토콜, HID, Class Driver 등에 대해 공부해보자. ㅎㅎ

  1. USB라는 Bus에 다수의 주변기기들이 연결되어 있으며 해당 Bus를 컨트롤하는 USB Controller가 여러 주변기기를 적절히 제어한다.
  2. USB 컨트롤러는 각 주변기기들에 대해 정의된 폴링 빈도, 데이터 사이즈 등의 정보를 활용하여 지속적으로 폴링을 수행하여 인터럽트가 발생하는지 확인한다.
  3. 마우스 등의 HID 장치로부터 Interrupt Transfer를 수신하였다면 cpu와 연결된 IRQ에 전기 신호를 보내 인터럽트가 발생했음을 알리게 된다.
profile
아는거 없는 찌끄레기가 끄적끄적

1개의 댓글

comment-user-thumbnail
2021년 11월 17일

한 수 배우고 갑니다.

답글 달기