01. 클럭 (Clock)
클럭이란 CPU의 속도를 나타내는 단위입니다. Hz(헤르츠)로 나타내며, CPU의 성능을 높이는 방법의 한 예로 클럭을 올리는 방법이 있습니다. 컴퓨터 부품들은 클럭 신호에 맞춰 움직이고 CPU는 명령어 사이클에 맞춰 명령어들을 실행합니다. 결과로 클럭 속도가 높을수록 CPU의 명령어 사이클이 빨라지고 부품들이 더 빨리 움직이게 됩니다. 클럭 속도는 일정하지 않고 상황에 맞게 유연하게 속도가 조절됩니다.
필요 이상으로 클럭을 높여 오버클럭킹(최대 클럭 속도를 강제로 더 끌어올림)하게 되면 발열이 심해집니다. 클럭 속도를 올리는 방법 외에 코어의 수를 늘리거나 스레드 수를 늘리는 등의 CPU 성능 향상 기법이 있습니다.
02.코어 (Core)
코어란 현대적인 관점에서 'CPU'라는 용어를 재해석한 단어로 CPU의 작업 처리 단위, 즉 프로세서를 의미합니다. 각 각 코어는 독립적으로 명령어를 실행할 수 있고, 코어가 여러개인것을 멀티코어CPU 또는 멀티코어 프로세서라고 부릅니다.
무작정 코어의 수도 늘린다면, 처리속도가 비례하여 증가할까요? CPU의 연산속도와 코어의 수는 비례하여 증가하진 않습니다. 사공이 많으면 배가 산으로 가듯이.... 중요한 점은 각각 코어에 얼마나 효율적으로 명령어를 분배하는지가 중요합니다. 효율적으로 명령어를 분배하는 방법은 작업의 병렬 처리 가능성과 프로그램의 최적화 수준, 운영체제의 스케줄링 등에 의해 결정 됩니다.
03.스레드 (Thread)
스레드는 프로그램에서 실행 흐름의 최소 단위를 의미합니다. 스레드는 하드웨어적 스레드와 소프트웨어적 스레드 두가지로 나눠서 볼 수 있습니다.
먼저, 하드웨어적 스레드는 스레드를 하드웨어적으로 정의한 개념으로, 하나의 코어가 동시에 처리하는 명령어의 단위를 스레드라고 합니다. 예를들어 6코어 12 스레드라고 하면, 6개의 코어에서 12 개의 스레드가 병렬적으로 실행될 수 있습니다. 이처럼 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드 프로세서 또는 멀티스레드 CPU라고 부릅니다.
- 1코어 1 스레드 -> 1개의 코어가 1회당 1개의 명령어 실행
- 1코어 N 스레드 -> 1개의 코어가 1회당 N개의 명령어를 실행
소프트웨어적 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위를 의미합니다. 하나의 프로그램은 실행되는 과정에서 한 부분만 실행(싱글 스레드)될 수도 있지만, 프로그램의 여러 부분이 동시에 실행될 수도 있습니다(멀티스레드).
하나의 코어로 여러 명령어를 동시에 처리하는 멀티스레드 프로세서를 실제로 설계하는 일은 매우 복잡합니다. 이를 가능케하는 요소 중 하나는 CPU 내부에 있는 레지스터 입니다. 레지스터를 각각 스레드 별로 분리하거나 서로 공유하는 등의 방식으로 여러 스레드의 동시 실행을 지원하게 됩니다. 이 점은 프로그램 입장에서 보았을 때 하나씩 명령어를 처리하는 CPU가 여러 개 있는 것처럼 보이기 때문에 '논리 프로세서'라고 부르기도 합니다.
04. 명령어 병렬 처리 기법
명령어 처리 기법이란 명령어를 동시에 처리하여 CPU를 지속적으로 작동시키는 기법으로 명령어 파이프라이닝, 슈퍼스칼라,비순차적 명령어 처리 등이 있습니다.
[명령어 처리 기법]
- 명령어 파이프라이닝
- 슈퍼스칼라
- 비순차적 명령어 처리
명령어 파이프라이닝은 동시에 여러개의 명령어를 겹쳐 실행하는 기법으로 파이프라인의 개념에서 시작됩니다. 원래 파이프라인은 석유나 천연가스를 수송하는 데 사용되는 관로를 의미합니다. 컴퓨터 공학에서의 파이프라이닝은 생산 라인처럼 여러 단계의 공정을 동시에 수행함으로써 작업 효율성을 높이는 것을 말합니다. 일반적으로 CPU가 명령어를 처리하는 사이클은 다음과 같습니다.
- 명령어 인출 (fetch)
- 명령어 해석 (decode)
- 명령어 실행 (execute)
- 결과 저장 (write back)
같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있습니다. 즉, CPU는 한 클럭 주기 동안 다른 명령어의 단계를 처리할 수 있게 됩니다. 파이프라이닝은 높은 성능을 가져오지만 성능 향상에 실패하는 상황이 발생합니다. 이를 파이프라인 위험이라 하는데, 파이프라인 위험에는 데이터 위험/ 제어 위험/ 구조적 위험 세가지가 있습니다.
먼저 데이터 위험(data hazard)이란 명령어 간의 의존성에 의해 야기됩니다. 즉, 명령어가 다른 명령어의 결과에 의존하는 경우, 동시에 실행하면 문제가 발생할 수 있다는 것입니다.
제어 위험(control hazard)이란 주로 분기 등으로 인해 PC가 급격히 변화할 때 제어 위험이 발생합니다. PC는 기본적으로 현재 실행 중인 명령어의 다음 주소를 가리키는데, JUMP와 같은 명령어를 만나게 된다면 갑작스럽게 바뀌게 됩니다. 이 경우 파이프라인에 이미 적재되어 처리 중인 명령어들은 무의미해집니다. 이러한 제어 위험을 해결하기 위해 분기 예측(branch prediction)같은 기술을 사용하여 파이프라인에 적절한 명령어를 사전에 로드하도록 합니다.
분기예측이란 제어 위험을 방지하기 위해 사용합니다. 프로그램이 어디로 분기할지 미리 예측하고 그 주소를 인출합니다.
구조적 위험(structual hazard)이란 명령어들이 겹쳐 실행되는 과정에서 동일한 CPU 구성 요소를 동시에 사용하려고 할때 발생합니다. 즉, 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 쓰려할때 발생합니다. 자원 위험(resource hazard) 라고도 부릅니다.
슈퍼스칼라기법은 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조입니다. 오늘날의 멀티스레드 프로세서 입니다. 이론적으로는 파이프라인 갯수에 비례하여 처리속도가 증가해야하지만 파이프라인 위험도의 증가로 인해 비례하여 처리속도가 증가하진 않습니다.
비순차적 명령어 처리(OoOE)란 Out of order execution의 약자로 명령어들을 순차적으로 실행하지 않는 명령어 병렬 처리 기법입니다. 명령어의 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지합니다. (명령어 간 의존 관계가 없는 명령어 등을 먼저 실행)
05.명령어집합 (ISA)
명령어 집합(instruction set,명령어 집합 구조: instruction set Architecture)은 CPU가 이해할 수 있는 명령어들의 모음입니다. 명령어의 세세한 생김새나 연산, 주소지정방식은 CPU마다 다르기 때문에 ISA는 CPU의 언어라고 볼 수 있습니다. CPU의 ISA가 다르다는 것은 CPU가 이해하고 실행할 수 있는 명령어가 다르다는 뜻으로, 해당 CPU에 맞는 어셈블리어,레지스터의 종류와 갯수, 파이프라이닝의 용이성 등 역시 달라집니다.즉, ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해해야 하는지에 대한 약속이라 볼 수 있습니다.
05-1. CISC
CISC는 Complex Instruction Set Computer의 약자로 복잡하고 다양한 명령어들을 활용하는 CPU설계 방식입니다. CISC기반 명령어 집합 구조의 예시로 x86, x86-64등이 있습니다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스와 스레드 (0) | 2023.08.19 |
---|---|
[운영체제] 운영체제 기초 (0) | 2023.08.19 |
[컴퓨터구조]입출력장치 [I/O device] (0) | 2023.08.18 |
[컴퓨터구조] CPU의 작동원리 (0) | 2023.08.11 |
[컴퓨터구조] 소스 코드와 명령어 (0) | 2023.08.08 |