[컴퓨터구조] CPU 작동 원리

diveintoo·2024년 3월 4일
0

혼공컴운

목록 보기
4/15

📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.

1. ALU와 제어장치

1-1. ALU

ALU는 계산하는 부품

  • 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받는다.
  • return 연산한 결괏값 → 레지스터, 플래그 → 플래그 레지스터
    • 결괏값은 일시적으로 레지스터에 저장된다. 메모리 노노
      • CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리기 때문
    • 플래그 : 연산 결과에 대한 추가적인 상태 정보
      • 부호 플래그, 제로 플래그, 캐리 플래그, 오버플로우 플래그, 인터럽트 플래그, 슈퍼바이저 플래그
      • 얘네들이 플래그 레지스터에 다 저장되어 있음
  • 이외에도 가산기, 보수기, 시프터, 오버플로우 검출기 등 있음

1-2. 제어장치

제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 부품
제어신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 일종의 전기 신호

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

  • 클럭 신호 : 컴퓨터의 모든 부품이 클럭 신호에 맞춰 작동한다.
    • 클럭 : 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
  • 현재 수행할 명령어
    • 명령어 레지스터에서 해석할 명령어를 받아들이고 해석한 뒤, 제어신호를 발생시켜 컴퓨터 부품들에 수행해야 할 내용을 알려준다.
  • 플래그
    • 플래그 레지스터 속에서
  • 제어신호
    • 시스템 버스 중 제어 버스로 전달된다.
      • 제어신호는 CPU 뿐만 아니라 입출력장치 등 외부 장치도 발생시킬 수 있다.

제어장치가 내보내는 정보 : 제어 신호 only.

  • CPU 내부에 전달
    • ALU
      • 수행할 연산 지시
    • 레지스터
      • 레지스터 간 데이터 이동 / 레지스터에 저장된 명령어를 해석하기 위해
  • CPU 외부에 전달
    • 메모리
      • read/write
    • 입출력장치
      • read/write

2. 레지스터

2-1. 반드시 알아야 할 레지스터

  • 프로그램 카운터
    • 메모리에서 읽어들일 명령어의 주소를 저장한다.
    • = 명령어 포인터
  • 명령어 레지스터
    • 해석할 명령어 저장
  • 메모리 주소 레지스터
    • 메모리의 주소 저장
    • CPU가 읽어들이고자 하는 주소 값을 주소 버스로 보낼 때 사용
  • 메모리 버퍼 레지스터
    • 메모리와 주고받을 값(데이터와 명령어)을 저장하는 레지스터
    • 메모리에 쓰고싶은 값이나 메모리로부터 전달받은 값
    • = 메모리 데이터 레지스터
  • 플래그 레지스터
    • 연산 결과 또는 CPU 상태에 대한 부가 정보를 저장
  • 범용 레지스터
    • 데이터와 주소 모두 저장 가능
    • CPU에 여러 개 있삼
  • 스택 포인터
    • 스택에 마지막으로 저장한 값의 위치 저장
  • 베이스 레지스터

2-2. 특정 레지스터를 이용한 주소 지정 방식

스택 주소 지정 방식

  • 스택과 스택 포인터 사용
  • 스택 포인터에 저장된 스택 주소 안에 데이터
    • 스택 : 메모리 안에 스택 영역이 정해짐

변위 주소 지정 방식

  • 오퍼랜드 필드 값과 특정 레지스터 값을 더하여 유효 주소를 알아낸다.
  • 명령어 = 연산 코드 | 레지스터 | 오퍼랜드
  • 상대 주소 지정 방식
    • 유효 주소 = 프로그램 카운터 + 오퍼랜드
    • if문 등 분기 처리할 때 사용
  • 베이스 레지스터 주소 지정 방식
    • 유효 주소 = 베이스 레지스터 + 오퍼랜드

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

3-1. 명령어 사이클

명령어 사이클 : 명령어를 처리하는 일정한 주기

  • 인출 사이클
    • 명령어를 메모리에서 CPU로 가져오는 단계
  • 실행 사이클
    • 명령어 실행 단계 ; 제어장치가 명령어를 해석하고, 제어신호를 발생시키는 단계
  • 간접 사이클
    • 메모리 접근이 더 필요한 경우 ; 유효 주소 가지러
  • 인터럽트 사이클
    • 명령어 실행 단계 ; 제어장치가 명령어를 해석하고, 제어신호를 발생시키는 단계

flowchart LR
  	A[인출 사이클] --> B[실행 사이클]
  	B[실행 사이클] --> A[인출 사이클]
	B[실행 사이클] --인터럽트가 발생한 경우--> D[인터럽트 사이클]
	D[인터럽트 사이클] --> A[인출 사이클]
	A[인출 사이클] --메모리 접근이 더 필요한 경우--> C[간접 사이클]
	C[간접 사이클] --> B[실행 사이클]

3-2. 인터럽트

인터럽트 : CPU 정상적인 작업을 방해하는 신호

  • 동기 인터럽트(예외)
    • CPU에 의해 발생하는 인터럽트
    • Exception
      • 폴트(Fault) : 예외 처리 후 예외 발생 명령어부터 실행 재개 ; 페이지 폴트
      • 트랩(Trap) : 예외 처리 후 예외 발생 명령어 다음부터 실행 재개 ; 디버깅
      • 중단(Abort) : CPU가 실행 중인 프로그램 강제 중단할 만큼 심각한 오류 발견
      • 소프트웨어 인터럽트 : 시스템 호출이 발생
  • 비동기 인터럽트(하드웨어 인터럽트)
    • 입출력장치에 의해 발생하는 인터럽트
    • 알림 역할 → CPU는 입출력 작업 중에도 효율적으로 명령어 처리 가능
    • 막을 수 있는 인터럽트(maskable interrupt) vs 막을 수 없는 인터럽트(non-maskable interrupt)

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

  1. 입출력장치는 CPU에 인터럽트 요청 신호를 보낸다.
    • ask ‘지금 끼어들어도 되나요?’ to CPU
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인한다.
  3. CPU는 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인한다.
    • 플래그 레지스터 > 인터럽트 플래그 : 인터럽트를 받아들일지 무시할지 결정하는 비트
    • 모든 하드웨어 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아니다.
      • 막을 수 없는 인터럽트(non-maskable interrupt) ; 정전, 하드웨어 고장
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
    • 스택에 백업
  5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
    • 인터럽트 서비스 루틴 : 인터럽트를 처리하기 위한 프로그램
      • 어떤 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하고 작동해야 할지
      • 메모리에 각기 다른 인터럽트 서비스 루틴이 저장되어 있다.
      • = 인터럽트 핸들러
    • 인터럽트 벡터 : 인터럽트 서비스 루틴을 식별하기 위한 정보
      • 인터럽트 서비스 루틴의 시작 주소를 알 수 있다.
      • CPU는 하드웨어 인터럽트 요청을 보낸 대상으로부터 데이터 버스에 인터럽트 벡터를 전달받음
  6. 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개한다.

0개의 댓글