profile image

L o a d i n g . . .

CPU의 작동 원리

CPU는 메모리에 저장된 명령어를 읽어들이고 해석하고 실행하는 장치이다.

CPU 내부에는 계산을 담당하는 ALU, 명령어를 읽어들이거 해석하는 제어장치, 작은 임시 저장 장치인 레지스터가 있다.

이번 챕터의 내용은 책에서 정리한 핵심 포인트 위주로 간단하게 정리했다.

ALU와 제어장치

  • ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들인다.
  • ALU는 연산 결과와 플래그를 내보낸다.
  • 연산 결과에 대한 추가적인 상태 정보를 플래그라고 한다.
  • 제어장치(Control Unit) 는 클럭, 현재 수행할 명령어, 플래그, 제어 신호를 받아들인다.클럭의 주기에 맞춰 한 레지스터에서 다른 레지스터로 이동되거나 ALU에서 연산이 수행되거나, CPU에서 메모리에 저장된 명령어를 읽어들인다.
  • 다만, "컴퓨터의 모든 부품이 클럭 신호에 맞춰 작동한다"는 말을
    "컴퓨터의 모든 부품이 한 클럭마다 작동한다"로 이해하면 안된다. 하나의 명령어가 여러 클럭에 걸쳐 실행될 수도 있다.
  • 클럭이란 컴퓨터의 모든 부품을 일사분란하게 움직일 수 있게 하는 시간 단위이다.
  • 제어장치는 CPU 내부와 외부로 제어 신호를 내보낸다.

 

레지스터

  • 프로그램 카운터는 메모리에서 가져올 명령어의 주소, 명령어 레지스터는 해석할 명령어를 저장합니다.
  • 메모리 주소 레지스터는 메모리의 주소, 메모리 버퍼 레지스터는 메모리와 주고받을 데이터를 저장합니다.
  • 범용 레지스터는 데이터와 주소를 모두 저장하고, 플래그 레지스터는 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장합니다.
  • 스택 포인터는 스택 최상단의 위치를 저장합니다.
  • 베이스 레지스터에 저장된 주소는 기준 주소로서의 역할을 합니다.

 

명령어 사이클과 인터럽트

명령어 사이클

명령어 사이클은 하나의 명령어가 처리되는 주기로, 인출, 실행, 간접, 인터럽트 사이클로 구성된다.

인출 사이클
메모리에 있는 명령어를 CPU로 가지고 오는 단계.

실행 사이클
CPU로 가져온 명령어를 실행하는 단계

간접 사이클
명령어를 인출하여 CPU로 가져왔다고 하더라도, 명령어를 실행하기 위해서는 메모리 접근이 한 번 더 필요한 경우가 있음.(가져온 명령어 openrand가 또 다른 메모리 주소를 명시하고 있는 경우). 피연산자의 실제 주소를 찾기 위해 메모리 내의 데이터를 한 번 더 인출하는 과정.

 

인터럽트

인터럽트는 CPU의 정상적인 작업을 방해하는 신호이다.

인터럽트의 종류 (intel 문서 기준)

개발자가 알아야 할 컴퓨터 구조 지식

동기 인터럽트 synchronous interrupts

CPU에 의해 발생하는 인터럽트이다. CPU가 명령어를 수행하다가 예상치 못한 상황에 마주쳤을 때(Ex. 프로그래밍 상의 에러) 발생한다. 예외 Exception 이라고도 한다.

 

비동기 인터럽트 asynchronous interrupts

주로 입출력장치에 의해 발생한다. 하드웨어 인터럽트라 칭하기도 한다.

개발자가 알아야 할 컴퓨터 구조 지식

위의 그림에서, 하드웨어 인터럽트를 이용하면 CPU가 주기적으로 프린트 완료 여부를 확인할 필요가 없다는 것을 볼 수 있다.
CPU는 프린터로부터 프린트 완료 인터럽트를 받을 때까지 다른 작업을 처리할 수 있다. 이를 통해 CPU가 효율적으로 명령어를 처리할 수 있다.

 

