[혼공학습단 9기] 혼자 공부하는 컴퓨터 구조+운영체제 : 2주차

김세린·2023년 1월 15일
0
post-thumbnail

Chapter 4. CPU의 작동 원리

04-1. ALU와 제어장치

💡 학습내용

  • ALU가 내보내고 받아드리는 정보
  • 제어장치가 내보내고 받아들이는 정보
  • ALU와 제어장치의 회로에 대한 내용은 다루지 않을 예정

ALU

  • ALU는 계산하는 장치(계산기와 유사)

  • ALU가 반환하는 값

    • 계산의 결과값

      • ALU의 계산을 위해서는 레지스터로 받는 피연산자와 제어장치로부터 받는 수행할 연산(제어신호)이 필요하다.
      • 계산한 결과값은 레지스터에 저장된다.(숫자, 문자, 주소와 같은 형태로 저장된다.)
      • 메모리가 아니라 레지스터에 저장하는 이유는 CPU가 메모리에 접근하는 것보다 레지스터에 접근하는 속도가 빠르기 때문이다.
    • 플래그

      • 연산결과에 대한 부가정보(ex. 양수/음수 판단)
      • 특수한 레지스터인 플래그 레지스터에 저장된다.
      • 플래그의 종류
      • 플래그 저장 방법

제어장치

  • 제어 신호를 발생시키고 명령어를 해석하는 장치
  • 제어장치가 받아들이는 정보의 종류
    • 클럭(clock)
      • 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
    • 해석할 명령어
      • 명령어 레지스터에 저장되어 있는 해석할 명령어를 받아들인다.
    • 플래그
      • 플래그 레지스터에 저장되어 있는 플래그 정보를 받아들인다.
    • 제어신호
      • 외부에서 발생되는 제어 신호를 받아들인다.
      • 제어신호는 제어장치에서만 발생되는것이 아님
  • 제어장치가 내보내는 정보의 종류
    • CPU내부에 전달하는 제어신호 전달
      • 레지스터 : 레지스터간의 행동 정보에 관한 제어신호 전달
      • ALU : 수행할 연산
    • CPU외부에 전달하는 제어신호
      • 메모리 : 메모리를 읽어라/써라 등과 같은 제어신호 전달
      • 입출력장치 : 입출력장치를 읽어라/써라 등과 같은 제어신호 전달

04-2. 레지스터

레지스터

  • CPU내부에 있는 작은 임시저장 장치
  • 프로그램 속 명령어 및 데이터는 프로그램 실행 전후로 레지스터에 값이 저장되기 때문에 프로그래머 입장에서 중요한 개념이다.
  • CPU 내부에는 다양한 레지스터들이 있고 각자 다른 역할을 가진다.
  • CPU마다 레지스터 종류는 다 다르다.
  • 레지스터의 종류
    레지스터역할설명
    프로그램 카운터메모리에서 가져올 명령어의 주소를 저장메모리에서 읽어 들일 명령어의 주소
    (프로그램을 순차적으로 수행할 수 있게 해준다)
    명령어 레지스터해석할 명령어를 저장
    (방금 메모리에서 읽어들인 명령어)제어장치가 해석
    메모리 주소 레지스터메모리의 주소를 저장CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼때 거치는 레지스터
    메모리 버퍼 레지스터메모리와 주고받을 값(데이터와 명령어) 저장CPU가 정보를 데이터 버스로 주고받을때 거치는 레지스터
    플래스 레지스터연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장
    범용 레지스터다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터
    스택 포인터특별한 주소 지정에 사용하는 레지스터스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식
    스택포인터 : 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시)
    스택의 위치 : 스택은 메모리 안에 스택처럼 쓸 수 있는 공간이 지정되어 있다. |
    | 베이스 레지스터 | 특별한 주소 지정에 사용하는 레지스터 | 변위 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻는 주소 지정 방식
    베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기 |

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

명령어 사이클

  • 프로그램 속 명령어들은 일정한 주지가 반복되며 실행되는데, 이 반복의 주기를 일컫는다.
  • CPU의 실행 방식
    • 인출사이클과 실행사이클에 의해 인출과 실행이 반복되며 진행된다.
    • 인출사이클 : 가장 먼저 CPU로 값을 가져온다
    • 실행사이클 : 인출 사이클에 의해 가져온 값을 실행한다.
    • 간접사이클 : CPU 명령어를 가지고 와도 바로 실행이 불가능하고, 메모리 접근이 더 필요한 경우 실행된다.

