공부/컴퓨터구조

[ 컴퓨터구조 ] CPU의 작동원리

haena02 2023. 1. 25. 16:33
반응형

1. ALU와 제어장치

 

이번에는 CPU 내부에 있는 ALU와 제어장치에 대해 알아 볼 것이다.

 

1.1 ALU

 

ALU레지스터를 통해 피연산자를 받아드리고, 제어장치로부터 수행할 연산을 제어 신호를 받아드린다.

이렇게 받은 정보들로 연산을 수행하고 결과를 레지스터에 저장한다.

매번 메모리에 저장하면 속도를 저하 시킬 수 있으므로 CPU안에 있는 레지스터에 우선 저장한다.

 

또, ALU는 음수와 양수를 구별하기 위한 플래그도 내보낸다.

플래그는 연산 결과에 대한 추가적인 정보를 가지고 있다.

부호 플로그 음수일때는 1 , 양수일때는 0이된다.
제로 플로그 연산결과가 0이면 1 , 0이 아니면 1이 된다. 
캐리 플래그 올림수나 빌림수가 발생했을 때 1 , 발생하지 않았을 때 0이 된다.
오버플로우 플래그 오버플로우가 발생하면 1 , 발생하지 않았을 때 0이 된다.
인터럽트 플래그 인터럽트가 가능하면 1 , 불가능하면 0이 된다.
슈퍼바이저 플래그 커널모드로 실행중이면 1 , 사용자모드로 실행중이면 0이 된다. 

위 와 같은 플래그들이 존재한다!!

이런 플래그는 플래그 레지스터에 저장된다.

 

1.2 제어장치

 

CPU마다 제어장치에는 조금씩의 차이가 있으니 제어장치의 역할에 초점을 맞춰 알아보자.

 

 제어장치는 클럭신호를 받아드린다.

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

 

 제어장치는 '해석해야 할 명령어'를 받아드린다.

명령어는 명령어 레지스터에 저장된다.

제어장치는 이 명령어를 읽고 컴퓨터부품들에게 수행해야 할 내용을 알려준다.

 

 제어장치는 플래그 레지스터 속 플래그를 받아드린다.

플래그 레지스터 값을 읽고 이를 참고하여 제어신호를 발생시킨다.

 

 제어장치는 제어버스로 전달된 신호를 받아드린다.

제어신호는 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있고 외부로부터 전달된 제어 신호를 받아드릴수도있다.

 

 

2. 레지스터

 

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

이는 즉! 레지스터만 잘 봐도 프로그램을 이해할 수 있다는 것!

 

CPU는 다양한 역할을 가진 레지스터들이 있다.

 

2.1 반드시 알아야 할 레지스터

 

레지스터는 매우 종류가 많지만 우리는 중요한 8개만 알아볼 것이다.

 

프로그램 카운터 (PC)

프로그램 카운터는 메모리에서 가져올 명령어의 주소, 즉 메모리에서 읽어 들일 명령어의 주소를 저장한다.

 

명령어 레지스터 (IR)

명령어 레지스터는 해석할 명령어, 즉 방금 메모리에서 읽어드린 명령어를 저장하는 레지스터이다.

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

 

메모리 주소 레지스터

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

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

 

메모리 버퍼 레지스터

메모리 버퍼 레지스터는 메모리와 주고받을 데이터와 명령어를 저장하는 레지스터이다.

데이터 버스로 주소 받을 값은 메모리 버퍼 레지스터를 거친다.

 

범용 레지스터

범용 레지스터는 이름 그래도 자유롭게 사용할 수 있는 레지스터이다.

 

플래그 레지스터

플래그 레지스터는 ALU연산결과에 따른 플래그를 저장하는 레지스터이다. 

 

스택포인터

스택의 꼭대기를 가리키는 레지스터이다.

즉 스택에 마지막에 저장된 값을 가리키는 레지스터이다. 

 

베이스 레지스터

베이스 레지스터 주소 지정 방식에서 기준 주소를 저장하는 레지스터


실행과정을 보며 레지스터들이 어떻게 작동하는지 알아보자.

실행할 프로그램이 1000번지에 있고 1000번지에 1101이 저장되어있다고 가정해보자.

프로그램을 실행하기 위해 프로그램 카운터에 1000번지가 저장된다. 

1000번지를 읽어드리기위해 메모리 주소 레지스터에 1000을 저장한다. 

그렇게되면!? 메모리 읽기 제어신호메모리 주소 레지스터 값이 각각 제어버스주소버스로 메모리로 간다. 

메모리 1000에 저장된 1101 값은 메모리 버퍼 레지스터로 전달이 되고, 프로그램 카운터는 증가되어 1001이 된다. 

메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동한다. 


 

2.2 특정 레지스터를 이용한 주소 지정 방식

 

1. 스택주소 방식

스택주소방식은 스택과 스택 포인터를 이용하는 주소지정방식이다.

