컴퓨터구조+운영체제

CPU의 작동 원리(명령어 사이클, 인터럽트)

chojdsj 2023. 11. 27. 19:12
728x90

 

 

 

플래그

 

 

- 연산 결과에 대한 추가적인 상태 정보플래그라고 한다.

 

- ALU는 계산 결과와 더불어 플래그를 내보낸다.

 

- ALU는 결과값 뿐만 아니라 연산 결과에 대한 추가적인 정보를 내보내야 한다.

 

 

 

 

- 이러한 플래그는 CPU가 프로그램을 실행하는 도중 반드시 기억해야 하는 일종의 참고 정보이다.

 

- 플래그들은 플래그 레지스터라는 레지스터에 저장됩니다.

 

 

 

 

 

 

 

제어장치

 

 

 

 

1) 제어장치는 클럭 신호를 받아들인다.

 

- 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이다.

 

- 클럭의 주기에 맞춰 데이터가 이동되거나, 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어 들인다.

 

 

2) 제어장치는 해석해야 할 명령어를 받아들인다.

 

- 제어장치는 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.

 

 

3) 제어장치는 플래그 레지스터 속 플래그 값을 받아들인다.

 

- 제어장치는 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킨다.

 

 

4) 제어장치는 시스템 버스, 그 중에서 제어 버스로 전달된 제어 신호를 받아들인다.

 

- 제어장치는 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 한다.

 

 

* 제어장치가 CPU 외부로 전달하는 제어 신호

 

- 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶다면 메모리로 제어 신호를 내보낸다.

 

- 입출력장치의 값을 읽거나 새로운 값을 쓰고 싶을 때는 입출력장치로 제어신호를 내보낸다.

 

 

* 제어장치가 CPU 내부로 전달하는 제어 신호

 

- ALU에 수행할 연산을 지시하기 위해 제어 신호를 내보낸다.

 

- 레지스터에는 레지스터 간에 데이터를 이동시키거나, 레지스터에 저장된 명령어를 해석하기 위해 제어 신호를 내보낸다. 

 

 

 


** 제어장치는 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들이며, CPU 내부와 외부로 제어 신호를 내보낸다. **

 

 

 

 

 

 

 

 

 

레지스터

 

 

- 프로그램 속 명령어와 데이터는 실행 전후로 반드시 레지스터에 저장된다.

 

 

* 많은 CPU가 공통으로 포함하고 있는 여덟개의 레지스터를 살펴보자 *

 

 

1) 프로그램 카운터

- 프로그램 카운터는 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장한다. 프로그램 카운터를 명령어 포인터 라고 부루는 CPU도 있다.

- 프로그램 카운터는 지속적으로 증가하며 계속해서 다음 명령어를 읽어 들일 준비를 한다. 이 과정이 반복되면 CPU는 프로그램을 차례대로 실행해 나간다.

- CPU가 메모리 속  프로그램을 순차적으로 읽어들이고 실행해 나갈 수 있는 이유는 CPU 속 프로그램 카운터가 꾸준히 증가하기 때문이다.

 

2) 명령어 레지스터

- 해석할 명령어, 즉 방금 메모리에서 읽어 들인 명령어를 저장하는 레지스터.

- 제어장치는 명령어 레지스터 속 명령어를 받아 들이고 이를 해석한 뒤 제어 신호를 내보낸다.

 

3) 메모리 주소 레지스터

- 메모리의 주소를 저장하는 레지스터.

- CPU 가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 메모리의 주소 레지스터를 거치게 된다.

 

4) 메모리 버퍼 레지스터

- 메모리와 주고 받을 값(데이터와 명령어) 을 저장하는 레지스터.

- 즉, 메모리에 쓰고 싶은 값이나 메모리로부터 전달받은 값은 메모리 버퍼 레지스터를 거친다. CPU가 데이터 버스로 주고 받을 값은 메모리 버퍼 레지스터를 거친다.

 

 

5) 범용 레지스터

- 이름 그대로 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터이다.

- 범용 레지스터는 데이터와 주소를 모두 저장할 수 있다.

 

 

6)  플래그 레지스터

- 연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터

 

 

7) 스택 포인터

- 스택의 꼭대기를 가리키는 레지스터. 즉, 스택 포인터는 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.

- 스택의 어디까지 데이터가 채워져 있는지에 대한 표시라고 보면 된다.

- 스택은 메모리 안에 스택처럼 사용할 영역이 정해져 있는데, 이를 스택 영역이라고 한다.

 

 

8) 베이스 레지스터

- 베이스 레지스터에 저장된 주소는 기준 주소로서의 역할을 한다.

- 베이스 레지스터 주소 지정 방식은 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어내는 방법이다.

 

 

 

 

 

명령어 사이클과 인터럽트

 

 

- 하나의 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 한다.

 

- CPU는 정해진 흐름에 따라 명령어를 처리해 나가지만, 간혹 이 흐름이 끊기는 상황이 발생하는데, 이를 인터럽트 라고 한다.

 

 

 

 

* 명령어 사이클

 

- 프로그램 속 각가의 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 한다.

 

- 메모리에 있는 명령어를 CPU로 가지고 오는 단계인출 사이클이라고 한다.

 

- CPU로 가져온 명령어를 실행하는 단계실행 사이클이라고 한다. 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어 신호를 발생시키는 단계가 실행 사이클이다.

 

- 명령어를 실행하기 위해서 메모리에 접근을 한 번 더 해야하는 경우가 있는데, 이 단계를 간접 사이클이라고 한다.

 

 

 

 

 

