알쓸코지
article thumbnail
Published 2024. 4. 19. 06:34
[OS] Interrupt와 Context Switching CS

인터럽트(Interrupt)란?

CPU가 어떤 일을 수행하던 중, 예상치 못한 외부에서 발생한 이벤트로 인해 프로세스를 잠시 중단시키는 것

  • 인터럽트가 발생하면 현재 실행 중인 프로세스나 프로그램이 멈추고, `해당 인터럽트를 처리하는 루틴(인터럽트 핸들러 루틴)`이 실행된다.
  • 인터럽트는 키보드, 마우스 등 I/O 디바이스로 인한 인터럽트, 0으로 숫자를 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생한다.

 

인터럽트의 종류

  • 동기 인터럽트(예외)
    • CPU에 의해 발생하는 인터럽트로, CPU가 예기치 못한 상황을 접했을 때 발생한다.
  • 비동기 인터럽트(하드웨어 인터럽트)
    • 주로 입출력 장치에 의해 발생하는 인터럽트로, 입출력 작업 도중에도 효율적으로 명령을 처리하기 위해 사용한다.
    • 알림과 같은 인터럽트

 

명령어 사이클(Instruction Cycle)

CPU가 하나의 명령어를 처리하는 흐름에는 정해진 흐름이 있고, CPU는 그 흐름을 반복하여 명령어들을 처리한다. 이렇게 하나의 명령어를 처리하는 정형화된 흐름을 `명령어 사이클`이라고 한다.
  • 실행하는 프로그램은 수많은 명령어로 이루어져 있는데, CPU는 프로그램을 실행한 순간부터 프로그램이 중단될 때까지 명령어를 하나씩 수행해 나간다.
  • 즉, 프로그램 속 각각의 명령어는 `인출`, `간접`, `실행`, `인터럽트` 사이클이 반복되며 실행된다.

 

인출(Fetch) 사이클

CPU는 메모리에서 다음에 실행할 명령어를 하나 읽어온다.

실행(Execute) 사이클

가져온 명령어를 실행하는 단계

  • CPU가 명령어 코드를 해독하고, 그 결과에 따라 필요한 연산을 수행한다.
  • `명령어`는 `연산 코드`와 `오퍼랜드`로 구성된다.
    • `연산 코드`: CPU가 수행할 연산의 종류
    • `오퍼랜드`: 명령어 실행에 필요한 데이터 또는 데이터의 주소

  • CPU가 수행하는 연산들의 종류
    • 데이터 이동: CPU와 기억장치 간 혹은 I/O 장치 간에 데이터를 이동
    • 데이터 처리: 데이터에 대하여 산술 혹은 논리 연산을 수행
    • 데이터 저장: 연산 결과 데이터 혹은 입력장치로부터 읽어 들인 데이터를 기억장치에 저장
    • 프로그램 제어: 프로그램의 실행 순서를 결정
프로그램을 이루는 수많은 명령어는 일반적으로 `인출`과 `실행` 사이클을 반복하여 실행한다.

간접(Indirect) 사이클

실행 사이클 전에 추가적인 메모리 접근이 필요할 경우 발생함

  • 명령어의 `오퍼랜드(operand)`가 간접 주소 지정 방식인 경우에 유효 주소를 계산하기 위해서 메모리에 접근하는 단계
  • `간접 주소 지정 방식`은 오퍼랜드 필드에 유효 주소의 주소를 명시한다. 이런 경우 명령어를 인출하여 CPU를 가져왔다 하더라도 바로 실행 사이클에 돌입할 수 없다. 명령어에 실행하기 전에 메모리 접근을 한 번 더 해야하기 때문이다.

인터럽트(Interrupt) 사이클

CPU가 현재 실행 중인 프로그램을 중단하고 외부 이벤트에 대응하기 위해 인터럽트를 처리한다.

  • CPU가 현재 실행 중인 작업을 중단하고 `인터럽트 서비스 루틴`으로 이동하여 해당 이벤트를 처리한다.
    • `인터럽트 서비스 루틴(ISR)`은 `인터럽트 핸들러`라고도 하며, 인터럽트를 처리하기 위해 수행하는 프로그램 루틴이다.
  • `CPU가 인터럽트를 처리한다`라는 말은, `인터럽트 서비스 루틴`을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다라는 것을 뜻한다.
  • 인터럽트를 처리하는 방법은 입출력 장치마다 다르므로 각기 다른 서비스 루틴을 가지고 있다.
  • CPU는 수많은 ISR을 구분하기 위해 `인터럽트 벡터`를 이용한다.
    • `인터럽트 벡터`: ISR를 식별하기 위한 정보
    • 인터럽트 벡터를 알면 ISR의 시작 주소를 알 수 있다.
    • CPU는 인터럽트 벡터를 통해 특정 서비스 루틴을 처음부터 시작할 수 있다.

  • CPU가 작업을 수행하는 도중 키보드 인터럽트가 발생한 경우라면, CPU는 인터럽트 벡터를 참조하여 키보드 ISR의 시작 주소를 알아내고, 시작주소부터 실행해 나가며 키보드 ISR를 실행한다.

 

컨텍스트 스위칭(Context Switching)

한 프로세스가 실행되는 도중에 다른 프로세스가 실행되도록 프로세스의 상태를 저장하고 복원하는 것

  • `Context`: CPU가 해당 프로세스를 실행하면서 가지는 정보 ➡️프로세스의 PCB에 저장된다.
  • 인터럽트는 컨텍스트 스위칭을 트리거하고, CPU가 다른 프로세스로 전환되어 다음 작업을 수행하도록 한다.
  • 너무 잦은 컨텍스트 스위칭은 오버헤드를 초래한다.

컨텍스트 스위칭이 발생하는 인터럽트

  • 입출력 요청이 왔을 때
  • CPU 사용 시간이 만료되었을 때
  • 자식 프로세스를 만들 때
  • 인터럽트 처리를 기다릴 때

 

Ref

https://nostressdev.tistory.com/17

https://www.youtube.com/watch?v=3Yz7OnVUM28

https://velog.io/@kikahy/%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8

https://yz-zone.tistory.com/66

https://rebugs.tistory.com/189

 

 

'CS' 카테고리의 다른 글

[OS] 접근 통제 정책  (0) 2024.06.18
[OS] 리눅스 파일 시스템  (0) 2024.06.11
[OS] Swapping과 Paging  (0) 2024.06.04
[OS] 뮤텍스와 세마포어  (0) 2024.05.12
[OS] 스레드 풀(Thread Pool)  (0) 2024.04.26
profile

알쓸코지

@chocoji

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!