새소식

Computer Science/Computer Architecture

[혼자 공부하는 컴퓨터 구조] Chapter 04. CPU의 작동 원리

  • -

 

본 게시물은 ‘강민철, ⌜혼자 공부하는 컴퓨터구조 + 운영체제⌟, 한빛미디어, 2022’ 을 인용하였습니다.

 

1. ALU와 제어장치

ALU

  • ALU가 받는 정보
    • 레지스터를 통해 피연산자를 받아들임
    • 제어장치로부터 수행할 연산을 알려주는 제어신호를 받아들임
    • 레지스터와 제어장치로부터 받아들인 피연산자와 제어신호로 산술/논리 연산 등 다양한 연산 수행
  • ALU가 내보내는 정보
    • 연산 수행 결과는 특정 숫자, 문자, 메모리 주소가 될 수 있음
      • 결과값은 바로 메모리에 저장되는 것이 아닌, 일시적으로 레지스터에 저장됨
        • CPU가 레지스터에 접근하는 속도가 메모리에 접근하는 속도보다 빠르기 때문
    • 연산 결과 대한 추가적 정보 위해 플래그를 내보냄
      • 플래그는 플래그 레지스터에 저장됨
  • cf. 플래그

 

ALU 연산 직후 부호 플래그가 1이 되었으면, 연산 결과는 음수

 

ALU 연산 직후 제로 플래그가 1이 되었으면, 연산 결과는 0(Zero)

 

 

제어장치

  • 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 부품
    • 제어 신호 : 컴퓨터 부품 관리/작동 위한 일종의 전기 신호
  • 제어장치가 받아들이는 정보
    • 클럭 신호
      • 클럭(clock) : 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
    • 해석해야 할 명령어
      • CPU가 해석해야 할 명령어는 명령어 레지스터에 저장됨
      • 제어장치는 이 명령어 레지스터로부터 해석할 명령어 받아들이고 해석한 후 제어 신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려줌
    • 플래그 레지스터 속 플래그 값
      • 제어장치가 제어 신호를 통해 컴퓨터 부품들을 제어할 때 플래그 값을 받아들이고 이를 참고해 제어 신호를 발생시킴
    • 시스템 버스, 그 중에서 제어 버스로 전달된 제어 신호
  • 제어장치가 내보내는 정보
    • CPU 외부에 전달하는 제어 신호 == 제어 버스로 제어 신호를 내보냄
      • 메모리에 전달하는 제어 신호
      • 입출력장치에 전달하는 제어 신호
    • CPU 내부에 전달하는 제어 신호
      • ALU에 전달하는 제어 신호
      • 레지스터에 전달하는 제어 신호

 

2. 레지스터

반드시 알아야 할 레지스터

프로그램 카운터(PC; Program Counter)

  • 메모리에서 읽어 들일 명령어 주소 저장
  • 명령어 포인터(IP; Instruction Pointer)라고도 함

명령어 레지스터(IR; Instruction Register)

  • 메모리에서 읽어 들인 명령어 저장
  • 제어장치가 명령어 레지스터 속 명령어를 받아들이고 해석 후 제어 신호를 내보냄

메모리 주소 레지스터(MAR; Memory Address Register)

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

메모리 버퍼 레지스터(MBR; Memory Buffer Register)

  • 메모리와 주고받을 값(데이터&명령어) 저장
  • 메모리에 쓰고 싶은 값 혹은 메모리부터 전달받은 값은 메모리 버퍼 레지스터를 거침
  • CPU가 주소 버스로 내보낼 값이 메모리 주소 레지스터를 거친다면, 데이터 버스로 주고 받을 값은 메모리 버퍼 레지스터를 거침
  • 메모리 데이터 레지스터(MDR; Memory Data Register)라고도 함

플래그 레지스터

  • ALU 연산 결과 또는 CPU 상태 대한 부가적인 정보 저장

범용 레지스터

  • 다양하고 일반적인 상황에서 사용할 수 있는 레지스터
  • MBR은 데이터 버스로 주고받을 값만 저장, MAR은 주소 버스로 내보낼 주소값만 저장하나, 범용 레지스터는 데이터&주소 모두 저장O
  • 일반적으로 CPU 안에 여러 개의 범용 레지스터 있음

스택 포인터

  • 스택의 가장 위쪽 데이터 위치 가리킴

