비전공자를 위한 CS 지식: 2. CPU 의 작동 원리

xellos·2023년 2월 12일
1

CS

목록 보기
2/7

목표

개발자로 근무하면서 기획자나, QA, 운영하시는 분들께 종종 질문들을 받습니다.

  • 레디스랑, Kafka 랑 뭐가 다른거에요?
  • 왜 로그파일은 실시간으로 쌓이지 않고 약간의 딜레이가 있나요?
  • 이번에 문제가 발생한 서버는 왜 메모리만 더 추가하면 되나요?
  • 왜 파일로 저장하지 않고 캐시(메모리)를 쓰는건가요, 그렇게 느린가요? 왜 느린거에요?

위와 같은 다양한 질문들을 받고 설명할 때, 경력과 근무하시는 환경에 따라 CS에 대한 이해가 각각 다르시기 때문에 어떻게 설명을 드려야 하는지 가끔 막막할 때가 있었습니다.

그럴 때마다 CS에 대해 비전공자 분들도 이해하실 수 있는 문서가 있어서 이를 바탕으로 설명할 수 있었으면 좋겠다고 생각했습니다.

이 글은 이처럼, 개발자와 같이 협업하면서 일하시는 분들이 이해하시면 좋을 내용과 원활한 설명을 위한 레퍼런스로써 역할을 수행할 수 있도록 하기 위해 작성되었습니다.

대상

  • 비전공자
  • 비전공 개발자
  • 개발자와 협업하시는 다양한 직군의 많은 분들

출처

이 포스트는 강민철 님의 [혼자 공부하는 컴퓨터 구조+운영체제] 를 읽고 요약・정리한 글입니다.

내용

1. ALU와 제어장치

1) ALU

ALU는 계산하는 부품으로서 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행한 연산을 알려주는 제어신호를 받아들입니다. ALU는 레지스터와 저장장치로부터 받아들인 피연산자와 제어신호로 산술 연산, 논리 연산 등 다양한 연산을 수행합니다.

CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느립니다. ALU가 연산할 때마다 결과를 메모리에 저장한다면 당연하게도 CPU는 메모리에 자주 접근하게 되고, 이는 CPU가 프로그램 실행 속도를 늦출 수 있습니다. 그래서 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장합니다.

2) 제어 장치

제어장치는 제어신호를 내보내고, 명령어를 해석하는 부품입니다. 그리고 제어신호는 컴퓨터 부품을 관리하고 작동시키기 위한 일종의 전기신호입니다. 제어장치가 받아들이는 정보는 다음과 같습니다.

  • 클럭신호
    클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간단위 입니다. 클럭의 주기에 맞춰 한 레지스터에서 다른 레지스터로 이동하거나 ALU에서 연산이 수행되거나 CPU가 메모리에 저장된 명령어를 읽어들빈다.

다만, '컴퓨터의 모든 부품이 클럭신호에 맞춰 동작한다 == 컴퓨터의 모든 부품이 한 클럭마다 동작한다' 가 아닙니다. 컴퓨터의 모든 부품은 클럭이라는 박자에 맞춰 동작할 뿐 한 박자마다 작동하는 것은 아닙니다.

  • 해석할 명령어
    CPU가 해석할 명령어는 명령어 레지스터라는 특별한 레지스터에 저장됩니다. 제어장치는 이 명령어 레지스터로부터 해석할 명령어를 받아들이고 해석한 뒤, 제어신호를 발생시켜 컴퓨터 부품들에 수행할 내용을 알려줍니다.

  • 플래그 레지스터 속 플래그 값

  • 시스템 버스, 그중에서도 제어버스로 전달된 제어 신호.
    제어신호는 CPU 뿐만 아니라 외부장치도 발생시킬 수 있습니다. 제어장치는 제어버스를 통해 외부로부터 전달된 제어신호를 받아들이기도 합니다.

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

