Cute Running Puppy

cs/[OS] 혼자 공부하는 컴퓨터 구조 + 운영체제

[혼공컴운] chapter 04. CPU의 작동 원리

R.silver 2024. 1. 10. 16:17
반응형

| 참고 도서: 혼자 공부하는 컴퓨터 구조+운영체제

04-1. ALU와 제어 장치

ALU

CPU에서 계산을 하는 부품

레지스터를 통해 피연산자와 제어 신호를 받아들인다.
피연산자와 제어신호를 바탕으로 다양한 연산 수행

>  ALU의 결과 값을 레지스터에 우선 저장하는 이유

  • CPU에서 레지스터에 접근하는 속도는 메모리에 접근하는 속도보다 빠르다
  • 접근 속도를 줄여 프로그램의 실행 속도를 높이기 위해 메모리가 아닌 레지스터에 연산의 결괏값을 저장한다.

>  플래그 (flag)

연산에 대한 추가적인 상태 정보

  • 부호, 제로, 캐리, 오버플로우, 인터럽트, 슈퍼바이저 플래그
    플래그는 플래그 레지스터에 저장된다.
    플래그 레지스터를 통해 연산 결과에 대한 추가적인 정보를 얻을 수 있다.

 

제어장치

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

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

  1. 클럭 신호
    클럭 : 컴퓨터의 시간 단위
    컴퓨터의 모든 부품이 한 클럭마다 작동
  2. 해석할 명령어
    명령어 레지스터: 해설할 명령어가 저장되는 장치
    명령어 레지스터로부터 명령어를 받아들이고 해석 -> 제어 신호 발생
  3. 플래그 레지스터 속 플래그의 값
  4. 제어 버스로 전달된 제어 신호

>  제어장치가 내보내는 정보

  1. CPU 외부에 전달하는 제어 신호
    • 메모리에 저장하는 제어 신호
    • 입출력장치(보조기억장치)에 전달하는 제어 신호
  2. CPU 내부에 전달하는 제어 신호
    • ALU에 전달하는 제어신호 (수행할 연산 지시)
    • 레지스터에 전달하는 제어신호 (레지스터 간 데이터 이동, 저장된 명령어 해석)

04-2. 레지스터

프로그램 속 명령어, 데이터는 실행 전후로 반드시 레지스터에 저장된다.
-> 레지스터디 저장된 값을 잘 관찰하면 프로그램의 실행 흐름을 파악할 수 있다.

반드시 알아야 할 레지스터

  1. 프로그램 카운터 (PC)
    메모리에서 가져올 명령어의 주소 저장
    (== 명령어 포인터)
  2. 명령어 레지스터
    메모리에서 읽어 들인 명령어를 저장하는 레지스터
    제어장치는 명령어 레지스터 속 명령어를 받아들이고, 해석한 뒤 제어 신호를 내보냄
  3. 메모리 주소 레지스터
    메모리의 주소를 저장하는 레지스터
    CPU가 읽어 들이고자 하는 주소 값을 주소 버스로 보낼 때 사용
  4. 메모리 버퍼 레지스터
    메모리와 주고 받을 값(데이터, 명령어)을 저장하는 레지스터
    메모리에 쓰고 싶은 값, 전달받은 값 저장
    데이터 버스로 값을 주고 받을 때 사용
  5. 범용 레지스터
    다양하고 일반적인 상황에서 자유롭게 사용하는 레지스터
  6. 플래스 레지스터
    연산 결과, CPU 상태에 대한 부가 정보 등을 저장하는 레지스터
  7. 스택 포인터
    스택 주소 지정 방식에 사용되는 레지스터
  8. 베이스 레지스터
    변위 주소 지정 방식에 사용되는 레지스터

 

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

>  스택 주소 지정 방식

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

  • 스택 포인터: 스택의 꼭대기를 가리키는 레지스터 (스택에 마지막으로 저장한 값의 위치를 저장하는 레지스터)
  • 스택 영역: 메모리 속 스택처럼 사용하도록 지정된 영역특정 레지스터를 이용한 주소 지정 방법(2): 변위 주소 지정 방식오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식
    프로그램 카운터와 베이스 레지스터가 사용된다
  • 변위 주소 지정 방식 명령어 = 연산 코드 + 레지스터 + 오퍼랜드
    오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라
    "상대 주소 지정 방식", "베이스 레지스터 주소 지정 방식"으로 나뉜다.

>  상대 주소 지정 방식