인터럽트

  • 인터럽트(interrupt) : 방해하다/ 중단시키다.

  • 정해진 흐름대로 처리하고 있는 CPU를 방해/끊는 것

  • CPU가 인터럽트를 처리한다. = 인터럽트 서비스 루틴을 실행하고 본래 수행하던 작업으로 다시 되돌아온다(인터럽트의 시작 주소를 인터럽트 벡터를 통해 알 수 있다)

  • 발생 시점

    • CPU가 꼭 주목해야할때
    • CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생
  • 인터럽트의 종류

    • 동기 인터럽트(예외)

      • CPU가 예기치 못한 상황을 접했을 때 발생
      • 종류
        • 폴트
        • 트랩
        • 중단
        • 소프트웨어 인터럽트
    • 비동기 인터럽트(하드웨어 인터럽트)

      • 주로 입출력 장치에 의해 발생

      • 알림과 같은 역할을 함

      • 사용 목적 :

        • 입출력 작업 도중 효율적으로 명령어를 처리하기 위해 사용
        • 입출력 장치는 CPU에 비해 느리기 때문 사용
          • 만약 인터럽트가 없다면 CPU는 입출력 작업 처리 완료 여부를 알기 위해 주기적으로 확인해야한다.
          • 인터럽트가 있다면 입출력 작업 동안 CPU는 다른 일을 할 수 있게 된다.
      • 하드웨어 인터럽트의 처리 순서

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

        • 인터럽트 요청신호

          • 지금 인터럽트해도 되는지 요청하는 신호
        • 인터럽트 플래그

          • 인터럽트 요청 신호 발생 시, 플래그 레지스터에서 인터럽트를 받아들일 수 있는지 알기 위해 확인하는 플래그
          • 단, 막을 수 없는 인터럽트(non maskable interrupt)는 인터럽트 플래그로도 막을 수 없다.
        • 인터럽트 서비스 루틴

          • 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리할지에 대한 프로그램
          • CPU가 인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴이 실행되며 메모리에 저장된다.
        • 인터럽트 벡터

          • 각각의 인터럽트를 구분하기 위한 정보

Chapter 5. CPU 성능 향상 기법

05-1. 빠른 CPU를 위한 설계 기법

클럭

  • 클럭 속도 : 헤르츠(Hz) 단위로 측정
  • 헤르츠(Hz) : 1초에 클럭이 반복되는 횟수
    • 1초에 한번 반복되면 1Hz / 100번 반복되면 100Hz
  • 클럭 속도를 필요 이상으로 높이면 발열이 심각해져서 한계가 있음

