본문 바로가기

computer science

[#혼공] 혼자 공부하는 컴퓨터 구조+운영체제 [Chapter.05]

  앞 장에서는 CPU를 자세히 들여다봤습니다. 하지만, 무언가 아쉬운 느낌이 있었습니다. 단순히 확인만 해서는 실무에서는 크게 도움이 안됩니다. 바로 어떻게해야 성능을 높일 수 있는 지가 중요합니다. #혼공 첫 번째 장에서 말씀드린 내용이 있습니다. 바로, 데이터 엔지니어로서 개발을 할 때에는 성능, 용량, 비용을 고려해야 한다고 말입니다. 따라서, 이번 장에서는 CPU의 성능 향상 기법을 알아볼 예정입니다. 이번 장을 읽고 난다면, 실력있는 개발자에 한 걸음 다가갈 수 있을 거라고 생각합니다. 

  또한, 이 장을 공부하고 나니 2년 전 노트북 구입을 고민할 때, M1 노트북을 사면 호환 어쩌구 저쩌구 문제가 있을 수도 있어!라는 말들이 무슨 문제였는지 이해가 되었습니다. 관련된 내용을 간략하게 적어놨습니다. :)  혹시, 제대로 더 자세히 알고 싶으면 책을 구매하는 것을 추천합니다. 

 

 

 

[05-1] 빠른 CPU를 위한 설계 기법

 

 

 

클럭

 

(1) 컴퓨터 부품들은 "클럭 신호"에 맞추 일사 불란하게 움직인다.

(2) CPU는 "명령어 사이클"이라는 정해진 흐름에 맞춰 명령어들을 실행한다.

 

클럭 속도가 빠르면 CPU의 성능이 좋다고 말할 수 있습니다. 클럭 속도는 헤르츠(Hz) 단위로 측정합니다. 이는 1초에 클럭이 몇 번 반복되는지를 나타냅니다. 아래 그림에서 3.3GHz가 뜻하는 것이 1초에 3.3 * 10^9 (3,300,000,000)만큼의 클럭이 반복될 수 있다는 뜻입니다. 즉, 클럭 속도가 빠르면 빠를수록 CPU의 성능이 좋다는 뜻입니다.

 

 

[주의 사항]

1. 클럭 속도는 일정하지 않다.

2. 클럭 속도를 무지막지하게 높이면 무조건 CPU가 빠른 건 아니다. (심각한 발열 문제 발생) 

 

 

 

 

 

코어와 멀티 코어

 

 

 

전통적인 CPU는 하나의 코어만으로 구성이 되어 있었지만, 오늘날의 CPU는 보통 여러 개의 코어를 가지고 있습니다. 노트북을 살 때에 위와 같이 10-core CPU 등의 내용을 확인하실 수 있습니다. 아래 그림처럼, 코어가 10개인 CPU라고 생각하시면 됩니다. 코어가 2개 이상이면 멀티 코어 CPU라고 부릅니다.

오늘날의 CPU

 

위의 클럭의 개념과 합쳐서 생각해봅시다.
클럭 속도가 2.4GHz인 단일 코어 CPU보다 1.9GHz인 멀티코어 CPU의 성능이 더 좋습니다. 

 

[주의 사항]

1. CPU의 연산 속도가 코어의 수에 비례하여 증가하지 않습니다.

2. 또한, 처리하고자 하는 작업량에 비해 코어 수가 지나치게 많아도 성능에는 크게 영향이 없습니다.

(3인분의 요리를 10명의 요리사가 만드나 5명의 요리사가 만드나 크게 차이가 없듯이)

 

 

 

스레드와 멀티 스레드

 

스레드란 "실행 흐름의 단위"라는 뜻을 가지고 있습니다. 스레드는 CPU에서 사용되는 스레드와 프로그래밍에서 사용되는 스레드는 용례가 다릅니다. 즉 하드웨어적 스레드와 소프트웨어적 스레드가 있습니다. 

 

 

(1) 하드웨어적 스레드

하나의 코어가 동시에 처리하는 명령어 단위입니다. 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세스 또는 멀티스레드 CPU라고 부릅니다. 

 

(2) 소프트웨어적 스레드

"하나의 프로그램에서 독립적으로 실행되는 단위"를 의미합니다. 예를 들면, 워드 프로세스 프로그램을 개발한다고 가정해봅시다. 
사용자로부터 입력받은 내용 보여주는 화면 기능, 사용자가 입력한 내용이 맞춤법에 맞는지 검사 기능, 사용자가 입력한 내용을 수시로 저장하는 기능 등의 여러 기능을 각각의 스레드로 만들면 동시에 실행할 수 있습니다. 

 

 

 

 

 

[05-2] 명령어 병렬 처리 기법 

 

 

 

명령어 파이프라인

 

이런식으로, 명령어를 겹쳐서 수행하면, 명령어를 하나하나 실행하는 것보다 훨씬 더 효율적으로 처리할 수 있습니다. 이런 방식을 명령어
"파이프라이닝"이라고도 부릅니다. 하지만, 특정 상황에서는 성능 향상에 실패하는 경우가 있습니다. 이러한 상황을 파이프라인 위험이라고 부르고 크게 3가지 위험이 있습니다.

 

(1) 데이터 위험 : 데이터 의존성에 의하여 발생합니다. 이는 명령어의 순차성이 필수적인 경우 발생합니다. 

(2) 제어 위험 : 주로 분기 등으로 인한 "프로그램 카운터의 갑작스러운 변화"에 의해 발생합니다.

(3) 구조적 위험 : 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생합니다. 

 

 

 

슈퍼스칼라

 

오늘날 대부분의 CPU는 여러개의 파이프라인을 이용합니다. 이처럼 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 슈퍼스칼라라고 합니다. 마치 공장 생산 라인을 여러 개 두는 것과 같은 것이라고 보면 될 것 같습니다. 이론적으로는 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라집니다. 다만, 파이프라인 위험 등의 예상치 못한 문제가 있을 수 있어서, 반드시 파이프라인 개수에 비례하여 빨라지지는 않습니다. 

 

 

 

 

[05-3] CISC와 RISC

 

 

명령어 집합

 

CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합 또는 명령어 집합 구조(ISA)라고 합니다. 가령 인텔의 노트북 속 CPU는 x86 혹은 x86-64 ISA를 이해하고, 애플의 아이폰 속 CPU는 ARM ISA를 이해합니다. x86과 ARM은 다른 ISA이기 때문에, 인텔 CPU를 사용하는 컴퓨터와 아이폰은 서로의 명령어를 이해할 수 없게 됩니다. 각기 명령어 집합이 다르기 때문에, docker 설치 페이지에서도 아래와 같이 분류가 있을 거라 생각합니다. :) 

 

 

 

 

CISC와 RISC 차이점

 

ISA의 양대산맥 CISC와 RISC의 차이점 표

CISC RISC
복잡하고 다양한 명령어 단순하고 적은 명령어
가변 길이 명령어 고정 길이 명령어
다양한 주소 지정 방식 적은 주소 지정 방식
프로그램을 이루는 명령어 수가 적음 프로그램을 이루는 명령어 수가 많음
여러 클럭에 걸쳐 명령어 수행 1클럭 내외로 명령어 수행
파이프라이닝하기 어려움 파이프라이닝하기 쉬움