CS/컴퓨터구조

[혼공컴운] Ch04. CPU의 작동 원리

Kangjieun11 2023. 2. 20. 02:55
728x90

 

 

 

 


강민철 - 혼자 공부하는 컴퓨터구조 운영체제
 

 

책을 읽으며 개인적으로 정리한 내용입니다.

 

 

 


 

CPU의 작동 원리

  1. ALU와 제어장치
    • ALU
    • 제어장치
  2. 레지스터
    • 반드시 알아야 할 레지스터
    • 특정 레지스터를 이용한 주소 지정 방식 (1) : 스택 주소 지정 방식
    • 특정 레지스터를 이용한 주소 지정 방식 (2) : 변위 주소 지정 방식
    • 상용화된 CPU 속 레지스터 및 주소 지정 방식
  3. 명령어 사이클과 인터럽트
    • 명령어 사이클
    • 인터럽트
    • 예외의 종류

 

 


 

 

✅ ALU와 제어장치

CPU는 메모리에 저장된 명령어를 읽고, 해석하고, 실행하는 장치였다. 

CPU 내부에는 ALU (계산담당), 제어장치 (명령어읽고해석), 레지스터(작은임시저장장치)가 존재했다.

 

 

 

⏺ ALU

ALU는 계산하는 부품이다. 

따라서 피연산자와 연산자 정보가 필요하다. 

 

 

레지스터를 통해 피연산자를 받아들이고, 결과값을 레지스터로 내보낸다. (플래그도 내보낸다)

제어장치로부터 수행할 연산을 알려주는 제어 신호를 받는다. 

 

 

✔️ ALU가 내보내는 정보

연산의 결과는 숫자/문자/메모리주소 등 다양하게 될 수 있다.

이 결과는 메모리에 바로저장되는 게 아닌 일시적으로 레지스터에 저장된다.

 

>> ALU연산할 때마다 메모리에 저장하면 너무 메모리에 많이 접근하게 되면서 성능상 문제가 된다.

 

 

 플래그 

때때로 결과값뿐만아니라 추가적인 정보를 내보낸다.

-> 음수일때 "방금 계산한 결과가 음수" 라는 것을 알리기 위해 플래그를 알려줌

-> 연산결과가 결과를담을 레지스터보다 클때 -> 오버플로우 났다 라고 알려줌

 

연산 결과에 대한 추가적인 정보가 바로 플래그이다!!!

플래그 정보는 플래그 레지스터에 저장된다.

 

 

 

ALU가 연산 이후

부호 플래그가 1이 되면 연산 결과는 음수

제로플래그가 1이되면 연산결과가 0 ... 등 이런느낌으로 작동한다.

 

 

제어장치

제어장치는 제어신호를 내보낸다. 

제어신호란 컴퓨터 부품을 관리/작동시키기 위한 일종의 전기신호이다.

 

 

✔️ 제어장치가 받아들이는 정보

 

1) 클럭신호를 받아들인다.

 

클럭 :컴퓨터의 움직임을 나타내는 시간단위

 

클럭의 주기에 맞춰 이런일이 행해진다.

- 레지스터에서 다른 레지스터로 데이터의 이동

- ALU에서 연산 수행

- CPU가 메모리에 저장된 명령어를 읽음  등

 

* 여러 클럭에 걸쳐 한 동작이 실행될 수도 있다.

 

 

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

명령어 레지스터라는 곳에 명령어가 있다. 

이 레지스터로부터 해석할 명령어를 받고, 해석한 뒤에 제어신호를 발생시켜 

부품들에게 수행해야할 내용을 알려준다.

 

3) 플래그 레지스터 속 플래그 값을 받아들인다.

 

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

외부 장치로부터 전달된 제어신호))

 

✔️ 제어장치가 내보내는 정보

 

1) CPU 외부에 전달하는 제어 신호

외부에 전달한다 == 제어버스로 내보낸다는 말

- 메모리에 전달하는 제어신호

- 입출력장치에 전달하는 제어신호

 

메모리/입출력장치에 저장된 값을 읽거나 쓰고 싶을떄 제어신호를 내보낸다.

 

 

2) CPU 내부에 전달하는 제어 신호

ALU에 전달하는 제어신호 : 수행할 연산 지시 목적

레지스터에 전달하는 제어신호 : 레지스터간 데이터 이동, 레지스터에 저장된 명령어 해석 등

 

 

 

