명령어 사이클은 무엇이고
인터럽트는 무엇일까?
명령어 사이클
--
CPU가 하나의 명령어를 처리하는 과정에는
정해진 흐름이 존재하는데
이렇게 정해진 흐름이 "명령어 사이클"이다.
즉, 프로그램 속에서 각 명령어들을 일정한 주기로 반복되며 실행되는데, 해당 주기를 의미한다.
명령어 사이클의 각 단계들
- 인출 사이클 (Fetch Cycle)
- 실행 사이클 (Execute Cycle)
- 간접 사이클 (Indirect Cycle)
이 외에도 해석 사이클(Decode Cycle), 쓰기 단계(Write Back Cycle) 등이 존재한다.
인출 사이클 (Fetch Cycle)
메모리에 존재하는 명령어를 CPU로 가져오는 단계를 의미한다.
실행 사이클 (Execute Cycle)
"인출 사이클"을 통해 CPU로 가져온 명령어를 실행하는 단계로,
CPU의 제어장치가 "명령어 레지스터"에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계를 의미한다.
간접 사이클 (Indirect Cycle)
일반적으로 프로그램은
수많은 명령어를 "인출 사이클"과 "실행 사이클"을 반복하여 실행된다.
즉, CPU는 프로그램 속에서 명령어를 "가져오고 실행하고"를 계속 반복한다.
하지만 모든 명령어가 위와 같이 간단하게 실행되는 것은 아니다.
예시로 명령어를 인출하여 CPU로 가져왔지만 바로 실행할 수 없는 경우가 있는데,
이는 "간접 주소 지정 방식"을 사용했을 경우 발생하게 된다.
간접 주소 지정 방식은
오퍼랜드 필드에 유효 주소를 명시하는 방식으로
명령어를 CPU로 인출했다고 하더라고 해당 주소에 바로 명령어가 존재하지 않고 또 다른 메모리 주소가 들어있기 때문에
다시 한번 메모리 접근을 해야 한다.
즉, 인출한다고 바로 명령어 CPU로 가져올 수 없고 다시 한번 인출해야 하기 때문에 위 그림처럼 계속 반복할 수 없는 경우가 생긴다.
이렇게 한 번의 메모리 접근으로 바로 실행할 수 없어서
다시 메모리 접근을 해야 하는 단계를 "간접 사이클"이라고 부른다.
--
인터럽트 (Interrupt)
--
인터럽트는
말 그대로 방해하는 것을 의미한다.
즉, CPU가 실행 중인 작업을 방해하는 신호를 "인터럽트"라고 부르며,
이로 인해 CPU의 작업이 잠시 중단될 수 있다.
인터럽트의 종류에는 크게 2가지가 존재한다.
- 동기 인터럽트 (Synchronous Interrupts)
- 비동기 인터럽트 (Asynchronous Interrupts)
동기 인터럽트 (Synchronous Interrupts)
동기 인터럽트는
CPU에 의해 발생하는 인터럽트다.
CPU가 명령어들을 실행하는 도중 예상치 못한 상황을 마주하는 경우 (오류와 같은 예외적인 상황)
발생하는 인터럽트를 "동기 인터럽트"라고 부른다.
그래서 이러한 동기 인터럽트를 "예외(Exception)"라고도 부른다.
예시 스토리
- CPU는 명령어 실행 중
- "어? 여기 왜 이러지.." (예외 발생)
- 실행 중인 명령을 잠시 중단하고 발생한 예외에 대해 처리 진행
비동기 인터럽트 (Asynchronous Interrupts)
비동기 인터럽트는
프로그램의 실행 흐름과 직접적인 연관이 없는 외부 이벤트에 의해 발생하는 인터럽트다.
주로 입/출력 장치에 의해 발생하는 인터럽트다.
CPU가 명령어들을 실행하는 도중 해당 과정과 무관한 외부의 이벤트가 발생하는 경우 (마우스로 클릭하는 상황)
해당 외부 이벤트로 인해 발생하는 인터럽트를 "비동기 인터럽트"라고 부른다.
예시 스토리
- CPU는 명령어 실행 중
- 갑자기 실행 중인 명령어와 무관한 외부로부터 키보드 입력이 발생 (외부 이벤트 발생)
- "어? 뭐야 하... 잠시 멈추고 저거부터 해결해줘야 했다"
- 실행 중인 명령을 잠시 중단하고 외부에서 발생한 이벤트를 처리 진행
일반적으로 "비동기 인터럽트"를 그냥 "인터럽트"라고 칭하기도 한다.
하드웨어 인터럽트
하드웨어 인터럽트는
외부 하드웨어 장치에서 발생하는 신호(이벤트)다.
즉, 외부 하드웨어 장치(입/출력장치)에서 발생하는 "비동기 인터럽트"를 "하드웨어 인터럽트"라고 부른다.
하드웨어 인터럽트는 "알람 기능"같은 느낌의 인터럽트라고 생각하면 편할 수 있다.
하드웨어 인터럽트를 사용하지 않는 경우
- CPU가 프린터 출력 명령어를 수행함
- 프린터 같이 입/출력장치는 CPU속도보다 매우 느리기 때문에 CPU는 해당 명령에 대한 결과를 바로 볼 수가 없음
- CPU는 언제 프린터 출력이 끝나는지 알 수 없기 때문에 주기적으로 프린터의 완료 여부를 확인해야 한다.
- 프린터가 완료 될 때까지 주기적으로 완료 여부를 확인해야 하므로 다른 일을 수행할 수 없음
- 즉, CPU 사이클 낭비 발생
하드웨어 인터럽트를 사용하는 경우
- CPU가 프린트 출력 명령어를 수행함
- 프린터가 완료된다면 "하드웨어 인터럽트" 발생하므로 해당 인터럽트가 발생하면 프린터가 완료되었다는 뜻
- CPU는 주기적으로 완료 여부를 확인하지 않아도 된다.
- 즉, CPU는 "하드웨어 인터럽트"가 발생하기 전까지 다른 일을 수행할 수 있다. (효율적)
하드웨어 인터럽트 처리 순서
- 입출력장치는 CPU에 "인터럽트 요청 신호"를 전달
- CPU는 실행 사이클이 끝나고 다음 명령어를 인출하기 전에 항상 인터럽트 여부를 확인한다.
- 이때 CPU는 인터럽트 요청을 확인 후,
"인터럽트 플래그"를 통해 현재 해당 인터럽트를 받아서 수행할 수 있는지 여부를 확인 - 인터럽트를 받아들일 수 있다면, CPU는 지금까지 수행한 작업을 백업한다.
- 그리고 CPU는 "인터럽트 백터"를 참조하여 "인터럽트 서비스 루틴"을 실행한다.
- "인터럽트 서비스 루틴" 실행이 끝나면 4번에서 백업해 둔 작업을 복구하여 이어서 실행 재개
인터럽트 요청 신호 (Interrupt Request Signal)은
하드웨어 장치가 CPU에 인터럽트를 요청할 때 보내는 신호다.
하드웨어 인터럽트와 동일한 용어인가 싶지만, 비유해서 설명하자면
- 인터럽트 요청 신호 : 하드웨어 장치가 CPU에게 인터럽트가 발생했으니 처리해 달라는 신호다.
- 하드웨어 인터럽트 : CPU가 하드웨어 장치에서 발생한 인터럽트를 처리하는 루틴을 의미한다.
즉, 인터럽트 요청 신호를 보내고 CPU가 "ok!! 처리 가능"하면 CPU가 하드웨어 인터럽트를 수행한다.
인터럽트 플래그 (Interrupt Flag)는
플래그 레지스터의 한 비트로,
인터럽트의 활성화 여부를 나타낸다.
즉, 인터럽트를 처리할 준비가 되어 있는지 여부를 나타내는 플래그다.
인터럽트 서비스 루틴 (Interrupt Service Routin)은
인터럽트를 처리하기 위해 CPU가 실행하는 특별한 함수 or 코드 블럭을 의미한다.
즉, 인터럽트를 처리하기 위한 프로그램으로
발생한 인터럽트에 따라 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램이다.
이는 "인터럽트 핸들러"라도고 부른다.
인터럽트 벡터 (Interrupt Vector)는
수많은 "인터럽트 서비스 루틴"을 구분하고 식별하기 위한 정보다.
(인터럽스 서비스 루틴의 주소들을 저장하는 데이터 모음)
각 인터럽트를 처리할 수 있는 수많은 인터럽트 서비스 루틴이 존재하는데
이를 식별(찾아줌)하는데 도움을 준다.
--
명령어 사이클 (재정리)
--
--
'CS > 컴퓨터 구조' 카테고리의 다른 글
[CPU 성능 향상] 명령어 병렬 처리 기법 (0) | 2024.08.27 |
---|---|
[CPU 성능 향상] 클럭, 멀티코어, 멀티스레드 (0) | 2024.08.26 |
[CPU 동작 원리] 레지스터 종류 (0) | 2024.08.24 |
[CPU 작동 원리] ALU와 제어장치 (0) | 2024.08.23 |
[명령어] 명령어의 구조 ( 연산 코드, 오퍼랜드, 주소 지정 방식 ) (0) | 2024.08.22 |