베이스 레지스터

  • 기준 주소(base address) 저장

 

프로그램 실행 과정

1. CPU로 실행할 프로그램이 1000번지~1500번지까지 저장되어 있다고 가정

    1000번지에는 1101(2) 저장되어 있다고 가정

 

2. 프로그램을 처음부터 실행하기 위해 프로그램 카운터(PC)에는 1000이 저장됨

    메모리에서 가져올 명령어가 1000번지에 있다는 것

 

3. 1000번지를 읽어 들이기 위해 주소 버스로 1000번지를 보내야 함

    메모리 주소 레지스터(MAR)에는 1000이 저장됨

 

4. ‘메모리 읽기’ 제어 신호와 메모리 주소 레지스터(MAR) 값이 각각 제어 버스, 주소 버스를 통해 메모리로 보내짐

5. 메모리 1000번지에 저장된 값은 데이터 버스 통해 메모리 버퍼 레지스터(MBR)로 전달되고, 프로그램 카운터(PC)는 증가되어 다음 명령어를 읽어 들일 준비를 함

 

6. 메모리 버퍼 레지스터(MBR)에 저장된 값은 명령어 레지스터(IR)로 이동

 

7. 제어장치는 명령어 레지스터(IR)의 명령어 해석하고 제어 신호를 발생시킴

 

* 프로그램 카운터는 지속적으로 증가하며 계속해 다음 명령어를 읽어 들일 준비를 하고 CPU는 차례대로 프로그램을 실행함

 

 

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

스택&스택 포인터 이용한 주소 지정 방식

 

  • 스택 포인터 : 스택의 꼭대기 가리키는 레지스터(스택에 마지막으로 저장된 값 위치 저장)
  • 스택 영역 : 메모리 안에 있음(다른 주소 공간과 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역)

▶ 예시.

 

  • 스택 포인터는 4번지 저장
  • 스택에서 데이터 꺼내는 순서 : 1 → 2 → 3
  • 4번지의 1을 꺼내면 스택에 2, 3이 남고 스택 포인터는 5번지 가리킴

  • 다시 스택에 데이터를 추가한다면, 스택 포인터는 4번지 가리킴

 

 

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

오퍼랜드 필드 값(변위)과 특정 레지스터 값을 더해 유효 주소를 얻어내는 주소 지정 방식

 

  • 변위 주소 지정 방식 사용하는 명령어 : 연산 코드 필드, 레지스터 필드, 오퍼랜드 필드

 

  • 종류 : 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등

 

상대 주소 지정 방식

  • 오퍼랜드와 프로그램 카운터(PC) 값을 더해 유효 주소 얻는 방식
  • PC : 읽어 들일 명령어 주소 저장
  • 오퍼랜드 -3이라면, CPU는 읽어 들이기로 한 명령어로부터 ‘3번째 이전’ 번지로 접근

 

  • 오퍼랜드 3이라면, CPU는 읽어 들이기로 한 명령어로부터 ‘3번째 이후’ 번지로 접근

 

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

  • 오퍼랜드와 베이스 레지스터 값을 더해 유효 주소 얻는 방식
  • 베이스 레지스터 : 기준 주소
  • 오퍼랜드 : 기준 주소로부터 떨어진 거리
  • 베이스 레지스터 속 기준 주소로부터 얼마나 떨어진 주소에 접근할 것인지 연산해 유효 주소 얻어냄
  • 베이스 레지스터에 200, 오퍼랜드 50 이라면, 기준 주소 200번지로부터 40만큼 떨어진 250번지로 접근하라는 것

 

 

 

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

명령어 사이클

하나의 명령어가 처리되는 주기

 

▶ 예시 : 메모리에 저장된 명령어 하나 실행

  • 명령어 사이클①(인출 사이클(fetch cycle)): 명령어, 메모리 → CPU로 가져오기

  • 명령어 사이클②(실행 사이클(execution cycle)): 명령어 실행
    • 제어장치가 명령어 레지스터(IR) 담긴 값 해석, 제어 신호 발생

 

  • 프로그램의 명령어들은 인출/실행 사이클 반복하며 실행됨

 

  • cf. 간접 사이클(indirect cycle)

 

인터럽트

