4_CPU의 작동 원리

Joon·2023년 7월 2일
0

4-1. ALU와 제어장치

ALU와 제어장치가 어떤 정보를 보내고 받아들이는지를 중심으로 두 장치의 역할을 알아보자.

◦ ALU

ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들여 다양한 연산을 수행한다.
프로그램 실행 속도를 위해 연산의 결과값은 바로 메모리에 저장하지 않고 일시적으로 레지스터에 저장된다.
ALU는 결과값 말고도 플래그를 보낸다.

플래그
이진수만을 봐서는 음수인지 양수인지 판단하기 어렵기 때문에 플래그를 사용한다. 그 외에도 연산 결과에 대한 추가적인 정보를 담는다. 이러한 플래그는 플래그 레지스터 라는 레지스터에 저장된다.
부호 플래그 : 연산한 결과의 부호를 나타낸다.
제로 플래그 : 연산 결과가 0인지 여부를 나타낸다.
캐리 플래그 : 연산 결과가 올림수나 빌림수가 발생했는지를 나타낸다.
오버플로우 플래그 : 오버 플로우가 발생했는지를 나타낸다. (연산 결과가 연산 결과를 담을 레지스터보다 큰 상황을 오버플로우 라고 한다.)
인터럽트 플래그 : 인터랩트가 가능한지를 나타낸다.
슈퍼바이저 플래그 : 커널 모드로 실행중인지, 사용자 모드로 실행중인지 나타낸다.

◦ 제어장치

제어장치는 제어 신호를 보내고 명령어를 해석하는 부품이다

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

클럭이란 컴퓨터의 모든 부품을 일사분란하게 움직일 수 있게 하는 시간 단위이다.
클럭에 주기에 맞게 모든 부품은 움직인다. 한 클럭당 부품이 한번 동작하는것은 아니다. 한 명령어가 여러 클럭에 걸쳐 실행되기도 한다.

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

명령어 레지스터로부터 해석할 명령어를 받아들여 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 전달한다.

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

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

4. 제어 버스로 전달된 제어 신호를 받아들인다.

제어 신호는 CPU뿐만이 아니라 CPU 외부 장치도 발생시킬 수 있다.
제어장치는 제어 버스를 통해 외부로 부터 전달된 제어 신호를 받아들이기도 한다.

  • 내부에서 제어 신호를 보내는 경우
    ALU에 전달하는 제어 신호와 레지스터에 전달하는 제어 신호가 있다.
    ALU에는 수행할 연산을 지시하기 위해, 레지스터에는 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위에 제어 신호를 보낸다.
  • 외부로 제어 신호를 보내는 경우
    메모리에 저장된 값을 읽고 쓸때, 입출력장치의 값을 읽거나 쓸때 등 CPU 제어 버스를 통해 CPU 외부의 부품에 제어 신호를 보낼 수 있다.

4-2. 레지스터

레지스터만 잘 관찰해도 프로그램의 자세한 실행 과정을 알 수 있다.

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

레지스터의 종류는 매우 다양하나 그 중 여러 전공 서적에서 제일 중요하게 다루는 레지스터에 대해 알아보자.

- 프로그램 카운터

메모리에서 읽어 드릴 명령어의 주소를 저장한다. 프로그램 카운터를 명령어 포인터 라고 부르는 CPU도 있다.
변위 주소 지정 방식에 사용된다.

- 메모리 주소 레지스터

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

- 메모리 버퍼 레지스터

메모리에 쓰고 싶은 값이나 메모리 부터 전달받은 값은 메모리 버퍼 레지스터를 거친다. CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고 받을 값은 메모리 버퍼를 거치게 된다.

- 명령어 레지스터

메모리에서 읽어들인 명령어를 저장하는 레지스터이다. 제어장치는 이 명령어 레지스터 속 명령어를 받아들이고 이를 해석한 뒤 제어 신호를 내보낸다.

데이터 버스 : 메모리에 저장할 값을 데이터 버스를 통해 제어 신호를 보낸다.
주소 버스 : 저장할 주소를 주소 버스틀 통를 보낸다.

- 범용 레지스터

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

