인터럽트

YangJiWon·2020년 9월 15일
0

인터럽트

배경

  • 만약 프로그램이 디스크에 데이터를 읽어오라는 명령을 보내고 로컬 버퍼에 데이터들을 모두 다 읽어오면 데이터를 모두 가지고 왔는지 확인을 해야 합니다.
    이 때, 메인 CPU가 일일이 체크하는 것은 성능 저하를 일으킵니다.

기능 및 정의

  • 그래서 CPU가 일일이 체크하지 않고 장치에 있는 컨트롤러가 인터럽트를 발생시켜 CPU에게 보고하게 됩니다.

  • 인터럽트 : 컨트롤러들이 CPU의 서비스가 필요할 때 이를 통보하는 방법을 말합니다.

  • CPU는 명령 하나를 수행할 때마다 인터럽트가 발생했는지를 체크하게 됩니다.
    인터럽트가 발생했다면 다음 명령을 수행하기 전에 인터럽트 처리를 하게 되고 그렇지 않으면 다음 명령을 계속 수행하게 됩니다.

  • 인터럽트는 키보드 입력 혹은 디스크에서 데이터를 다 읽어왔다는 등의 이벤트를 CPU에게 알려 줄 필요가 있는 경우 컨트롤러가 발생시키는 것입니다.

인터럽트의 일반적인 기능

인터럽트 처리 루틴

  • 운영 체제 커널 내에 있는 인터럽트 처리 루틴은 다양한 인터럽트에 대해 각각 처리해야 할 업무들을 정의하고 있습니다.

  • 예를 들어 로컬 버퍼에 장치가 해야할 일들을 모두 수행하고 원하는 데이터가 쌓였을 때, 로컬 버퍼에 있는 내용을 프로그램이 사용할 수 있도록 메모리로 전달하고, 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해둡니다.
    이것이 인터럽트 처리 루틴이 하는 일입니다.

인터럽트 종류와 인터럽트 수행 과정

  • CPU의 서비스가 필요한 경우, CPU 옆에 있는 인터럽트 라인에 신호를 보내서 인터럽트가 발생했음을 알려 주는 방식은 둘 다 동일합니다.

  • 다만, 하드웨어 인터럽트는 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅하는 반면 소프트웨어 인터럽트는 소프트웨어가 그 일을 수행한다는 차이점이 있습니다.

  • 인터럽트가 발생하면 CPU는 하던 일을 멈추고 인터럽트를 처리하기 위한 루틴(운영 체제 커널 내부 코드)에 들어가서 정의된 일을 찾게 됩니다.

  • 운영 체제는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터를 가지고 있습니다.
    인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 포인터로 가리키고 있는 자료 구조를 말합니다.
    실제 처리해야 할 내용은 인터럽트 서비스 루틴이라는 다른 곳에 정의됩니다.

인터럽트가 발생했을 때 메모리의 움직임

  • 인터럽트 서비스 루닡을 통해 해당하는 인터럽트 처리를 완료하고 나면 원래 수행하던 작업으로 돌아가 정지되었던 일을 계속해서 수행하게 됩니다.

  • 인터럽트 처리 후에 되돌아갈 위치를 알아야 하므로 인터럽트 처리 전에 수행중이던 작업이 무엇이었는지 반드시 저장해 두어야 합니다.

프로그램의 메모리 구조

  • 메모리 주소를 조사해 보면 크게 코드, 데이터, 스택 등의 영역으로 나뉩니다.

  • 스택이란 실행중인 함수에서 다른 함수를 호출한 경우 호출된 함수의 종료 후 원래 함수의 실행중이던 위치로 돌아가기 위해 복귀 주소를 저장하는 영역입니다.
    즉, 메인 함수에서 실행되다가 다른 함수를 호출하면 다음 명령을 수행하는 메모리의 위치가 바뀌게 됩니다.
    호출된 함수의 영역으로 점프해서 실행하기 때문입니다.
    호출된 함수를 모두 수행하고 나면 원래 함수의 수행되던 위치로 돌아가게 되는데 이 때 스택에 저장되어 있는 복귀 주소를 사용하게 됩니다.

  • 데이터 영역은 전역 변수 등 프로그램이 사용하는 각종 데이터가 저장되는 공간입니다.
    데이터 영역에 저장되는 전역 변수들은 동일 프로그램 내의 모든 함수들이 공유해 사용할 수 있습니다.

  • 코드 부분은 프로그래머가 작성한 코드가 기계어 명령 형태로 저장되는 영역입니다.
    CPU는 매 시점 코드 부분에 있는 명령을 하나씩 읽어와서 수행하게 됩니다.

profile
데이터데이터데이터!!

0개의 댓글