Basic CS(3)

WorldWannyWeb.·2021년 6월 12일
0

CS

목록 보기
3/7
post-thumbnail

2021-06-12

저번 포스팅에서 우리는 컴퓨터 실행모음집인 Program과 컴퓨터를 조작하도록 언어를 사용해 코드를 만들고 이를 전달해주기 위해 프로그램 언어를 사용해 작업해주는 Programming 그리고 실행중인 프로그램인 Process와 그 구성과 관리까지 알아보았다.

하우에붤, 쓰니는 프로세스와 밀접한 Thread에 대해 공부하기 전, InterruptContext Switching이라는 단어를 읽고 말았다..(끝없은 파도타기의 서막이었다.두둥-!) 이 포스팅의 주제가 결정되어버린 순간이었다. 방해? 문맥교환? 그게뭔데?!

(이번 포스팅은 Interrupt에 대해 설명하고 Context Switching은 다음 포스팅에서 설명하겠다.)

1. Interrrupt

쓰니가 학원이든 학교든 수업을 들었던 머나먼 옛날, 선생님이 칠판에 열심히 적어가며 수업진도를 나가고 학생들은 열심히 필기를 하고 있을때, 흔치 않치만 손을 번쩍 들고 질문을 하던 학생이 가끔 있었다.(물론 그 주인공은 나였던 적은 단 한번도 없다.) 진도를 나가던 선생님은 수업을 잠시 멈추고, 그 학생의 질문에 대답해주고, 다시 수업을 이어나갔다. 질문한 학생의 행동을 우리는 'Interrrupt' 라고 볼 수 있다.

1-1.Interrupt란?

먼저, Interrupt의 사전적 정의에 대해 알아보자.

마이크로프로세서에서 인터럽트(interrupt)란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다. (출처 : 위키백과)

먼저, Interrrupt에 대해 알아보기 전에 마이크로프로세서가 먼저 눈에 들어온다. CPU가 프로세서라고 알고있는데 마이크로프로세서는 또 뭘까?

마이크로프로세서는 기계어 코드를 실행하기 위해 실행과정을 단계별로 나누어 처리를 위한 마이크로 코드를 작성하고, 이 마이크로 코드에 의해 단계적으로 처리하는 논리회로를 말한다. (출처:위키백과)

중앙 처리 장치(CPU)가 컴퓨터 전체 시스템의 위치와 입장에서 나온 말이라면, 마이크로프로세서는 동작 방식에서 나온 말로 서로 같은 것이다. CPU의 종류 중에 하나라고 생각하면 쉽겠다. CPU 중에서도 전자부품과 반도체칩을 하나의 칩에 내장된 형태이다.

정리하자면, 인터럽트란 컴퓨터 프로그램이 작동중에 예기치 않은 문제가 발생했을 때, 이 문제를 해결하고 원래 수행하던 프로그램을 다시 수행하도록 만드는 메커니즘이다. 여기서 '예기치 않은 문제'는 그 때마다 달라질 수 있다.

1-2. Interrrupt 처리과정

그럼 인터럽트가 어떻게 돌아가는지 간단히 예를 들어보자.

쓰니가 폰으로 네이버웹툰 모죠의 일지를 보고 있다가 실수로 전원 버튼을 눌러버렸다. 그러면 화면이 꺼지면서 대기 상태로 돌아가게 된다.

  • 전원을 눌러버렸다 : '예기치 않은 문제'이면서, 인터럽트를 발생시킬 수 있는 인터럽트 소스 (Interrupt source)가 될 수 있다.

프로그램이 모죠의 일지를 다시 띄우기 위해서 CPU는 아래와 같은 일을 한다.

  • CPU : "HEY 와이파이! 너네가 네이버웹툰에서 보내는 정보를 받아와서 GPU한테 전달해 줘! 그리고 GPU 너는 받은 data를 렌더링 해서 그림을 만들어 내고 display system에 디스플레이 data 보내라!"