CPU가 하나의 명령어를 처리하는 과정에는 어떤 정해진 흐름이 있고, CPU는 그 흐름을 반복하며 명령어들을 처리해나갑니다. 이렇게 하나의 명령어를 처리하는 정형화된 흐름을 명령어 사이클이라고 합니다.

1) 명령어 사이클

프로그램은 수많은 명령어로 이루어져있고, CPU는 이 명령어들을 하나씩 실행합니다. 이때 프로그램 속 각각의 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 합니다.

프로그램을 이루는 수 많은 명령어는 메모리에 있는 명령어를 CPU로 가져오는 인출 사이클과 CPU 로 가져온 명령어를 실행하는 실행 사이클을 반복하며 실행됩니다.

하지만 모든 명령어가 이렇게 간단히 실행되는 것은 아닙니다. 명령어를 인출하여 CPU로 가져왔다 하더라도 곧바로 실행할 수는 없기 때문입니다. 명령어를 실행하기 위해서는 메모리 접근을 한 번 더 해야하기 때문입니다.

이 단계를 간접 사이클이라고 합니다. 간접 사이클까지 추가한 명령어 사이클 도식은 아래와 같습니다.

하지만, 명령어 사이클은 이게 끝이 아닙니다. 아직 고려할 것이 하나 더 남아있는데, 바로 인터럽트 입니다.

2) 인터럽트

인터럽트는 현시대의 컴퓨터 동작을 이해하기 위한 개념중 가장 중요한 요소입니다. CPU는 수행중인 작업을 방해받아 잠시 중단될 수 있는데 이렇게 CPU 의 작업을 방해하는 신호를 인터럽트라고 합니다.

동기 인터럽트는 CPU에 의해 발생하는 인터럽트입니다. CPU가 명령을 수행하다가 예상치 못한 상황에 마주쳤을 때, 가령 CPU가 실행하는 프로그래밍 상의 오류와 같은 예외적인 상황에 발생합니다. 이 때문에 동기 인터럽트 자체를 예외라고 합니다.

비동기 인터럽트는 주로 입출력 장치에 의해 발생하는 인터럽트입니다.

  • 프린터기와 같은 입출력 장치에 입출력 작업을 부탁하면 작업을 끝낸 입출력 장치가 CPU 에 완료를 알림(인터럽트)을 보냅니다.
  • 키보드, 마우스와 같은 입출력 장치가 어떤 입력을 받아들였을 때 이를 처리하기 우해 CPU에 입력 알림(인터럽트)을 보냅니다.

일반적으로 비동기 인터럽트를 인터럽트라고 하지만 여기서는 하드웨어 인터럽트라고 이해하면 됩니다.

하드웨어 인터럽트

하드웨어 인터럽트는 알림과 같은 인터럽트입니다. CPU는 입출력 작업 도중에도 효율적으로 명령어를 처기하기 위해 이런 알림과 같은 하드웨어 인터럽트를 사용합니다.

가령 CPU가 프린터기에 출력을 명령했다고 가정해봅시다. 입출력 장치는 CPU보다 속도가 현저히 느리기 때문에 CPU는 입출력 작업의 결과를 바로 받아볼 수 없습니다. 이때 만약 하드웨어 인터럽트를 사용하지 않는다면 CPU는 프린터가 언제 프린트를 끝낼지 모르기 때문에 주기적으로 프린터의 완료 여부를 확인해야 합니다. 이로인해 CPU는 다른 생산적인 일을 할 수 없으니 CPU 사이클 낭비입니다.

하지만, 하드웨어 인터럽트를 이용한다면 CPU는 주기적으로 프린터 완료 여부를 확인할 필요가 없습니다. CPU는 프린터로부터 프린트 완료 인터럽트를 받을 때까지 다른 작업을 처리할 수 있습니다.

하드웨어 인터럽트 순서

결국, CPU는 아래와 같은 과정을 반복해나가며 프로그램을 실행합니다.

0개의 댓글