레지스터

프로그램속 명령어/데이터는

실행 전후로 반드시 레지스터에 저장된다.

 

반드시 알아야 할 레지스터

 

> 프로그램카운터, 명령어레지스터, 메모리주소레지스터, 메모리버퍼레지스터

> 플래그레지스터, 범용레지스터

> 스택포인터

> 베이스 레지스터

 

 

  • 프로그램 카운터 PC
    • 메모리에서 가져올 명령어의 주소를 저장한다. 
    • ( + 명령어 포인터라고 부르는 CPU도 존재함 )
  • 명령어 레지스터
    • 해석할 명령어를 저장하는 레지스터
    • 제어장치가 명령어 레지스터의 명령어를 받고, 해석한 후 제어 신호를 보낸다.
  • 메모리주소 레지스터
    • MAR Memory Address Register
    • CPU가 읽어들이고자 하는 주소값을 주소버스로 보낼때 이곳을 거친다.
  • 메모리버퍼 레지스터
    • 메모리와 주고받을 값을 저장하는 레지스터 (데이터/명령어)
    • 메모리에 쓰고 싶거나 메모리에서 읽어들이는 값은 이곳을 거친다

 

 

 

메모리 1000번지부터 1500번지에 프로그램이 저장되어 있다고 가정하자.

 

프로그램 의 처음부터 실행을 위해 프로그램카운터(PC)에 1000이 저장된다.

메모리주소레지스터에 1000이 저장된다. 1000번지를 읽기 위함이다. 

 

 

메모리읽기 제어신호, 메모리주소레지스터의 값이 각각 제어버스/주소버스를 통해 메모리로 간다.

 

 

1000번지에 저장된 값이 데이터버스를 통해 메모리 버퍼 레지스터로 전달되고, 프로그램카운터는 1증가되어 다음 명령어를 읽을 준비를 한다. 

 

 

 

메모리 버퍼 레지스터에 저장된 값이 명령어 레지스터로 이동하고, 

제어장치는 이를 해석해 제어 신호를 발생시킨다. 

 

이와 같은 과정이 반복되며, CPU는 메모리속 프로그램을 순차적으로 읽고, 실행해나간다.

 

 

 

  • 플래그 레지스터
    • ALU연산 결과에 따른 플래그(부가정보) 저장
  • 범용 레지스터
    • 일반적이고 다양한 상황에서 자유롭게 사용할수있는 레지스터
    • 데이터/ 주소 모두 저장할 수 있다.
    • 일반적으로 CPU안에 여러개의 범용 레지스터들이 있다. 

 

 

특정 레지스터를 이용한 주소 지정 방식 (1) : 스택 주소 지정 방식

 

스택 주소 지정 방식은

스택 + 스택포인터를 이용한 주소지정방식이다.

 

  • 스택포인터
    • 스택의 꼭대기를 가리키는 레지스터 (스택에 마지막으로 저장된 값의 위치를 저장하는 레지스터)

 

스택에서 1, 2, 3순서로 꺼내게 되는데

꼭대기 주소를 저장하므로

1을 꺼냈다는 가정하에 스택포인터는 5번지를 가리키게 된다.

 

 

✔️ 스택은 어디에 존재할까?

스택은 메모리 안에 있다. 

메모리 내부에 스택영역이 존재한다. >> 스택처럼 사용하기로 약속된 영역

 

 

 

 특정 레지스터를 이용한 주소 지정 방식  (2) : 변위 주소 지정 방식

오퍼랜드 필드에 메모리의 주소가 담길 때도 있다고 했다.

 

이는 변위 주소 지정 방식

 

오퍼랜드 필드의 값 + 특정 레지스터 값을 더해 유효 주소를 얻어내는 주소 지정 방식이다.

 

변위주소지정방식을 사용하는 명령어는 

연산코드 + 레지스터값 + 주소가 함께 있다.

 

✔️ 상대 주소 지정방식

오퍼랜드와 프로그램카운터의 값을 더해 유효 주소를 얻는 방식

분기해 특정 주소의 코드를 실행할 때 사용된다. 

 

 

어떤 주소의 -3을 더한 주소로 접근
어떤 주소의 +3 이후 번지로 접근

 

 

✔️ 베이스 레지스터 지정방식

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

 

 베이스 레지스터가 기준 주소가 되어 

