본문 바로가기

CS/컴퓨터구조

CPU의 작동 원리

1. ALU와 제어장치

1-1. ALU

  • CPU 내부에서 계산을 담당하는 장치
  • 계산을 하기 위해서는 피연산자와 수행할 연산(제어 신호)이 필요
  • 결과를 레지스터에 저장하는 이유? -> CPU가 메모리보다 레지스터에 접근하는 속도가 더 빠르기 때문.
  • 플래그 : 연산 결과에 대한 부가 정보. 플래그 값들을 저장하는 플래그 레지스터에 저장된다.
    • 부호 플래그 : 1일 경우 음수, 0일 경우 양수
    • 제로 플래그 : 1일 경우 연산 결과는 0, 0일 경우 0이 아님
    • 캐리 플래그 : 1일 경우 올림수나 빌림수가 발생, 0일 경우 발생하지 않음
    • 오버플로우 플래그 : 1일 경우 오버플로우 발생, 0일 경우 발생하지 않음
    • 인터럽트 플래그 : 1일 경우 인터럽트 가능, 0일 경우 불가능
    • 슈퍼바이저 플래그 : 1일 경우 커널 모드로 실행 중, 0일 경우 사용자 모드로 실행 중

ALU가 받아들이고 내보내는 정보

 

1-2. 제어 장치

  • 제어 신호를 내보내고, 명령어를 해석하는 부품
  • 제어 신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호
  • 제어 장치가 받아들이는 정보
    1. 클럭 신호
      • 클럭 : 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
      • 주기에 맞춰 한 레지스터에서 다른 레지스터로 이동
      • ALU에서 연산이 수행되거나, CPU가 메모리에 저장된 명령어를 읽어들임
    2. 해석해야 할 명령어
      • CPU가 해석해야 할 명령어는 명령어 레지스터에 저장된다.
      • 제어 장치는 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.
    3. 플래그 레지스터 속 플래그 값
      • 플래그 값을 받아들이고 이를 참고하여 제어 신호를 발생시킨다.
    4. 시스템 버스, 그 중 제어 버스로 전달된 제어 신호
      • 제어 신호는 CPU뿐만 아니라 입출력장치를 비롯한 CPU 외부 장치도 발생시킬 수 있다.
      • 제어 버스를 통해 외부로부터 전달된 제어 신호를 받아들이기도 한다.
  • 제어 장치가 내보내는 정보
    1. CPU 외부에 전달하는 제어 신호
      • 제어 장치가 CPU 외부에 제어 신호를 전달한다는 말은 곧, 제어 버스로 제어 신호를 내보낸다는 말과 같다.
      • 메모리에 전달하는 제어 신호
        • 제어 장치가 메모리에 저장된 값을 읽거나 메모리에 새로운 값을 쓰고 싶을때 제어 신호를 내보낸다.
      • 입출력장치에 전달하는 제어 신호
        • 제어 장치가 입출력장치의 값을 읽거나 입출력장치에 새로운 값을 쓰고 싶을 때 입출력장치로 제어 신호를 내보낸다.
    2. CPU 내부에 전달하는 제어 신호
      • ALU에 전달하는 제어 신호
        • 수행할 연산을 지시하기 위해 ALU로 제어 신호를 내보낸다.
      • 레지스터에 전달하는 제어 신호
        • 레지스터 간에 데이터를 이동시키거나 레지스터에 저장된 명령어를 해석하기 위해 제어 신호를 내보낸다.

제어 장치가 받아들이고 내보내는 정보

 

2. 레지스터

