운영체제의 시점에서 본 명령어 처리 과정 (인터럽트)

MinHwi·2022년 5월 3일
0

OS

목록 보기
2/6

이 포스팅은 숙명여자대학교 김주균 교수님의 운영체제 강의를 바탕으로 작성되었습니다. 자세한 내용은 OS? Oh Yes! 누워서 보는 운영체제 이야기를 참고하세요. (누워서 볼 만한 책은 아닙니다 하지만 쉽게 쓰여진 책은 맞음)

명령어 처리 과정

여기서 처리되는 명령어는 하나의 어셈블리 수준의 명령어이다.

  1. Fetch
  • 메인 메모리에 있는 명령어를 읽어 처리기에 있는 레지스터로 가지고 오는 과정.
  • PC에 저장된 명령어 주소가 이용된다.
  • 현재 처리중인 명령어는 IR(명령어 레지스터)에 저장한다.
  1. Decode
  • 명령어를 해석한다.
  • Control Unit에 의해 IR에 있는 OP code가 decoding 된다.
  • decoding을 통해 연산의 종류, 데이터 및 목적지의 위치 등을 파악하게 된다.
  1. Operand Fetch
  • decoding 결과에 따라 필요한 데이터(피연산자)를 메모리로부터 인출한다.
  1. Execute
  • 명령어를 처리한다.
  1. Interrupt 처리
  • 처리해야 하는 인터럽트가 있다면 처리하고, 그 다음 명령어를 읽는다.

컴퓨터 시스템 자원의 현 상태를 파악하는 방법

Polling

CPU가 일정한 시간 간격을 두고 각 자원들의 상태를 주기적으로 확인하는 방식이다. 자원이 폴링 신호를 받으면 자신의 상태를 적어놓을 수 있는 곳에 저장시키고, CPU는 폴링 때 그것을 읽어보는 방식이다. 비유하자면 교수님이 10분마다 학생들에게 질문 있니 물어보는 것이다.
이 방식은 사용되지 않는다. 단점이 크기 때문이다. 아무 일이 없어도 CPU는 폴링에 일정 시간을 들여야 한다. 각 자원은 직전 폴링 이후 변화된 자신의 상태를 다음 폴링 때까지는 알릴 수 없다.

Interrupt

각 자원들이 능동적으로 자신의 상태 변화를 CPU에 알리는 방식이다. CPU는 따로 시간을 들이지 않아도 되고, 자원들은 변화가 발생하면 즉시 알려 처리할 수 있다. 비유하자면 학생들이 질문 생길 때마다 교수님께 여쭤보는 것이다. 인터럽트 처리는 매우 자주 발생하므로 당연히 커널에 포함된다.

인터럽트의 종류

  • 하드웨어 인터럽트
    하드웨어 자원 즉, 장치 또는 주변 장치들로부터의 인터럽트
  • 소프트웨어 인터럽트
    • 트랩
      CPU 스스로 자신에게 인터럽트하는 경우. 실행 중인 명령어 때문에 생기는 일이므로 소프트웨어 인터럽트이다. 예를 들어 0으로 나누는 등의 명령어 오류
    • 시스템 호출
      입출력 명령어를 커널 모드에서 진행하는 경우. 즉, 사용자 모드에서 커널 모드로 전환하는 경우이다.

인터럽트의 처리 시기

  • 하드웨어 인터럽트는 현재 명령어 실행을 마친 후 처리된다.
  • 트랩은 실행 중에 처리되므로, 오류의 경우 프로그램의 종료를 가져온다.
  • 시스템 콜은 입출력이 완료되어야 실행 중인 명령어가 완료되고 다음 실행문으로 진행한다.

인터럽트의 처리 과정

CPU가 인터럽트를 확인하면 인터럽트 처리 루틴을 실행시켜야한다. 그전에 현 상태의 정보(레지스터 값)를 시스템 스택에 저장한다. 인터럽트 처리 루틴의 시작 주소를 PC에 넣고 실행한다. 루틴 실행이 끝나면 레지스터에 값을 복원하고, 프로그램의 실행을 계속 이어나간다. 여기서 현 상태의 정보를 임시로 저장해두고 다시 복원하는 과정을 문맥 교환이라고 한다.


인터럽트 처리 과정에서 레지스터 값들의 변화

  • (a) : 인터럽트 직전 상황
    • 메모리
      • 제어 스택 : 커널에 존재, PC 값과 범용 레지스터 값의 임시 저장소
      • 인터럽트 처리 루틴 : 커널에 존재
      • 사용자 프로그램 : 멀티 프로그램이라 여러개 존재. 일단 1개로 가정함.
    • PC : N+1 → N번째 명령어 실행 중
    • 범용 레지스터 : 실행 과정 중에 보관해야하는 값들
    • 스택 포인터 : T → 제어 스택의 Bottom이고, 임시 저장 전이므로 저장된 것이 없음
  • 인터럽트 처리 실행 중
    • 인트럽트 전의 레지스터 값들을 보존하기 위해 제어 스택에 저장한다.
    • 위의 그림에서 범용 레지스터가 4개이므로, T부터 하나씩 4개를 저장하면 T-5를 가리키게 된다. (이는 스택 구현에 따라 다르다)
    • PC에는 서비스 루틴의 시작 번지인 Y를 넣는다.
    • 서비스 루틴이 실행된다.
  • (b) : 사용자 프로그램이 다시 실행될 수 있는 환경(복구 이후)
    • 인터럽트 처리가 완료되면, 스택 포인터 T는 T-5를 가리키고 프로그램 카운터는 Y+L+1(처리 루틴 마지막 명령어의 다음 메모리)를 가리킨다.
    • 이제 인터럽트 처리 이전으로 PC와 스택 포인터, 범용 레지스터를 복구한다.
    • PC : Y+L+1 → 저장해두었던 기존 값 N+1
    • 스택 포인터 : T-5 → T (빠진만큼 조정됨)
    • 범용 레지스터 : 처리에 사용된 값들 → 저장해두었던 기존 값 abcd
profile
딩가딩가 백엔드 개발자

0개의 댓글