혼자 공부하는 컴퓨터 구조 + 운영체제 Section 4. CPU의 작동 원리

jihyelee·2023년 7월 7일
0

achitecture-os

목록 보기
4/15
post-custom-banner

강의 링크

CPU의 작동 원리

  • CPU
    • ALU
    • 레지스터
    • 제어장치

ALU

  • 계산하는 장치
  • 계산을 하기 위해서는 피연산자와 수행할 연산이 필요
    • 레지스터로부터 피연산자를, 제어장치로부터 제어 신호(수행할 연산)를 받아들임
  • 결괏값: 숫자, 문자, 주소, ...
  • 플래그: 연산 결과에 대한 부가 정보
    • e.g. 연산 결과가 음수, 연산 결과가 0, 연산 결과가 (결과가 담을 레지스터에 비해) 너무 크다(=overflow)

제어장치

  • 제어 신호를 발생시키고 명령어를 해석하는 장치
  • 클럭: 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위

레지스터

  • CPU 내부의 작은 임시저장장치
  • 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장
  • 반드시 알아야 할 레지스터 (CPU 종류마다 레지스터 종류는 다름)
    • 프로그램 카운터
      • 메모리에서 가져올 명령어의 주소 (메모리에서 읽어들일 명령어의 주소)
      • instruction pointer (명령어 포인터) 라고 부르는 CPU도 있음
    • 명령어 레지스터
      • 해석할 명령어 (방금 메모리에서 읽어 들인 명령어)
      • 제어장치가 해석
    • 메모리 주소 레지스터
      • 메모리의 주소
      • CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터
    • 메모리 버퍼 레지스터
      • 메모리와 주고받을 값 (데이터와 명령어)
      • CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터
    • 플래그 레지스터
      • 연산 결과 또는 CPU 상태에 대한 부가적인 정보
    • 범용 레지스터
      • 다양하고 일반적인 상황에서 자유롭게 사용
      • 주소, 명령어, 데이터 등 다양하게 담을 수 있음
    • 스택 포인터
      • 스택 주소 지정 방식에서 사용 (스택, 스택 포인터 이용)
      • 스택 포인터란 스택의 꼭대기를 가리키는 레지스터 (스택이 어디까지 차 있는지에 대한 표시)
    • 베이스 레지스터
      • 기준 주소 저장
      • 변위 주소 지정 방식에서 사용
        • 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻는 방식
        • 연산 코드 + 레지스터(프로그램 카운터 or 베이스 레지스터) + 오퍼랜드 형식으로 표현
        • 1) 상대 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더함
        • 2) 베이스 레지스터 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더함

예시) 프로그램 실행

  • 메모리의 1000번지에서 1500번지까지 1101, 1111, ... 1000 등 실행될 프로그램 명령어가 저장
  • [프로그램 카운터]에서 1000 (메모리의 프로그램 실행 시작 주소) 가지고 있음
  • [프로그램 카운터]에서 [메모리 주소 레지스터]에 1000 복사
  • [메모리 주소 레지스터]에서 주소 버스를 통해 메모리로 메모리 주소(1000)가 이동, 제어 장치에서 제어신호(메모리 읽기)가 제어 버스를 통해 메모리로 이동
  • [프로그램 카운터]의 값 1 증가 (프로그램 순차 실행), 메모리에서 데이터버스를 통해 주소 1000에 저장된 값 1101이 [메모리 버퍼 레지스터]로 이동
  • [메모리 버퍼 레지스터]에서 [명령어 레지스터]에 1101이 복사됨

순차적인 실행 흐름이 끊기는 경우

  • 특정 메모리 주소로 실행 흐름을 이동하는 명령어 실행 시
    • e.g. JUMP, CONDITIONAL JUMP, CALL, RET
  • 인터럽트 발생 시

명령어 사이클

  • 프로그램 속 명령어들은 일정한 주기가 반복되며 실행
    • 주기 = 명령어 사이클
    • 일반적으로 인출-실행의 반복
  • 인출 사이클
    • 메모리에 저장된 값을 CPU 내부로 가져오는 작업 = 인출
  • 실행 사이클
    • 가져온 프로그램을 실행
  • 간접 사이클
    • CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우 (e.g. 간접주소지정방식) 존재
    • 메모리 접근이 더 필요한 경우 간접 사이클 필요 (인출-간접-실행)

인터럽트 (interrupt)

  • CPU가 꼭 주목해야 할 때, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생
  • 동기 인터럽트 (예외)
    • CPU가 예기치 못한 상황을 접했을 때 발생
    • e.g. 폴트, 트랩, 중단, 소프트웨어 인터럽트
  • 비동기 인터럽트 (하드웨어 인터럽트)
    • 주로 입출력장치에 의해 발생
      • 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 사용
      • 입출력장치는 CPU에 비해 느림
      • 인터럽트가 없다면 CPU가 주기적으로 입출력장치의 작업이 끝났는지 확인해야
      • 하지만 인터럽트가 있다면, 입출력작업 동안 CPU는 다른 작업 처리 가능
    • 알림과 같은 역할

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

  • 입출력장치가 CPU에 인터럽트 요청 신호를 보냄
    • 인터럽트 요청 신호란, CPU의 작업을 방해하는 인터럽트에 대한 요청
  • CPU는 실행 사이클을 끝내고 명령어 인출 전 인터럽트 여부 확인
  • CPU가 인터럽트 요청 확인, 인터럽트 플래그를 통해 인터럽트를 받아들일 수 있는지 여부 확인
    • 인터럽트 플래그란, 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
    • 플래그 레지스터에는 부호, 제로, 캐리, 오버플로우, 인터럽트, 슈퍼바이저 플래그 등을 가짐
    • 모든 인터럽트를 인터럽트 플래그로 막을 수 있는 것은 아님
      • 막을 수 있는 인터럽트 = maskable interrupt
      • 막을 수 없는 인터럽트 = non maskable interrupt (e.g. 고장, 정전)
  • 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업
  • CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
    • 인터럽트 서비스 루틴이란, 인터럽트가 발생했을 때 해당 인터럽트를 처리하기 위한 프로그램
      • 프로그램이기 때문에 메모리에 저장
    • 인터럽트 벡터란, 각각의 인터럽트를 구분하기 위한 정보 (인터럽트 서비스 루틴의 식별정보)
      • CPU가 해당 인터럽트 서비스 루틴의 시작주소를 알기 위해 필요
  • 서비스 루틴 실행이 끝나면 백업해둔 작업을 복구하여 실행 재개
    • 인터럽트를 처리할 때 CPU의 프로그램 카운터, 메모리 주소 레지스터, 메모리 버퍼 레지스터, 명령어 레지스터에 든 내용을 모두 메모리의 스택에 백업해야
profile
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher at LG CNS AI Lab
post-custom-banner

0개의 댓글