오퍼랜드와 프로그램 카운터의 값을 더하여 유효 주소를 얻는 방식

  • 프로그램 카운터: 읽어 들일 명령어의 주소가 저장된 곳
  • 예) 오퍼랜드 : +3 -> 프로그램 카운터에 저장된 주소에 + 3 번지에 가서 연산코드에 저장된 연산 수행

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

오퍼랜드와 베이스 레지스터의 값을 더하여 유효 주소를 얻는 방식

  • 베이스 레지스터: 기준 주소
  • 오퍼랜드: 기준 주소로부터 떨어진 거리
    => 베이스 레지스터 속 기준 주소로부터 얼마나 떨어진 주소에 접근할 것인지 연산하여 유효 주소를 얻어내는 방식
  • 예) 베이스 레지스터 : 200, 오퍼랜드: 50 -> 200 + 50 번지에 접근하여 연산을 수행하라

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

  • 명령어 사이클: 하나의 명령어를 처리하는 정형화된 흐름
  • 인터럽트: 명령어 사이클이 끊어지는 상황

명령어 사이클

프로그램 속 명령어들이 반복되어 실행되는 일정한 주기

  1. 인출 사이클
    메모리에 있는 명령어를 CPU로 가지고 오는 단계
  2. 실행 사이클
    CPU로 가져온 명령어를 실행하는 단계
  3. 간접 사이클
    명령어를 실행하기 위해 메모리에 접근하는 단계
    예) 간접 주소 방식을 사용할 때 명령어를 실행하기 위해서는 메모리에 접근하여 유효 주소를 찾아야 한다. 이때 간접 사이클 단계 진입
  4. 인터럽트
    CPU의 작업을 방해하는 신호
    • 동기 인터럽트
      CPU에 의해 발생하는 인터럽트 
      예) CPU가 실행하는 프로그래밍상의 오류 
      예외(exception)라고 부른다. 

    • 비동기 인터럽트
      주로 입출력장치에 의해 발생하는 인터럽트 
      예) CPU가 요구한 작업을 마친 입출력 장치가 보내는 완료 알림
      예) 입출력장치가 입력을 받으들였을 때 이를 처리하기 위한 입력 알림
      하드웨어 인터럽트라고 부른다.

> 하드웨어 인터럽트

알림과 같은 인터럽트
입출력 작업 중에도 CPU가 효율적인 작업을 할 수 있도록 함
(알림이 올 때 까지 입출력장치를 확인하지 않아도 된다. 인터럽트가 올 때만 확인하면 된다.)

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

  1. 입출력장치가 CPU로 인터럽트 요청 신호를 보냄
  2. 실행 사이클이 끝나고 명령어 인출 전 CPU는 항상 인터럽트 여부를 확인
  3. 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 확인
  4. 인터럽트를 받아 들일 수 있다면 CPU는 현재 작업 백업
  5. 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
  6. 인터럽트 서비스 루틴이 끝나면 백업해둔 작업을 복구하여 실행 재개
  • 인터럽트 요청 신호
    인터럽트를 요청하는 신호
    인터럽트 요청을 수용하기 위해서는 플래그 레지스터의 인터럽트 플래그가 활성화 되어 있어야 한다.
  • 인터럽트 플래그
    하드웨어 인터럽트를 받아들일지 말지 결정하는 플래그
    인터럽트 플래그가 불가능으로 설정되어 있다면 인터럽트가 와도 무시된다.
    하지만 정전, 하드웨어 고장으로 인한 인터럽트 등 막을 수 없는 인터럽트는 우선순위가 높아 인터럽트 플래그에 관계 없이 인터럽트가 받아들여진다.
  • 인터럽트 서비스 루틴 (ISR)
    인터럽트를 처리하기 위한 프로그램
    인터럽트 핸들러라고도 부른다.
    해당 인터럽트를 어떻게 처리해야 할지에 대한 정보가 담긴 프로그램
  • CPU가 인터럽트를 처리한다 == 인터럽트 서비스 루틴을 실행하고 이전 작업으로 다시 돌아온다
  • 인터럽트 벡터
    인터럽트 서비스 루틴을 식별하기 위한 정보
    인터럽트 벡터로 인터럽트 서비스 루틴의 시작 주소를 알 수 있다.

=> 인터럽트 신호 발생 -> 인터럽트 플래그가 활성화 되어 있다면 -> 작업을 백업(스택 영역에)하고, 인터럽트 벡터 참조하여 인터럽트 서비스 루틴 실행 -> 백업 해둔 작업 복구 -> 이전 작업 재개

반응형