1-1. 범용적인 레지스터 (서적에서 중요하게 다루는 레지스터 8개)

  • 레지스터
    • CPU 내부의 작은 임시 저장 장치
    • 프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장
    • CPU 종류마다 레지스터 종류는 다르다!
  1. 프로그램 카운터
    • 메모리에서 가져올 명령어의 주소를 저장(메모리에서 읽어 들일 명령어의 주소를 저장)
    • Instruction Pointer(명령어 포인터)라고 부르는 CPU도 있다.
    • 가져오고자 하는 주소를 CPU로 가져오면 카운트 1 증가. (메모리 버퍼 레지스트리가 값을 가져오면 증가)
  2. 메모리 주소 레지스터
    • 메모리의 주소를 저장한다.
    • CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터
    • 프로그램 카운터가 저장한 주소를 가져온다.
  3. 메모리 버퍼 레지스터
    • 메모리와 주고받을 값을 저장(데이터와 명령어)
    • CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터
    • 메모리 주소 레지스터가 가져온 주소의 값을 저장한다.
  4. 명령어 레지스터
    • 해석할 명령어를 저장(방금 메모리에서 읽어 들인 명령어)
    • 명령어 레지스터를 제어 장치가 받아들여서 해석하고 제어 신호를 내보낸다.
    • 메모리 버퍼 레지스터가 가져온 값을 저장한다.
  5. 플래그 레지스터
    •  연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장
  6. 범용 레지스터
    • 다양하고 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
  7. 스택 포인터
    • 특정 주소 지정에 사용
    • 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
    • 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터
  8. 베이스 레지스터
    • 특정 주소 지정에 사용
    • 변위 주소 지정 방식 : 오퍼랜드 필드의 값과 특정 레지스터(프로그램 카운터, 베이스 레지스터)의 값을 더하여 유효 주소를 얻는 방식 (더하는 값에 따라 방식이 두 가지로 나뉜다.)
      • 상대 주소 지정 방식 : 오퍼랜드 필드의 값과 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식
        • 프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있다.
        • 오퍼랜드가 -3일 경우 {명령어의 주소 - 3} 번지로 접근한다.
      • 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값과 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식
        • 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산.
        • 기준 주소가 200이고 오퍼랜드가 40일 경우 {200 + 40} 번지로 접근한다.

 

1~4번 레지스터가 순차적으로 실행되었을 경우.

 

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

3-1. 명령어 사이클

  • CPU는 프로그램 속 명령어들을 일정한 주기가 반복하면서 실행한다.
  • 이 주기를 명령어 사이클이라고 한다.
  • 인출 사이클
    • 메모리에 저장된 명령어를 실행시킬 때 가장 먼저 해야할 일은?
    • 명령어를 메모리에서 CPU로 가져온다!
    • 메모리에 있는 명령어를 CPU로 가져 오는 단계가 인출 사이클이다.
  • 실행 사이클
    • CPU로 명령어를 인출했다면 명령어를 실행한다. (사이클의 두 번째 과정)
    • CPU로 가져온 명령어를 실행하는 단계가 실행 사이클이다.
  • 프로그램을 이루는 명령어들은 일반적으로 인출 사이클과 실행 사이클을 반복한다.
  • 간접 사이클
    • 명령어를 인출하여 CPU로 가져와도 바로 실행하지 못하는 경우가 있다.
    • 명령어를 실행하기 위해 메모리 접근을 더 해야하는 경우가 이에 해당
    • 이러한 단계를 간접 사이클이라고 한다.

인출, 실행, 간접 사이클

 

3-2 인터럽트

  • 정의 : CPU가 수행 중인 작업을 방해하는 신호
  • 크게 동기 인터럽트, 비동기 인터럽트로 나뉜다.
  • 동기 인터럽트 (예외)
    • CPU가 예기치 못한 상황을 접했을 때 발생
    • CPU가 접근하고자 하는 데이터가 없다던지, 0으로 나누는 등의 상황
  • 비동기 인터럽트 (하드웨어 인터럽트)
    • 주로 입출력장치에 의해 발생
    • 알림(세탁기 완료 안림, 전자레인지 조리 알림)과 같은 역할
    • 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용
    • 입출력 장치는 CPU에 비해 느리기 때문에 CPU가 입출력 완료 여부를 일일히 확인해야 한다.
    • 이와 같은 문제를 인터럽트를 사용함으로써 해결 가능하다.

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

※ 인터럽트의 종류를 막론하고 인터럽트 처리 순서는 대동소이하다.

 

  • 인터럽트 요청 신호 : CPU의 작업을 방해하는 인터럽트에 대한 요청
  • 인터럽트 플래그 : 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
  • 인터럽트 벡터 : 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
  • 인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램

 

인터럽트를 포함한 명령어 사이클

 

* 출처 : 혼자공부하는컴퓨터구조+운영체제

'CS > 컴퓨터구조' 카테고리의 다른 글

명령어  (0) 2022.09.19