스택 포인터는 위에서 설명 했듯이 스택의 맨 위를 가르키는 레지스터이고, 스택은 메모리 안에 있는 영역이다.

 

2. 변위 주소 지정 방식

명령어는 연산 코드와 오퍼랜드로 이루어져 있다.

변위 주소 지정 방식은 오퍼랜드 필드의 값과 특정 레지스터의 값을 더하여 유효주소를 얻어내는 방식이다.

그래서 이 방식을 사용하는 명령어는 연산코드필드, 레지스터 필드, 오퍼랜드 필드가 있다.

이는 어떤 레지스터와 더하는지에 따라 또 두개로 나누어진다. 

 

상대 주소 지정 방식

상대 주소 지정 방식은 오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식이다. 

이 방법은 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용된다. 

 

베이스 레지스터 주소 지정 방식

베이스 레지스터 주소 지정 방식은 오퍼랜드와 베이스 레지스터의 값을 더하여 유효주소를 얻는 방식이다. 

베이스 레지스터는 기준 주소, 오퍼랜드는 기준 주소로부터 떨어진 거리로서의 역할을 한다. 

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

 

 

3. 명령어 사이클과 인터럽트

 

3.1 명령어 사이클

 

명령어를 실행하기 위해서는 일정한 주지가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 한다. 

먼저 명령어를 실행하기 위해서는 메모리에 있는 명령어를 CPU로 가져와야한다. 

이 과정을 인출 사이클이라고 한다. 

인출 사이클을 거친 후에는 가져온 명령어를 실핸하는 실행 사이클의 차례이다.

이 과정에서는 제어장치가 명령어 레지스터에 담긴 값을 해석하고, 제어신호를 발생시킨다.

 

인출사이클과 실행사이클이 반복되며 명령어가 실행된다. 

하지만 명령어를 인출해도 실행할 수 없는 경우도 있다. 

인출한 주소가 간접주소일 수도 있기 때문이다. 

그렇다면 다시 메모리에 접근해서 유효주소를 얻어내야한다. 

이 과정을 간접 사이클이라고 한다. 

 

3.1 인터럽트

 

CPU의 작업을 방해하는 신호를 인터럽트라고 한다. 

인터럽트는 크게 동기 입터럽트와 비동기 인터럽트로 이루어져있다.

 

동기 인터럽트 (예외)

동기 인터럽트는 CPU에 의해 발생하는 인터럽트이다.

CPU가 명령어를 수행하다가 예상치 못한 상황에 마주했을 때 발생하는 인터럽트가 동기 인터럽트이다.

예외라고도 한다. 

 

예외의 종류

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

2. 트랩 - 예외를 처리한 직후 예외가 발생한 명령어의 다음 명령어부터 실핸하는 예외 

3. 중단 - 프로그램을 강제로 중단시킬수밖에 없는 심각한 오류가 발견됐을 떄 발견되는 예외

4. 소프트웨어 인터럽트 - 시스템 호출이 발생했을 때 나타나는 예외

 

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

이는 주로 입출력 장치에 의해 발생하는 인터럽트이다. 

보통 알림의 역할을 한다. 

CPU가 입출력 장치에 작업을 부탁했다가 작업이 완료되었을때, 입출력 장치가 어떠한 입력을 받았을 때 등등..

이를 하드웨어 인터럽트라고도 한다. 

 

입출력장치는 느리기 때문에 입출력 장치가 움직일 동안 CPU는 다른일을 하고 

인터럽트로 완료된 알림을 주게 되니 CPU는 더 효율적으로 사용된다고 볼 수 있다. 

 

하드웨어 인터럽트 처리순서는 아래와 같다.

  1. 입출력 장치는 CPU에 인터럽트 요청 신호를 보낸다.
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 인터럽트 여부를 확인한다.
  3. 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 받아들일 수 있는지 확인한다.
  4. 받아드릴 수 있다면 CPU는 지금까지의 작업을 백업한다.
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
  6. 인터럽트 서비스 루틴이 끝나면 백업해둔 내용을 복구하여 실행을 재개한다.

진한 글씨의 용어들을 다시 보장!!

인터럽트 플래그는 CPU가 인터럽트 요청을 수용할 수 있는지 없는지 결정하는 플래그이다. 

CPU가 너무 중요한 일을 하고 있거나 방해받으면 안될 때는 플래그에 불가능하다고 표시한다. 

하지만 인터럽트가 진짜 최상위로 중요하다면 플래그에 불가능이라고 되어있어도 동작한다.(정전, 고장)

인터럽트 서비스 루틴은 은 인터럽트를 처리하기 위한 프로그램이다. 인터럽트 핸들러라고 부르기도한다.

이는 어떤 인터럽트냐에 따라 다르게 행동하도록 되어있다. 

인터럽트 벡터는 인터럽트를 서비스 루틴을 실행하기 위한 정보인다.

 

 

반응형