이렇게 되면 GPU와 Display system이 열심히 화면에 그래픽 정보를 전달해 주고 있을 것이다. 이렇게 데이터 전송이 이루어지는 상황에서

전원 버튼을 누르게 되면, 데이터 전송을 멈추고 검은 대기 화면을 띄운다.
검은 대기화면을 띄우면 다시 전원을 키는 상태를 기다린다.
다시 전원 버튼을 누르게 되면 화면 잠금이 풀리고 다시 웹툰을 화면에 띄우게 된다.

이 과정은 아래 그림과 같이 돌아가게 된다.

먼저, 인터럽트 처리과정에서 언급될 단어들을 먼저 정리해보자

  • Interrupt Vector Table(인터럽트 벡터 테이블) : 인터럽트 요청과 함께 인터럽트 핸들러와 관련된 인터럽트 벡터들의 테이블이다. 인터럽트 벡터 테이블은 인터럽트 서비스 루틴의 시작 주소를 찾는 방법에서 사용된다. CPU가 인터럽트에 의해 인터럽트되면, 이것은 인터럽트 벡터 테이블의 인터럽트 핸들러를 보고 컨트롤을 그곳으로 이동시킨다.
  • Interrupt Handling(인터럽트 핸들링) : 인터럽트 발생장소, 원인을 파악하고, 인터럽트 서비스 즉, 인터럽트를 처리할 것인지를 결정한다.(처리 or 무시)
  • Interrupt Service Routine(인터럽트 서비스 루틴 ISR) : 인터럽트 처리동작
    (인터럽트 핸들러와 인터럽트 서비스 루틴을 위키백과나 다른 글에서는 구분하지 않고, 같은 의미로 사용한다. 이 둘을 인터럽트 처리기능으로 봐도 무방할 것 같다고 생각한다.)
  • Program Counter(PC) : 다음번에 실행할 명령어의 주소

인터럽트의 과정을 구체적이게 적어보면 아래와 같다.

① 프로그램은 CPU의 program counter (PC) 에 의해 명령어를 처리한다.
② 명령어를 하나씩 메모리에서 가져와서 실행한다.
③ Interrupt가 발생하게 되면, 커널이 개입해 프로세스를 중단시키고, 현재 수행하던 프로그램과 프로세서의 상태를 PCB에 저장한다(이를 Context Saving이라고 한다).
④ Interrupt Handling을 위해서 Interrupt Vector Table이 있는 Vector의 주소로 분기한다.
⑤ Interrupt Vector Table에서 ISR의 주소를 찾는다.
⑥ CPU의 제어를 ISR에게 넘긴다.
⑦ Interrupt Handler에서 Interrupt Handling을 거쳐 처리가 결정되면 ISR이 인터럽트 처리 동작을 수행한다.
⑧ 인터럽트 처리 동작이 완료되면 인터럽트 처리기가 다시 원래 수행하던 프로그램으로 Return한다.
⑨ 이전 상태로 프로그램과 프로세서 상태를 가져와서 수행하게 된다.
⑩ 명령어의 실행단계를 마칠 때마다 CPU는 반복적으로 인터럽트 요청이 있는지 계속해서 확인한다.

과정을 보다보면, Interrupt Handling이 인터럽트를 처리할지 말지를 결정한다 라고 되었는 것을 볼 수 있다. 여기서 우리는 인터럽트의 종류를 나눌 수 있다.

1-3. Interrupt의 종류

인터럽트를 크게 두가지로 나눌 수 있는데 사용하는 용어가 여러가지다. Hardware Interrupt / Software Interrupt 또는 Interrupt / Exception 또는 Asynchronous interrupt / Synchronous interrupt 로 사용되어지는데 쓰니는 그냥 다 합쳐서 사용하겠다.

(1) Asynchronous interrupt (비동기적) = Interrupt = Hardware Interrupt