기준 주소로부터 떨어진 거리를 계산해 접근한다.  (위에거랑 별 다른게 없다... ㅋㅋ)

 

 

 

 

명령어 사이클과 인터럽트

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

이 흐름이 끊어지는 것을 인터럽트라고 한다.

 

명령어 사이클

인출 사이클

PC -> MAR -> 제어버스/주소버스 -> 메모리 -> 데이터버스 -> MBR ->  IR 

 

실행 사이클 

IR에 담긴 값을 제어장치가 해석, 제어신호를 발생시킴

 

 

++ 간접사이클

명령어를 가져와도 곧바로 실행할 수 없는 경우도 있다.

간접 주소 지정 방식의 경우 오퍼랜드필드에 유효주소의 주소를 명시 즉 메모리접근이 2번 발생하고, 이를 위해 추가적인 작업이 필요하다

 

 

 인터럽트

방해하다, 중단시키다

 

CPU가 수행중인 작업은 방해받아 중단될수있다. 이를 인터럽트라고 한다.

 

CPU가 꼭 주목해야하는, 처리해야하는 다른 작업이 생겼을 때 발생한다. 

 

 

✔️ 동기 인터럽트 (예외라고 부름)

- CPU에 의해 발생하는 인터럽트

명령어들을 수행하다 예상치 못한 상황에 마주함.

프로그래밍 상 오류와 같은 예외적인 상황에 발생

-- > 개발하면서 자주 접함

 

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

- 입출력장치에 의해 발생하는 인터럽트

- 완료 알림 역할을 한다.

 

 

* 프린터에 출력을 명령했는데,

입출력장치가 CPU에 비해 너무 느려서 출력 결과를 바로 받아볼수가 없다.

이걸 CPU가 기다리고 있을 필요가 없어서, CPU는 다른 작업을 하러가는데

 

만약 하드웨어 인터럽트가 없다면, CPU는 언제 끝날지 모르기 때문에 주기적으로 완료 여부를 확인해야한다.

이런 문제를 해결하기 위해 인터럽트를 받음으로써 알림역할을 하고, 

여유롭게 다른 작업을 처리할 수 있게 되는것이다!

 

  1. 입출력장치는 CPU에  인터럽트 요청신호를 보낸다 (지금 끼어들어도 되나요?)
  2. CPU는 실행 사이클이 끝나고, 명령어 인출 전에 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고, 인터럽트 플래그(플래그 레지스터 중..)를 통해 현재 인터럽트를 받아들일 수 있는지 체크한다.
  4. 만약 가능하다면 CPU는 지금까지의 작업을 백업한다.
    • 불가능으로 설정되어있어도 반드시 실행해야하는, 무시할 수 없는 하드웨어 인터럽트도 존재한다.
  5. CPU는 인터럽트 벡터(인터럽트 서비스 루틴 식별하는 정보 - 시작주소 알 수 있음)를 참조해
    인터럽트 서비스 루틴(인터럽트 처리 프로그램  ==인터럽트 핸들러)
    을 실행한다.
  6. 인터럽트 서비스 루틴이 끝나면 4에서 백업해둔 작업을 복구해 실행을 재개한다.

 

 

 

 

1500이 실행되고 있었는데 인터럽트가 발생했다고 가정

인터럽트 서비스 루틴을 실행하기전, 필요한 모든 내용을 스택에 백업한다. 

이후  10번지를 PC에 저장, 인터럽트 서비스 루틴을 실행한다. 

 

 

 

 

 예외의 종류

  • 폴트(fault)
    • 예외를 처리한 직후 예외 발생한 명령어부터 실행을 재개
    • 특정명령어를 처리하려하는데, 실행하기 위해 필요한 데이터가 메모리가 아닌 보조기억장치에 존재 -> 폴트 발생 -> 보조기억장치에서 필요한 데이터를 메모리로 가져옴 -> 실행 재개
  • 트랩 (trap)
    • 예외가 발생한 명령어의 다음 명령어부터 실행재개
    • 디버깅할 때 사용 ( 중단점에서 멈추고 다음 명령어부터 실행을 이어나가면 됨)
  • 중단
    • 프로그램을 강제로 중단시킬수밖에 없는 심각한 오류 발견
  • 소프트웨어 인터럽트
    • 시스템 호출 발생했을 때 나타남

 

 

 

 


references

더보기

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