인터럽트 서비스 루틴 ISR; Interrupt Service Routine

인터럽트를 처리하기 위한 동작들로 이루어진 프로그램.

'키보드가 어떤 인터럽트 요청을 보냈을 때는 어떻게 작동한다'
'마우스가 어떤 인터럽트 요청을 보냈을 때는 어떻게 작동한다'

와 같이 어떤 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리하고 작동해야 할지에 대한 정보로 이루어진 프로그램.

 

CPU 성능 향상 기법

빠른 CPU를 위한 설계 기법

면접 준비를 위해 공부를 할 떄도, 개인적으로 이해가 안되는 부분이 있던 부분이다!
특히 멀티 코어, 멀티 스레드 부분이 잘 정리되어 너무 좋았다.

 

클럭

4장에서의 학습한 내용을 보면, 다음을 알 수 있다.

  1. 컴퓨터 부품들은 '클럭 신호'에 맞추어 일사분란하게 움직인다.
  2. CPU는 '명령어 사이클'이라는 정해진 흐름에 맞춰 명령어들을 실행한다.

즉, 클럭 속도가 높아지면 CPU는 명령어 사이클을 더 빠르게 반복할 것이고, 다른 부품들도 그에 발맞춰 더 빠르게 작동할 것이다.

클럭 속도는 헤르츠(Hz) 단위로 측정한다. 1초에 클럭이 몇 번 반복되는지 나타낸다.
1초에 100번 반복되면 100Hz이다.

다만, 클럭 속도를 무작정 높이면 발열 문제가 심각해진다.
즉, 클럭 속도만으로 CPU 성능을 올리는 데에는 한계가 있다.

 

코어와 멀티코어

코어

코어를 이해하려면 현대적인 관점에서 CPU라는 용어를 재해석해야 한다.

앞서 많은 전공서적들은 CPU를 '명령어를 실행하는 부품' 이라고 소개한다.
전통적인 관점에서 '명령어를 실행하는 부품'은 원칙적으로 하나만 존재했다.

하지만 오늘날의 CPU는 내부에 '명령어를 실행하는 부품' 을 얼마든지 만들 수 있게 되었다.

즉,
코어: '명령어를 실행하는 부품'
CPU: '명령어를 실행하는 부품을 여러 개 포함하는 부품'

으로 명칭의 범위가 확장되었다.

코어를 여러 개 포함하고 있는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 부른다.

 

스레드와 멀티스레드

스레드의 사전적인 의미는 '실행 흐름의 단위' 이다.

하지만 CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 용례가 다르므로 더욱 엄밀하게 이해해야 한다!

⭐️ 스레드에는 하드웨어적 스레드가 있고, 소프트웨어적 스레드가 있다!

 

하드웨어적 스레드

스레드를 하드웨어적으로 정의하면 '하나의 코어가 동시에 처리하는 명령어 단위' 를 의미한다.

여러 스레드를 지원하는 CPU는 하나의 코어로도 여러 개의 명령어를 동시에 실행할 수 있다.

아래의 2코어 4스레드 CPU는 아래 그림처럼 명령어를 실행하는 부품을 두 개 포함하고, 한 번에 네 개의 명령어를 처리할 수 있는 CPU를 의미한다.

개발자가 알아야 할 컴퓨터 구조 지식

이처럼 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 한다.

 

소프트웨어적 스레드

소프트웨어적으로 정의된 스레드는 '하나의 프로그램에서 독립적으로 실행하는 단위' 를 의미한다.
프로그래밍 언어나 운영체제를 학습할 때 접하는 스레드는 보통 이렇게 소프트웨어적으로 정의된 스레드를 의미한다.

하나의 프로그램은 실행하는 과정에서 한 부분만 실행될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있다.

개발자가 알아야 할 컴퓨터 구조 지식