* 인터럽트(Interrupt)

 

- CPU가 수행중인 작업은 방해를 받아 잠시 중단될 수 있는데, 이렇게 CPU의 작업을 방해하는 신호인터럽트라고 한다.

 

- 인터럽트의 종류에는 크게 동기 인터럽트와 비동기 인터럽트가 있다.

 

 

1) 동기 인터럽트

 

- 동기 인터럽트는 CPU가 명령어들을 수행하다가 예상치 못한 상황에 마주치거나, CPU가 실행하는 프로그래밍상의 오류와 같은 예외 적인 상황에 마주쳤을 때 발생하는 인터럽트가 동기 인터럽트 이다.

 

- 동기 인터럽트는 예외라고 부른다.

 

 

 

* 예외의 종류

 

- 예외의 종류에는 폴트, 트랩, 중단, 소프트웨어 인터럽트가 있다.

 

- CPU가 본래 하던 작업으로 되돌아 왔을 때 예외가 발생한 명령어부터 실행하느냐, 예외가 발생한 명령어의 다음 명령어부터 실행하느냐에 따라 폴트와 트랩으로 나뉘어진다.

 

- 폴트 : 예외를 처리한 직후 예외가 발생한 명령어부터 실행을 재개하는 예외.

- 트랩 : 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실행을 재개하는 예외. 주로 디버깅 할때 사용.

 

- 중단 : CPU가 실행중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류를 발견했을 때 발생하는 예외.

 

- 소프트웨어 인터럽트 : 시스템 호출이 발생했을 때 나타난다.

 

 

 

 

 

 

 

2) 비동기 인터럽트(하드웨어 인터럽트)

 

 

- 비동기 인터럽트는 주로 입출력장치에 의해 발생하는 인터럽트이다. 주로 알림과 같은 인터럽트이다.

 

 

- 입출력 장치는 CPU보다 속도가 현저히 느리기 때문에 CPU는 입출력 작업의 결과를 바로 받아볼 수 없다.

이로 인해 CPU는 다른 생산적인 일을 할 수 없으니 CPU 사이클 낭비인데, 하드웨어 인터럽트를 이용하면 CPU는 주기적으로 프린트 완료 여부를 확인할 필요가 없다.

 

- 하드웨어 인터럽트는 입출력 작업 중에도 CPU로 하여금 효율적으로 명령어를 처리할 수 있게 한다.

 

 

** 하드웨어 인터럽트 처리 순서 **

 

1) 입출력 장치는 CPU에 인터럽트 요청 신호를 보낸다.

2) CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인하다.

3) CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.

4) 인터럽트를 받아 들일 수 있다면 CPU는 지금까지의 작업을 백업한다.

5) CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.

6) 인터럽트 서비스 루틴 실행이 끝나면 4번에서 백업해둔 작업을 복구하여 실행을 재개한다.

 

 

 

- 인터럽트는 CPU의 정상적인 실행 흐름을 끊는 것이기에 다른 누군가가 인터럽트 하기 전에는 "지금 끼어들어도 되나요?" 하고 CPU에 물어봐야 하는데, 이를 인터럽트 요청 신호라고 한다.

 

- 이 때 CPU가 인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 인터럽트 플래그가 활성화 되어 있어야 한다.

 

- 인터럽트 플래그는 말 그대로 하드웨어 인터럽트를 받아 들일지, 무시할지를 결정하는 플래그 이다.

- CPU가 중요한 작업을 처리해야 하거나 어떤 방해도 받지 않아야 할 때 인터럽트 플래그는 불가능으로 설정된다. 플래그가 불가능으로 되어있다면 CPU는 어떤 인터럽트 요청이 오더라도 다 무시하고, 반대로 가능으로 되어있다면 인터럽트 요청신호를 받아들이고 처리한다.

 

- CPU가 인터럽트 요청을 받아들이기로 했다면 CPU는 인터럽트 서비스 루틴이라는 프로그램을 실행한다. 인터럽트 서비스 루틴은 인터럽트를 처리하기 위한 프로그램이다.

- 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램.

 

 

 

1) 정상적으로 작업진행 -> 2) 인터럽트 발생 -> 3) 인터럽트 서비스 루틴으로 이동 -> 4) 인터럽트 서비스 루틴 실행 -> 5) 기존 작업으로 이동 -> 6) 기존 작업 수행 재개

 

 

 

 

- 인터럽트 벡터는 인터럽트 서비스 루틴을 식별하기 위한 정보이다. 인터럽트 벡터를 알면 인터럽트 서비스 루틴의 시작 주소를 알 수 있기 때문에 CPU는 벡터를 통해 서비스 루틴을 처음부터 실행할 수 있다.

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

 

 

 

 

** CPU가 인터럽트를 처리한다는 말은 인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아 온다는 말과 같다. 그리고 CPU가 서비스 루틴을 실행하려면 시작 주소를 알아야 하는데 이는 인터럽트 벡터를 통해 알 수 있다. ** 

 

 

 

 

명령어 사이클은 인출, 실행, 간접, 인터럽트 사이클로 구성되어 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 혼자 공부하는 컴퓨터 구조 + 운영체제 (강민철)

'컴퓨터구조+운영체제' 카테고리의 다른 글

명령어 병렬 처리 기법  (0) 2023.11.29
CPU 성능 향상 기법  (0) 2023.11.28
명령어  (0) 2023.11.24
데이터  (0) 2023.11.22
컴퓨터 구조  (1) 2023.11.21