본문 바로가기

CS

[CS] CPU의 작동 원리

목차

  • ALU와 제어장치
  • 레지스터
  • 명령어 사이클과 인터럽트

 

ALU와 제어장치

ALU: 계산하는 장치

제어장치: 제어 신호를 발생시키고 명령어를 해석하는 장치

 

ALU - 받아들이는 정보

  • 계산을 하기 위해서는 피연산자와 수행할 연산이 필요
  • ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들인다.

메모리가 아니라 레지스터에 저장하는 이유

  • CPU가 레지스터에 접근하는 속도가 더 빠르기 때문에!

ALU - 내보내는 정보

플래그

연산 결과에 대한 부가 정보(양수, 음수)를 특수한 레지스터인 플래그 레지스터에 저장이 된다.

연산 결과가(결과를 담을 레스터에 비해) 너무 크다면 플래그 레지스터에 저장이 된다. (오버 플로우)

 

플래그의 종류

 

 

 

 

 

제어장치

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

 

  • 클럭 신호: 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위
  • 해석할 명령어:  명령어 레지스터로 부터 받아들인 해석할 명령어
  • 플래그:  부가 정보들을 받아들인다.
  • 제어 신호: 외부로부터 어떤 신호인지 제어 장치가 받아들인다.

 

제어장치 - 내보내는 정보

  • 제어 신호: 내부, 외부에 제어 신호를 내보냄

 

 

 

레지스터

  • CPU 내부에 있는 작은 임시저장장치
  • 프로그램 속 명령어 & 데이터는 실행 전후로 레지스터에 저장
  • CPU 내부에 다양한 레지스터들이 있고, 각기 다른 역할을 가진다.(CPU 마다 다르다)

 

반드시 알아야 할 레지스터

  1. 프로그램 카운터: 메모리에서 가져올 다음으로 실행할 명령어의 주소(메모리에서 읽어 들일 명령어의 주소)
  2. 메모리 주소 레지스터: 메모리의 주소를 저장 - CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거침
  3. 메모리 버퍼 레지스터: 메모리와 주고받을 값(데이터와 명령어) - CPU가 정보를 데이터 버스로 주고받을 때 거침
  4. 명령어 레지스터: 해석할 명령어(방금 메모리에서 읽어 들인 명령어 - 제어장치가 해석)
  5. 플래그 레지스터: 연산 결과 또는 CPU 상태에 대한 부가적인 정보
  6. 범용 레지스터: 다양하고 일반적인 상황에서 자유롭게 사용(보통 여러 개)
  7. 스택 포인터: 스택의 꼭대기를 가르키는 레지스터(스택이 어디까지 차 있는지에 대한 표시)
  8. 베이스 레지스터: 기준 주소를 저장

 

참고

  • 스택은 메모리에 있다
  • 메모리 안에 스택처럼 쓸 수 있는 공간이 미리 지정된 구역이 있다. (스택 영역)

 

특정 레지스터를 이용한 주소 지정 방식(추가)

  • + 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식
  • + 변위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레스터의 값을 더하여 유효 주소 얻기
    •   상대 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소 얻기
    •   베이스 레지스터 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기

 

 

순차적인 실행 흐름이 끊기는 경우도 있다!!

  • 특정 메모리 주소로 실행 흐름을 이동하는 명령어를 실행 시
  • 예) JUMP, CONDITIONAL JUMP, CALL, RETURN
  • 인터럽트 발생 시
  • 그외의 이유들

 

 

명령어 사이클과 인터럽트

명령어 사이클

  • 프로그램 속 명령어들은 일정한 주기가 반복되며 실행
  • 이 주기를 명령어 사이클 이라고 함

메모리에 저장된 명령어를 실행하려면?

  • 인출 사이클: 가장 먼저 CPU로 가져와야 한다.
  • 실행 사이클: 갖고 왔으면 실행해야 한다.
  • 보통 사이클 => 인출 - 실행 - 인출 - 실행 ...

 

그러데 CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있다.

  • 간접 사이클: 가져온 인출 몇 번 더 메모리 접근을 해야하는 경우
  • 인출 - 간접 - 실행 - 인출 - 실행

 

 

인터럽트

 

인터럽트: 위 두가지 방식의 사이클(흐름)을 끊어버리는 것(방해하다, 중단시키다)

  • 'CPU가 꼭 주목해야 할 때', 'CPU가 얼른 처리해야 할 다른 작업이 생겼을 때' 발생

 

인터럽트의 종류

  • 동기 인터럽트(예외): CPU가 예기치 못한 상황을 접했을 때 발생
  • 비동기 인터럽트(하드웨어 인터럽트): 주로 입출력 장치에 의해 발생

 

동기 인터럽트(예외)의 종류

  • 폴트
  • 트랩
  • 중단
  • 소프트웨어 인터럽트

 

 

비동기 인터럽트(하드웨어 인터럽트)

  • 주로 입출력 장치에 의해 발생
  • 알림(세탁기 완료 알림, 전자레인지 조리 알림)과 같은 역할
  • 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터렙트 사용

입출력 장치는 CPU에 비해서 느리다.

인터렙트가 없다면 CPU는 프린트 완료 여부를 확인하기 위해 주기적으로 확인해야 한다.

 

 

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

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

 

참고

  • 인터럽트 요청 신호: CPU의 작업을 방해하는 인터럽트에 대한 요청
  • 인터럽트 플래그: 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
  • 모든 익터럽트를 처리할 수 있는 건 아니다. (non-maskable interrupt)
  • 인터럽트 서비스 루틴: 인터럽트가 발생했을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램
  • 인터럽트 서비스 루틴은 프로그램이기 때문에 메모리에 저장되어 있다.
  • 인터럽트 벡터: 인터럽트 서비스 루틴의 시작주소를 포함하는 인터럽트 서비스 루틴의 식별 정보

 

정리

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

 

명령어 사이클

 

 

 

 


해당 포스팅에 나온 글과 이미지들은 강민철 저자님의 혼자 공부하는 컴퓨터 구조 + 운영체제의 책과 강의를 참고하여 만들어졌습니다.

책에서 보다 깊게 나오는 내용이 있으므로 한번 구매하고 보셔도 좋을 것 같습니다.

 

[한빛미디어] 혼자 공부하는 컴퓨터 구조+운영체제

좋은 개발자는 컴퓨터를 분석의 대상으로 바라볼 뿐, 두려워하지 않는다!‘전공서가 너무 어려워서 쉽게 배우고 싶을 때’, ‘개발자가 되고 싶은데 뭐부터 봐야 하는지 모를 때’ ‘기술 면접

hongong.hanbit.co.kr

 

'CS' 카테고리의 다른 글

[CS] 메모리, 캐시 메모리  (0) 2024.05.23
[CS] CPU의 성능 향상 기법  (0) 2024.05.22
[CS] 명령어  (0) 2024.05.22
[CS] 정보 단위, 인코딩  (1) 2024.05.22
[CS] 컴퓨터 구조  (0) 2024.05.21