가령, 아래의 기능이 동시에 수행되길 원해,
아래 기능들을 작동시키는 코드를 각각의 스레드로 만들면 동시에 실행할 수 있다.

  1. 사용자로부터 입력받은 내용을 화면에 보여 주는 기능
  2. 사용자가 입력한 내용이 맞춤법에 맞는지 검사하는 기능
  3. 사용자가 입력한 내용을 수시로 저장하는 기능
개발자가 알아야 할 컴퓨터 구조 지식

 

정리하면
스레드의 하드웨어적 정의

하나의 코어가 동시에 처리하는 명령어 단위

스레드의 소프트웨어적 정의

하나의 프로그램에서 독립적으로 실행되는 단위

 

👉 한 번에 하나씩 명령어를 처리하는 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십 개 실행할 수 있다.

👉 1코어 1스레드 CPU도 프로그램의 여러 부분을 동시에 실행할 수 있다.
(후에 나오지만, CPU가 엄청 짧은 timeslice마다 컨텍스트 스위칭을 하며 각 스레드를 실행하는 것이다.)

✋ 만약 스레드의 사전적인 정의(실행 흐름의 단위)만을 암기한다면, '1코어 1스레드 CPU가 여러 스레드로 만들어진 프로그램을 실행할 수 있다는 말이 어려울 것이다. 하드웨어적인 스레드와 소프트웨어적인 스레드를 구분하자.

 

멀티스레드 프로세서

하나의 코어로 여러 명령어를 동시에 처리하는 CPU가 멀티스레드 프로세서이다.

여기서 스레드란 하드웨어적인 스레드를 말한다.

멀티스레드 프로세서를 실제로 설계하는 일은 매우 복잡하지만, 가장 핵심은 레지스터라고 한다.

하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면 프로그램 카운터, 스택 포인터, 데이터 버퍼 레지스터, 데이터 주소 레지스터와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러 개 가지고 있으면 된다.

개발자가 알아야 할 컴퓨터 구조 지식

메모리 속 프로그램의 입장에서 봤을 때 하드웨어 스레드는 마치 '한 번에 하나의 명령어를 처리하는 CPU'나 다름없다.
예를 들어 2코어 4스레드 CPU는 한 번에 네 개의 명령어를 처리할 수 있는데,
프로그램 입장에서 봤을 떈 한 번에 하나의 명령어를 처리하는 CPU가 네 개 있는 것처럼 보인다.
그래서 하드웨어 스레드를 논리 프로세서라고 부리기도 한다.

개발자가 알아야 할 컴퓨터 구조 지식

 

명령어 병렬 처리 기법

  • 명령어 파이프라이닝은 동시에 여려 개의 명령어를 걸쳐 실행하는 기법이다.
    개발자가 알아야 할 컴퓨터 구조 지식
  • 슈퍼 스칼라는 여러 개의 명령어 파이프라인을 두는 기법이다.
    개발자가 알아야 할 컴퓨터 구조 지식
  • 비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 기법이다.

 

CISC와 RISC

  • ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이다.

ISA가 같은 CPU끼리는 서로의 명령어를 이해할 수 있지만, 다르면 서로의 명령어를 이해하지 못한다.

CISC와 RISC가 현대 ISA의 양대산맥이라고 한다.

  • CISC는 복잡하고 다양한 종류의 가변 길이 명령어 집합을 활용한다.
  • RISC는 단순하고 적은 종류의 고정 길이 명령어 집합을 활용한다.

 

확인 문제

p.125
2번 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워보세요

(플래그 레지스터): 연산 결과 혹은 CPU 상태에 대한 부가정보를 저장하는 레지스터 (프로그램 카운터): 메모리에서 가져올 명령어의 주소를 저장하는 레지스터 (범용 레지스터): 데이터와 주소를 모두 저장할 수 있는 레지스터 (명령어 레지스터): 해석할 명령어를 저장하는 레지스터

 

p.155
4번 빈칸에 알맞은 용어를 써 넣으세요.

개발자가 알아야 할 컴퓨터 구조 지식
코어

 

#혼공학습단 #혼공 #혼공컴운

복사했습니다!