스터디/컴퓨터구조

[혼자 공부하는 컴퓨터구조와 운영체제] 4_CPU의 작동 원리

왹져박사 2025. 3. 12. 21:46

💡

ALU와 제어장치

레지스터의 종류와 역할

명령어 사이클의 이해

인터럽트의 개념

 


1) ALU와 제어장치

ALU

받는 정보

  • 레지스터를 통해 피연산자
  • 제어장치로부터 수행할 연산을 알려주는 제어 신호

내보내는 정보

  • 연산 수행 결과
    • 연산 수행 결괏값 → 일시적으로 레지스터에 저장 (프로그램 실행 속도를 위해)
  • 플래그
    • 연산 결과에 대한 추가적인 상태 정보
    • 플래그 레지스터에 저장
        • 부호 플래그
        • 제로 플래그
        • 캐리 플래그
        • 오버플로우 플래그
        • 인터럽트 플래그
        • 슈퍼바이저 플래그

 

제어장치

제어 신호를 내보냄, 명령어 해석 부품

제어 신호: 컴퓨터 부품들을 관리/작동시키는 일종의 전기 신호

 

받는 정보

  • 클럭 신호
    • 클럭: 컴퓨터의 모든 부품을 움직일 수 있게 하는 시간 단위
  • 해석해야 할 명령어
    • 명령어 레지스터로부터 받아 해석 → 제어 신호 발생시킴
  • 플래그 레지스터 속 플래그 값
    • 플래그 값을 참고하여 제어 신호 발생시킴
  • 시스템 버스 중 제어 버스로 전달된 제어 신호
    • 외부로부터 전달된 제어 신호 받음

 

내보내는 정보

  • CPU 외부에 전달
  • CPU 내부에 전달 = 제어 버스로 내보냄
    • 메모리에 전달
    • 입출력장치에 전달

 

2) 레지스터

반드시 알아야 할 레지스터

  1. 프로그램 카운터
  2. 명령어 레지스터
  3. 메모리 주소 레지스터
  4. 메모리 버퍼 레지스터
  5. 플래그 레지스터
  6. 범용 레지스터
  7. 스택 포인터
  8. 베이스 레지스터

1. 프로그램 카운터

메모리에서 읽어 들일 명령어의 주소 저장

명령어 포인터라고 부르는 CPU도 있음

 

2. 명령어 레지스터

방금 메모리에서 읽어 들인 명령어를 저장 → 제어장치가 받아 해석 → 제어 신호

 

3. 메모리 주소 레지스터

메모리 주소를 저장

CPU가 읽을 주소 값을 주소 버스로 보낼 때 거침

 

4. 메모리 버퍼 레지스터

메모리와 주고받을 값(데이터와 명령어) 저장

데이터 버스로 주고받을 값이 거침

 

 

(흐름)

프로그램 카운터의 메모리 주소→ 메모리 주소 레지스터 → 제어 버스&주소 버스 → 메모리

→ 저장된 값 → 데이터 버스 → 메모리 버퍼 레지스터 → 명령어 레지스터&프로그램 카운터 증가

→ 제어장치가 명령어 해석 후 제어 신호 발생

→ 증가한 프로그램 카운터의 메모리 주소로 과정 반복

 

위 흐름이 끊기는 경우? 특정 메모리 주소로 이동하는 명령어 실행 / 인터럽트 발생 시

 

5. 플래그 레지스터

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

 

6. 범용 레지스터

범용적인 레지스터

 

 

스택 포인터: 스택 주소 지정 방식에 사용

프로그램 카운터, 베이스 레지스터: 변위 주소 지정 방식

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

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

스택 포인터: 스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터

스택 영역: 메모리 내의 스택처럼 사용할 지정된 영역

 

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

변위 주소 지정 방식: 오퍼랜드 필드의 값(변위) + 특정 레지스터의 값으로 유효 주소를 얻어내는 주소 지정 방식

 

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

(오퍼랜드 필드의 주소 + 어떤 레지스터) 조합에 따라 → 상대 주소 지정 방식/베이스 레지스터 주소 지정 방식 나뉨

 

상대 주소 지정 방식

(오퍼랜드 + 프로그램 카운터의 값)으로 유효 주소를 얻는 방식

프로그램 카운터에 저장된 주소로부터 오퍼랜드만큼 이동한 주소 명령어를 실행

if문과 유사. 특정 주소의 코드 실행할 때 사용

→ 현재 명령어 포인터로부터 오퍼랜드만큼 이동한 주소

 

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

(오퍼랜드 + 베이스 레지스터 값)으로 유효 주소를 얻는 방식

→ 프로그램의 첫 물리 주소로부터 이동한 주소

 

 

프로그램 카운터 vs 베이스 레지스터

베이스 레지스터는 프로그램의 첫 물리 주소 저장

→ 프로그램에 할당된 고정 주소가 저장

프로그램 카운터는 명령어의 포인터로 이동하는 주소 값 저장

혼공컴운 6-2, 아래 링크 참고

https://en.wikipedia.org/wiki/Base_and_bounds#:~:text=In computing base and bounds,contiguous segment of main memory.

 

 


 

명령어 사이클과 인터럽트

CPU가 하나의 명령어를 처리하는 정형화된 흐름: 명령어 사이클

흐름이 끊어지는 상황: 인터럽트

명령어 사이클

CPU가 프로그램 속 명령어들을 실행하는 일정한 주기

 

1. 인출 사이클

메모리의 명령어를 CPU로 가져오는 단계

 

2. 실행 사이클

명령어를 실행하는 단계

제어장치가 명령어 레지스터에 담긴 값 해석, 제어 신호 발생

 

3. 간접 사이클

간접 주소 지정 방식을 사용하여 추가 메모리 접근이 필요한 경우

 

4. 인터럽트

CPU의 작업을 방해하는 신호

  • 동기 인터럽트 = 예외
    • CPU에 의해 발생하는 인터럽트
  • 비동기 인터럽트 = 하드웨어 인터럽트
    • 주로 입출력장치에 의해 발생 → 작업 완료 시 완료 알림

 

하드웨어 인터럽트

명령어를 효율적으로 처리하기 위한 알림.

 

처리 순서

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

 

인터럽트 플래그가 불가능이어도 무시할 수 없는 요청 → 정전/하드웨어 고장으로 인한 인터럽트

 

인터럽트 서비스 루틴 = 인터럽트 핸들러

: 인터럽트 발생 시 메뉴얼

 

인터럽트 벡터

: 인터럽트 서비스 루틴을 식별하기 위한 정보, 인터럽트 서비스 루틴의 시작주소를 알 수 있음

 

‘CPU가 인터럽트를 처리한다’ → ‘인터럽트 서비스 루틴을 실행하고, 본래의 작업으로 되돌아온다’

 

인터럽트 서비스 루틴도 프로그램과 마찬가지로 명령어와 데이터로 이루어져 레지스터를 사용하며 실행

→ 기존 작업 재개를 위한 모든 내용을 스택에 백업

 

 


  • 예외의 종류
    • 폴트
      • 예외가 발생한 명령어부터 실행 재개
    • 트랩
      • 예) 디버깅
      • 예외가 발생한 명령어의 다음 명령어부터 실행 재개
    • 중단
      • 심각한 오류 발견 시
    • 소프트웨어 인터럽트 (9장에서 자세히..)
      • 시스템 호출 발생 시