CPU를 빠르게하는 방법은?

  • 코어 수를 늘리는 방법(듀얼 코어 멀티코어
  • 스레드 수를 늘리는 방법(멀티스레드

코어와 멀티코어

  • 코어(Core)
    • 전통적으로 명령어를 실행하는 부품은 원칙적으로 하나만 존재해야한다.
      • (과거) 명령어를 실행하는 부품 = CPU
    • 하지만 오늘날 CPU에는 명령어를 실행하는 부품이 여러개 존재한다.
      • (현재) 명령어를 실행하는 부품 * n = CPU
    • 이러한 명령어를 실행하는 부품을 코어라고 한다.
  • 멀티코어
    • 코어가 2개 이상인 코어를 일컫는다
      코어 수프로세서 명칭멀티코어
      1싱글코어(single-core)
      2듀얼코어(dual-core)O
      3트리플코어(triple-core)O
      4쿼드코어(quad-core)O
      6헥사코어(hexa-core)O
      8옥타코어(octa-core)O
      10데카코어(deca-core)O
      12도데카코어(dodeca-core)O
    • 코어수에 비례하여 증가하는 개념은 아니다

스레드와 멀티 스레드

  • 스레드
    • 실행 흐름의 단위
    • 스레드의 종류
      • 하드웨어적 스레드(논리프로세서)
        • 하나의 코어가 동시에 처리하는 명령어의 단위
          • 1코어 1스레드 CPU
        • 멀티스레드 프로세서(멀티스레드 CPU)
          • ex. 2코어 4스레드 CPU : 2개의 코어가 4개의 명령어를 한번에 실행할 수 있다.
          • 멀티스레드 프로세서를 설계할 때 가장 큰 핵심은 레지스터이다.
          • 레지스터 세트가 여러개 있으면 하나의 코어가 여러개의 명령어를 실행할 수 있다.
      • 소프트웨어적 스레드
        • 하나의 프로그램에서 독립적으로 실행되는 단위
        • (이후 운영체제 파트에서 더 다룰 예정)

05-2. 명령어 병렬 처리 기법

명령어 파이프라인

  • 명령어가 처리되는 과정을 비슷한 시간 간격으로 나누었을때
    1. 명령어 인출
    2. 명령어 해석
    3. 명령어 실행
    4. 결과저장
  • 같은 단계가 겹치지만 않는다면 CPU는 ‘각 단계를 동시에 실행’할 수 있다.
  • 명령어 파이프라이닝
    • 동시에 여러개의 명령어를 겹쳐 실행하는 기법
  • 명령어 파이프라인을 사용하지 않는다면 시간이 오래걸리게 된다.
  • 파이프라인 위험
    • 명령어 파이프라인이 성능 향상에 실패하는 경우
    • 종류
      • 데이터위험
        • 명령어간의 의존성에 의해 야기
        • 이전 명령어를 끝까지 실행해야지만 실행할 수 있는 경우
      • 제어위험
        • 프로그램 타운터의 갑작스러운 변화에 의해 야기
      • 구조적위험
        • 서로 다른 명령어가 같은 CPU부품(ALU, 레지스터)를 사용하려고 할때 야기

슈퍼 스칼라

  • CPU 내부에 여러개의 명령어 파이프라인을 포함한 구조(= 멀티스레드 프로세서)
  • 이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가하지만 파이프라인 위험도도 함께 증가하기 때문에 결론적으로 파이프라인 개수에 비례하여 처리속도가 증가하진 않는다.

비순차적 명령어 처리

  • 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법(합법적인 새치기)
  • 아무 명령아나 순서를 바꿀 수 있는 것은 아니다.
  • 비순차적 명령어 처리를 통해 파이프라이닝을 더 효율적으로 실행시킬 수 있다.
  • 비순차적 명령어 처리를 통해 순서를 바꾸어도 전체 프로그램의 실행 흐름에는 영향이 없다.

05-3. CISC와 RISC

명령어 집합

  • 명령어의 세세한 생김새, 연산방식, 주소지정방식은 CPU마다 다르다
  • 명령어 집합(구조) - ISA(Instruction Set Architecture) : CPU가 이해할 수 있는 명령어들의 모음(CPU 언어와 유사)
    • 명령어가 달라지만 그에 대한 나비 효과로 많은 것이 달라진다.
      • ex. 명령어 해석 방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성 등
    • CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속
    • 종류
      • CISC & RISC

CISC & RISC

  • CISC(Complex Instruction Set Computer)
    • 복잡한 명령어 집합을 활용하는 컴퓨터(CPU)
    • 복잡하고 다양한 명령어를 활용한다.
    • 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.
    • 다양하고 강력한 명령어를 활용한다.
    • 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다.
    • 메모리를 최대한 아낄 수 있어 그 시기에 인기가 많았다
    • 명령어 파이프라이닝이 불리하다는 치명적인 단점 발견
      • 명령어가 복잡하고 다양한 기능을 제공하여 명령어의 크기와 실행되기까지의 시간이 일정하지 않음
      • 명령어가 복잡하여 명령어 하나를 실행하는 데에 여러 클럭 주기가 필요
      • 복잡한 명령어는 사용 빈도가 낮음
  • RISC(Reduced Instruction Set Computer)
    • 명령어의 종류가 적고, 짧고 규격화된 명령어 사용
    • 짧고 규격화된 명령어를 활용하기에 명령어 파이프라이닝에 유리함
    • 메모리 접근 최소화(load, store), 레지스터를 많이 활용
    • 단, CISC에 비해 명령어의 종류가 적어 더 많은 명령어로 프로그램을 동작시


MISSION

P125 - 2번 문제

(답) 1 - 플래그 레지스터 / 2 - 프로그램 카운터 / 3 - 범용 레지스터 / 4 - 명령어 레지스터

P155 - 4번 문제

(답) 코어(Core)

profile
성장하는 신입 개발자🌱

0개의 댓글