안녕하세요~ 개발자 배씨입니다 :) ㅎㅎ
자! 오늘은 인터럽트가 무엇인지에 대해서 알아볼려고 해요~
해당 주제를 어떻게 정리해야할 지 정말 까다로워서 며칠을 고민하고 수정했답니다.
또한, 이 주제에서는 조~~~~금 용어가 많이 나오니까 목도 푸시고~ 기지개도 한번 쫘악 피시고 정신 가다듬고 천천히 따라오세요! 들어갈게요~
인터럽트가 무엇일까요???
입터럽트는 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 일시 중단하고, 발생된 상황을 우선 처리한 후 실행중이던 작업으로 복귀하여 계속 처리하는 것을 말해요!
말이 좀 길죠? ㅎㅎ 이해가 잘 되진 않을겁니다.
다만, CPU가 어떠한 프로세스를 수행중이다가 갑자기 인터럽트라는 신호가 발생되면 하던일을 중단하고 다른 무언가를 처리하라는 느낌이라는 감은 잡으셔야 합니다!
인터럽트에는 외부 인터럽트 / 내부 인터럽트가 있어요 ~
일단 외부,내부가 있다정도만 기억만 해두고 바로 다음 내용 읽어봐요
여러분들이 지금 두들기는 키보드나 딸깍딸깍 클릭하는 마우스 그리고 화면이 보여지는 모니터 등은 외부 장치라고 불러요~ 그럼 외부장치의 반대말인 내부장치는 뭐가 있을까요? 그쵸! CPU 그리고 메인메모리가 해당돼요~
이렇게 키보드, 마우스, 모니터 등과 같은 외부 장치들을 입출력 장치(I/O 장치) 라고 불러요!
그리고 디스크도 포함이죠.
근데 왜 디스크가 포함이냐? 컴퓨터 내부에 저장되어 있는데 왜??? 라고 물어보실수 있어요.
디스크에서 내용을 읽어서 컴퓨터 내부에서 어떤 연산을 한 후 디스크에 데이터를 저장했다면 컴퓨터 입장에서도 입출력이 일어났다고 보기 때문에 입출력 장치에 속해요~
자! 지금부터 용어 들어갑니다~
하드웨어 장치 마다 "컨트롤러"라고 불리는 작은 CPU가 붙어있어요~
그러면 메모리에도 컨트롤러가 붙어있고 디스크에도 컨트롤러가 붙어있겠죠??
즉, 메모리를 제어하는 컨트롤러는 메모리 컨트롤러고 , 디스크를 제어하는 컨트롤러는 디스크 컨트롤러인거죠.
그리고 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리를 가지고 있는데 그것을 로컬 버퍼라고 불러요.
컨트롤러~ , 로컬 버퍼 ~ 기억합시다
예를들어서, 디스크에서 데이터를 읽어오는 작업을 하고 있다고 가정해봐요.
그러면 디스크 컨트롤러가 디스크에서 내용을 읽어서 로컬버퍼에 저장해요. 이때 로컬 버퍼로 읽어오는 작업이 끝났는지를 메인 CPU가 지속적으로 체크하는 것이 아니라 장치에 있는 컨트롤러가 인터럽트 신호를 발생시켜 CPU에 전달하는거에요.
정확히 말씀드리자면 CPU 옆에 인터럽트 라인이라는 친구가 있는데 그 친구한테 인터럽트 신호가 들어오는거에요
그니까~ CPU는 "따라라라라락~~따라라라락~~" 속도로 명령어 하나하나 처리하는데 인터럽트 라인에 신호가 들어왔는지도 계속 체크를 하고 있어요. 그러다가 갑자기 인터럽트 라인에서 "인터럽트 발생! 인터럽트 발생!" 이러면 CPU가 하던 일을 멈추고 해당 인터럽트를 처리하러 가야하는 거죠!
이렇게 컨트롤러 등 하드웨어 장치가 인터럽트 라인을 세팅하고 CPU에게 이를 통보하는 방법을 외부 인터럽트라고 말합니다.
내부 인터럽트는 하드웨어 장치가 신호를 보내는 것이 아니라 소프트웨어가 인터럽트 라인을 세팅 하는 거에요~
즉, CPU가 명령어를 수행하고 있다가 자신이 처리할 수 없는 명령이면 자기 자신한테 인터럽트를 거는거죠!
암튼! 이렇게 내부 인터럽트든 외부 인터럽트든 일단 인터럽트가 발생하면 CPU는 하던 일을 멈추고 운영체제 커널 내에서 해당 인터럽트의 처리를 위해 정의된 코드를 찾으러 가요. 아래 그림을 보면서 설명드릴게요 !
운영체제 커널에서는 인터럽트가 들어왔을 때 이미 해야할 일을 운영체제 개발자가 미리 프로그래밍해서 커널 내에 포함 시켜뒀어요.
인터럽트가 발생하면 CPU는 운영체제에게 제어권을 주고 커널 영역 내에서 해당 인터럽트의 처리를 위해서 정의된 코드를 찾아요. 운영체제는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터라는 놈을 가지고 있는데 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조에요
실제 처리해야 할 코드는 인터럽트 처리루틴( ISR : Interrupt service routine ) 또는 인터럽트 핸들러(interrupt handler)라고 부릅니다. 인터럽트 처리루틴은 여러가지 인터럽트에 대해 각각 처리해야 할 업무들을 정의해놓은거죠.
그리고 처리해야 할 업무가 완료되면 다시 인터럽트 발생하기 전에 수행하고 있었던 프로세스로 다시 돌아오는 거랍니다.
자~ 이제 인터럽트의 종류에 대해서 다시 자세히 살펴 볼거에요!
인터럽트는 크게 외부 인터럽트 (하드웨어 인터럽트), 내부 인터럽트 (소프트웨어 인터럽트)로 나뉜다고 했었죠?
외부 인터럽트 (=하드웨어 인터럽트)
외부 인터럽트에는 타이머 인터럽트, I/O 인터럽트, 전원 이상 인터럽트가 있어요!
1. 타이머 입터럽트
제가 지금까지 "CPU가 A 프로세스의 명령어를 수행하다가 시간이 다 돼서 B 프로세스로 문맥교환이 일어난다~"
이런식으로 문맥교환을 제한된 시간으로 언급하면서 설명드린 적이 되게 많았어요! 그게 이겁니다! 타이머 인터럽트요!!
즉, CPU한테 각 프로세스를 수행할 수 있는 제한된 시간이 주어져있답니다~
CPU가 특정 프로세스의 명령어를 수행하고 있는데 그 프로세스가 좋다고 그 프로세스만 수행하면 안되겠죠? 다른 프로세스도 있는데 편애하면 안된다는 거에요. 그래서 제한된 시간이 지나면 다른 프로세스에서도 수행이 되게끔 인터럽트를 거는거에요. 입출력 장치 중에 타이머라는 친구가 있는데 그 친구가 일정 시간이 지나면 CPU한테 "야야! 이제 다른 애도 수행시켜" 이러는 거죠.
타이머 인터럽트는 보통 10ms마다 인터럽트를 걸어서 다른 프로세스로 문맥교환이 일어납니다!
10ms가 몇초냐면 0.01초 인거죠. 그니까 0.01초마다 프로세스의 문맥교환이 일어난다라는 거에요
2. I/O 인터럽트
I/O 인터럽트는 아까전에 언급했었던 입출력 장치에 의해서 일어나는 인터럽트인거에요~ 키보드로 무슨 작성을 하거나, 프린터에서 출력을 한다던가 마우스 커서를 움직이던가 등 여러 상황이 있을거에요
이러한 작업에서 해당 인터럽트가 발생한답니다.
즉, CPU는 고급 인력이기 때문에 만약 입출력 장치의 수행이 필요하다면 걔네들 보고 처리하라고 하고 자기는 다른 일을 처리하고 있다가 수행이 완료되면 그때 각 장치의 컨트롤러가 인터럽트 신호를 보내는 거죠~
잘 이해가 안될 거 같아서 아래의 예시를 보죠~
[마우스 커서 움직일 때]
- 마우스를 움직이면 CPU에 전기신호(인터럽트)를 보내준다.
- CPU가 인터럽트를 감지하면 현재 작업을 중단한다.
- 그리고 OS내부에 있는 Mouse Interrupt Service Routine으로 점프한다.
- Mouse Interrupt Service Routine은 커서를 이동시킨 좌표를 모니터상에 표현해주는 역할을 한다.
[마우스를 더블 클릭한 경우]
- 마우스를 더블클릭하면 CPU에 전기신호(인터럽트)를 보내준다.
- CPU가 인터럽트를 감지하면 현재 작업을 중단한다.
- 그리고 OS내부에 있는 Mouse Interrupt Service Routine으로 점프한다.
- Mouse Interrupt Service Routine은 커서가 더블클릭한 좌표에 있는 아이콘(프로그램)을 실행한다.
- 즉, 디스크에서 찾은 다음 메모리에 올린다.
3. 전원 이상 인터럽트
여러분들이 컴퓨터를 하고 있다가 갑자기 전원 공급이 중단되면 CPU에 인터럽트를 걸어서 현재 작업 중이던 프로세스를 대피시킬 수 있도록 하는 신호를 걸어줘야해요. 이것을 전원 이상 인터럽트라고 한답니다 ㅎㅎ 간단하죠??
내부 인터럽트 (=소프트웨어 인터럽트)
내부 인터럽트의 예로는 Exception(예외) 인터럽트와 SVC 인터럽트가 있어요~
1. Exception 인터럽트 (Trap)
예외 많이 들어보셨죠?? 보통 트랩이라고도 많이 불리는 인터럽트에요~
대표적으로 0으로 나누는 비정상적인 작업을 시도하거나, 오버플로우/ 언더플로우와 같이 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 처리하는 인터럽트인거에요! 이럴때는 CPU가 수행할 수가 없잖아요! 이와 같은 경우에 Exception 인터럽트가 발생한답니다!
즉, CPU가 명령어를 수행하다가 처리할 수 없는 예외상황을 만나면 자기 자신을 인터럽트 걸어서 커널의 처리루틴으로 가는거죠~
2. SVC 인터럽트
Supervisor Call 이라는건데 운영체제를 호출해서 처리하라는 의미입니다.
[운영체제와 정보 기술의 원리] 라는 책에서는 시스템 콜이라고 정의되어있는데 같은 맥락이라고 생각하시면 될거 같아요! 이전 포스팅에서 시스템 콜에 대해서 배웠었죠?
그때 예시로 들었었던게 사용자 프로그램에서 "open("a.txt") " 라는 명령어가 들어왔을 때 사용자 프로그램이 처리할 수 없잖아요! 이때 운영체제 내부에 정의된 코드를 실행해야해서 커널모드로 전환을 해야한다고 말씀드렸어요~
즉, 운영체제에 서비스를 요청하기 위해 인터럽트를 걸고 커널모드로 전환하는 인터럽트인거죠!
이제 마지막 내용입니다~
인터럽트 발생하면 제가 뭐라고 했었죠?? CPU가 처리하고 있던 작업을 잠시 내려놓고 인터럽트 처리하러 간다고 했었죠? 그러면 어떻게 해야겠어요?
그쵸 처리하던 작업을 어딘가에 저장해놔야죠.
예를 들어, A 프로세스를 수행중이다가 인터럽트가 딱 걸리면 그 프로세스에 대한 정보를 PCB 에 딱!! 저장하는거죠!!
운영체제 1편에서 제가 PCB를 설명드렸잖아요! 그거인거죠
혹여나 기억 안나신 분들은 아래 링크에 들어가셔서 PCB가 무엇인지만 보고 오세요~
지금까지 배웠던 내용을 스토리라인으로 총 정리하고 포스팅을 마무리 짓겠습니다!
(... CPU는 프로세스 처리중 ...)
'띠리릭~ 띠리릭~ 인터럽트 발생 띠리릭~ 인터럽트 발생'
인터럽트 라인 : "이봐 CPU야! 인터럽트 발생했어 어떡해 ㅠㅠ "
CPU : " 훗.. 가만히 있어 우리한테는 운영체제가 있잖아~ 운영체제야 도와줘"
운영체제 : "그래 내가 도와줄게! 일단 처리하던 프로세스를 PCB에 저장 하고, 음 보자.. 이 인터럽트의 번호는 이거인거 같군. 일단 인터럽트 벡터 테이블로 찾아가야겠다. "
(잠시후)
운영체제 : " 인터럽트 벡터야~ 나 번호 들고 왔는데 이거 어떻게 할까?? "
인터럽트 벡터 : "응 잠시만... 아! 이건 A라는 인터럽트 처리루틴이 해결할 수 있는거네~ 내가 거기 주소지 줄테니까 거기 찾아가서 걔한테 처리하라고 하면 돼"
(... 인터럽트 처리루틴에서 처리 중...)
인터럽트 처리루틴 : " 휴~ 처리 끝났다~ 야 운영체제 너가 처리하라고 한거 다 처리했어 "
운영체제 : " 그래? 그럼 아까 PCB에 저장했던 정보를 CPU 한테 다시 갖다 줘야지~ CPU야 여기 프로세스 정보~줄게 "
CPU : " 응 어디까지 수행했더라~ 아 PC(ProgramCounter) 보니까 여기 명령어 수행하다가 멈췄네. 여기서부터 수행해야지"
1. 인터럽트 요청 |
2. CPU가 처리하던 프로세스 중단 |
3. 현재 실행 중인 프로세스 상태 PCB에 저장 |
4. 인터럽트 원인 판별 |
5. 인터럽트 처리 루틴 (ISR ) 처리 |
6. 상태 복구 |
7. PCB에서 정보 가져오기 |
8. 명령어 수행 |
어려운 주제였고 이해가 잘 되셨을진 모르겠지만 여기까지 읽느라고 고생많으셨습니다 ㅎㅎ
다음주에는 무엇을 배울거냐~
프로세스는 독립적인데 어떻게 자원을 공유할 수 있냐는 의문점을 제가 언급한 적이 있었죠?
운영체제 8편에서는 프로세스끼리 통신하는 방법에 대해서 알아보겠습니다 ㅎㅎ 감사합니다 :)
'남이 읽는 CS > 운영체제' 카테고리의 다른 글
[운영체제 9편] 스케줄링 종류 (5) | 2022.04.13 |
---|---|
[운영체제 8편] IPC란 무엇인가 (4) | 2022.04.13 |
[운영체제 6편] 유저모드 커널모드 (3) | 2022.04.03 |
[운영체제 5편] 데드락이 무엇인가 (4) | 2022.03.22 |
[운영체제 4편] 세마포어가 무엇인가 (5) | 2022.03.15 |
댓글