CPU의 정상적인 작업을 방해하는 신호

  • 인터럽트 종류 : 동기 인터럽트, 비동기 인터럽트
  • 동기 인터럽트(synchronous interrupt)
    • CPU에 의해 발생하는 인터럽트
    • CPU가 실행하는 프로그래밍 상 오류 같은 예외적인 상황 마주쳤을 때 발생
    • 예외(exception)이라고 부름

  • 비동기 인터럽트(asynchronous interrupt)
    • 주로 입출력장치에 의해 발생하는 인터럽트
    • 키보드, 마우스같은 입출력장치가 어떠한 입력을 받아들였을 때 처리하기 위해 CPU에 입력 알림(인터럽트)를 보냄
    • 하드웨어 인터럽트 라고도 함

 

하드웨어 인터럽트

  • CPU가 입출력 작업 도중에 효율적으로 명령어를 처리하기 위해 사용함
  • CPU가 프린터에 출력을 명령했을 때, 주기적으로 프린트 완료 여부를 확인할 필요 없이 프린트 완료 인터럽트를 받을 때까지 다른 작업을 처리할 수 있음
  • 하드웨어 인터럽트 처리 순서
    1. 입출력장치는 CPU에 인터럽트 요청 신호를 보냄
    2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인함
    3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부 확인
    4. 인터럽트를 받아들일 수 있으면, CPU는 지금까지의 작업을 백업함
    5. CPU는 인터럽트 벡터를 참조해 인터럽트 서비스 루틴을 실행함
    6. 인터럽트 서비스 루틴 실행이 끝나면, CPU가 백업한 작업을 복구해 실행을 재개함
  • 인터럽트 요청 신호 : CPU의 정상적인 실행 흐름을 끊기 위해 CPU에 끼어 들어도 되는지 질의

  • 인터럽트 플래그 : CPU가 인터럽트 요청을 수용하기 위해서 인터럽트 플래그가 활성화되어 있어야 함
    • 인터럽트 플래그가 ‘불가능’으로 설정되어 있다면, CPU는 인터럽트 요청이와도 무시함
    • cf. 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아님
      • 하드웨어 인터럽트는 가장 우선순위가 높은 인터럽트이므로 정전, 하드웨어 고장 등 인한 인터럽트는 무시할 수 없음

 

  • 인터럽트 서비스 루틴(ISR; Interrupt Service Routine) : 인터럽트 처리 위한 프로그램 == 인터럽트 핸들러
    • 인터럽트 발생 시 어떻게 처리/작동해야 할 지 대한 정보로 이루어짐

 

  • 인터럽트 벡터 : 인터럽트 서비스 루틴 식별
    • 서비스 루틴의 시작 주소 알 수 있음
    • 인터럽트 벡터 통해 특정 인터럽트 서비스 루틴을 처음부터 실행할 수 있음

 

  • 인터럽트 요청 받기 전까지 CPU가 수행하고 있었던 일은 인터럽트 서비스 루틴이 끝나면 되돌아와 마저 수행해야 함
    • 인터럽트 서비스 루틴 실행 전, 지금까지의 작업 내역들을 스택에 백업
    • 인터럽트 서비스 루틴 시작 주소 위치한 곳으로 프로그램 카운터 값 갱신 후 인터럽트 서비스 루틴 실행
    • 인터럽트 서비스 루틴 실행 후, 스택에 저장해 둔 값 다시 불러와 이전까지 수행하던 작업 재개
  • CPU의 명령어 사이클 정리

 

예외의 종류

  • 예외 발생 시, CPU는 하던 일을 중단하고 해당 예외 처리함
  • 예외 처리 후 다시 본래 하던 작업으로 되돌아와 실행 재개
  • 본래 하던 작업으로 되돌아왔을 때 예외가 발생한 명령어부터 실행? 혹은 예외가 발생한 다음 명령어부터 실행? 에 따라 폴트&트랩으로 나뉨
  • 폴트(fault) : 예외 처리 직후, 예외가 발생한 명령어부터 실행 재개
  • 트랩(trap) : 예외 처리 직후, 예외가 발생한 명령어의 다음 명령어부터 실행 재개
    • 주로 디버깅(debugging) 시
  • 중단(abort) : CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류 발생했을 때 발생하는 예외
  • 소프트웨어 인터럽트(software interrupt) : 시스템 호출 발생 시
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.