I/O 장비(입출력)에서 아무때나 전달되어오는 신호이다. 보통 ‘인터럽트’ 라고 하는 것인데 I/O의 경우처럼 외부의 돌발적인 상황이 발생하였을 경우, CPU는 실행중인 작업들을 일시 중지하고 정해진 인터럽트 작업을 수행한다. 여기서 인터럽트를 처리할 수 도, 무시할 수 도 있다.

  • Maskable interrupt :
    Interrupt Mask(인터럽트가 발생하였을 때 요구를 받아들일지 말지 지정하는 것)이 가능한 인터럽트이다.
    CLI/STI 명령어를 사용해 무시될 수 있다.
    인텔 CPU에서 INTR pin 으로 신호가 들어온다.
    입출력 장치가 제기하는 인터럽트 요청과 거의 대부분의 인터럽트가 여기에 해당된다.
  • NMI(non-maskable interrupt) :
    Interrupt Mask 가 불가능한 인터럽트이다.
    무시될 수 없는 interrupt 이다. = 매우 중요한 interrupt
    인텔 CPU에서 NMI pin 으로 신호가 들어온다.
    몇몇 심각한 사건(정전, 하드웨어 고장 등 어찌할 수 없는 오류)등이 해당된다.

종류 :

  • 입출력 인터럽트(I/O interrupt) — 입출력 작업의 종료나 입출력의 오류에 의해 CPU의 기능이 요청되는 경우
  • 정전,전원이상 인터럽트(Power fail interrupt) — 정전이나 전원공급의 이상
  • 기계 착오 인터럽트(Machine check interrupt) — CPU의 기능적인 오류
  • 외부 신호 인터럽트(External interrupt) — I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우

(2) Synchronous interrupt (동기적) = Exception = Software Interrupt

CPU 내부에서 발생하는 신호들이며, 명령어를 실행하다가 만나게 되는 문제점들에 대해서 CPU가 스스로 발생시킨다. 보통 ‘Exception’ 라고 명시하며, 커널이 처리해야할 비정상적인 상황에 CPU가 대처하기 위한 작업들이다.예외처리는 항상 명령어와 동기화 되어 발생한다.
exception
프로세서가 감지하는 예외 : CPU가 명령어를 실행하다가 비정상적인 상황을 감지할 때 발생한다.
CPU가 예외를 발생시킬 때, 커널 모드 스택에 저장하는 EIP(CPU가 실행중이던 현재 주소) 레지스터의 값에 따라 3분류로 나뉜다.

  • Fault :
    발생한 사건을 복구하고 다시 재시작할 수 있는 상황에서 발생한다.
    stack에 저장된 EIP에는 fault를 발생시킨 해당 명령어를 가리키고,fault handler가 따라서 끝나고 복귀할 때는 해당 멍령어 다시 실행하게 된다.
    예) page fault
  • Trap :
    트랩을 발생시키는 명령어를 실행하자마자 발생한다.
    프로그램은 커널로부터 제어권을 다시 돌려 받은 후에 이어서 실행할 수 있다.
    프로그래밍에 의한 예외 : 프로그래머의 요청이 INT(interrupt), INT3 명령어에 의해 발생한다.
    INT라는 명령어는 소프트웨어에서 직접 예외처리하거나 인터럽트를 일으킬 수 있게 해주는 명령어이다.
    CPU는 이 예외를 Trap으로 처리한다.
    예) 디버깅 할때 braking point
  • Abort (중단) :
    심각한 에러(하드웨어 고장, 시스템 테이블에 잘못된 값이 들어가 있는 경우)로 인하여 더 이상 진행이 될 수 없는 상황에서 발생한다.
    stack 의 EIP에는 예외를 일으킨 정확한 위치를 저장하지 못하는 경우가 많아, abort 가 발생하였을 경우엔 문제가 발생한 프로세스를 강제로 종료되어야만 하는 상황이다.

종류 :

  • 프로그램의 오류에 의해 생기는 인터럽트.
  • 프로그램 검사 인터럽트(Program check interrupt)
  • 0 으로 나누기
  • OverFlow / UnderFlow 발생
  • 프로그램에서 명령어를 잘못 사용한 경우
  • 부당한 기억장소의 참조
profile
와니완의 월드와이드와니웹🐥

0개의 댓글