- 플래그 레지스터

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

- 베이스 레지스터

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

- 스택 포인터

스택 주소 지정 방식의 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.

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

- 스택 주소 지정 방식


메모리 안에 스택처럼 사용할 영역이 정해져있다. 이를 스택 영역 이라고 한다.
이 영역은 다른 주소 영역이랑 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역이다.

- 변위 주소 지정 방식

오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 방식이다.
이때, 변위 주소 지정 방식은 오퍼랜드 필드 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.

  • 상대 주소 지정 방식

    오퍼랜드와 프로그램 카운터의 값을 더하여 유호 주소를 얻는 방식이다.
    프로그래밍 언어의 if문과 유사하게 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용된다.

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

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

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

CPU가 하나의 명령어를 처리하는 흐름인 명령어 사이클과 그 흐름을 방해하는 인터럽트에 대해 알아보자.

◦ 명령어 사이클

프로그램은 인출과 실행 사이클을 반복하며 실행된다.

- 간접 주소 지정 방식 같은 경우는 메모리에 한 번 더 접근 해야 하기 때문에 간접 사이클이 추가된다.
- 인터럽트가 발생하는 경우 인터럽트 사이클이 추가된다.

- 인출 사이클

  • 프로그램을 실행하기 위해 프로그램 카운터에 메모리에 저장되어 있는 프로그램의 첫 주소가 저장된다.
  • 프로그램 카운터에 저장된 주소가 메모리 주소 레지스터로 이동한다.
  • 제어장치의 '메모리 읽기' 제어 신호와 메모리 주소 레지스터의 값이 각각 제어 버스와 주소 버스를 통해 메모리로 보내진다.
  • 메모리는 전달된 신호와 데이터를 받아 데이터 버스를 통해 메모리 버퍼 레지스터로 전달한다.프로그램 카운터는 증가되어 다음 명령어를 읽어 드릴 준비를 한다.
  • 메모리 버퍼 레지스터에 저장된 값은 명령어 레지스터로 이동한다.

- 실행 사이클

  • 제어장치는 명령어 레지스터의 명령어를 해석하고 제어 신호를 발생시킨다.

◦ 인터럽트

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

- 동기 인터럽트

CPU에 의해 발생하는 인터럽트다. CPU가 명령어를 수행하다가 예상치 못한 상황을 마주쳤을 때 (프로그래밍상 오류와 같은 상황) 발생한다. 동기 인터럽트는 '예외' 라고 부른다.

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

주로 입출력장치에 의해 발생하는 인터럽트다.
입출력장치는 CPU보다 속도가 현저히 느리기 떄문에 작업의 결과를 바로 받아볼 수 없다. 예를 들어 프린트가 언제 끝낼지 모르기 때문에 주지적으로 프린터의 완료 여부를 확인해야 된다면 이로 인해 CPU는 다른 생산적인 일을 할수 없으니 CPU 사이클 낭비이다. 하지만 비동기 인터럽트를 이용하면 CPU는 주기적으로 프린트 완료 여부를 확인할 필요가 없다. CPU는 프린터로 부터 프린트 완료 인터럽트를 받을 때까지 다른 작업을 처리할 수 있다.

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

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

인터럽트 플래그
CPU가 인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 인터럽트 플래그가 활성화 되어 있어야 한다.
모든 하드웨어 인터럽트를 인터럽트 플러그로 막을 수 있는것은 아니다. 정정이나 하드웨어 고장같은 인터럽트는 인터럽트 플래그가 활성화 되어 있지 않아도 무시하고 인터럽트를 수용한다.

인터럽트 서비스 루틴
인터럽트가 발생하면 어떻게 행동해야 할지를 알려주는 프로그램 이다.
'CPU가 인터럽트를 처리한다' 라는 말은 '인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다' 라는 말과 같다.

인터럽트 백터
CPU가 인터럽트 서비스 루틴을 식별하귀 위한 정보이다. CPU가 인터럽트 서비스 루틴을 실행하려면 인터럽트 서비스 루틴의 시작 주소알 알아야 하는데 이는 인터럽트 벡터를 통해 알 수 있다.

0개의 댓글