[운영체제] 3. CPU 성능 향상 기법

0

운영체제

목록 보기
3/6

1. 빠른 CPU를 위한 설계 기법

1.1 클럭

클럭신호가 빠르게 반복되면, CPU를 비롯한 컴퓨터 부품들은 그만큼 빠른 박자에 맞춰 움직인다.

실제로, 클럭속도가 높은 CPU는 성능이 더 좋습니다.

클럭속도는 HZ단위로 측정된다.

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

클럭속도는 일정하지않다. 고성능을 요할떄는 빠르게 동작하며, 그렇지 않을때는 유연하게 동작한다.
강제로 끌러올리는 경우를 오버클럭킹이라고 한다.

1.2 코어와 멀티코어

클럭속도를 높이는것 외에, CPU의 성능을 높이는 방법엔 뭐가 있을까? CPU의 코어와 스레드 수를 늘리는 방법이 있다.

첫번째로 코어를 알아보자면, CPU는 많은 발전을 이룩했고, '명령어를 실행하는 부품'을 얼마든지 만들수 있었다.

그래서 최근엔 명령어를 실행하는 부품은 코어로, 코어를 여러개 포함한 부품은 CPU로 범위가 확장되었다.

일반적으로, 2.4GHZ인 단일 코어와 1.9GHZ인 멀티코어를 비교하면, 일반적으로 후자의 성능이 더좋다.

하지만 코어수가 늘어날수록 연산처리속도는 동일하게 증가할까?

코어마다 처리할 연산이 분배되지 않는다면 코어수에 비례해 연산 속도가 증가하지않는다.

1.3 스레드와 멀티 스레드

쓰레드의 사전적 의미는 "실행흐름의 단위" 이나, CPU에서 사용되는 스레드와 프로그래밍의 스레드는 다르다는것을 이해해야한다.

하드웨어적 스레드는 '하나의 코어가 동시에 처리하는 명령어 단위'를 의미한다.
지금까지 배운 CPU는 1코어 1스레드 CPU였다.

반면, 여러 스레드를 지원하는 CPU는 하나의 코어로도 여러개의 명령어가 실행가능하다.

이를 우리는 멀티스레드 CPU라고 한다.

인텔은 지들의 멀티스레드 기술을 하이퍼 스레딩이라고 한다.

소프트웨어적 쓰레드는 '하나의 프로그램에서 독립적으로 실행되는 단위'를 의미한다.

1코어 1스레드 CPU로도 프로그램의 여러 부분을 동시에 실행할 수 있다. (진짜 1년전에 이걸 알았다면 쉬웠으련만)

1.4 멀티스레드 프로세서

하나의 코어로 여러 명령어를 동시에 처리하는 방법은 어떻게 가능할까?

멀티스레드 프로세서를 실제로 설계하는것은 복잡하지만, 가장 큰 핵심은 레지스터이다.

하나의 명령어를 처리하기 위해 필요한 레지스터를 여러개 가지고 있으면 된다.

만약 레지스터 세트가 4개가 있다면, 코어 한개당 명령어를 4개 처리할수 있는데, CPU가 마치 네게 있는것 처럼 보여서, 이를 논리 프로세서라고 부른다.

2. 명령어 병렬 처리 기법

빠른 CPU를 만들려면, 멀티코어, 멀티스레드 CPU도 좋지만, CPU가 놀지않고 작동하는것도 중요하다.
명령어 병렬 처리기법은 명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리가 있다.

2.1 명령어 파이프 라인

명령어 출력 과정을 클럭단위로 나눠보자

  1. 명령어 인출
    2.명령어 해석
  2. 명령어 실행
  3. 결과 저장

CPU는 각 단계를 동시에 실행할 수 있다.
명령어를 인출 하는동안, 다른 명령어를 실행할 수 있다.

순차 처리하는 경우보다, 파이프 라이닝을 이용하는것이 더 효율적이다.

하지만 성능향상에 실패하는 경두오 있다.
이를 파이프 라이닝 위험이라고 부른다.

데이터 위험은 이전 명령어를 끝까지 실행할수 있는 경우의 명령어를 동시에 처리할때 발생한다.
의존적인 두 명령어를 동시에 실행하려고하면, 파이프 라인은 정상적으로 작동하지 않는다.

제어 위험은 프로그램 카운터의 갑작스러운 변화에 의해 발생한다.
프로그램 카운터는 '현재 실행중인 명령어의 다음 주소' 로 갱신되게 되는데, 프로그램 카운터가 갑작스러운 변화가 생긴다면 아무 쓸모도 없게된다.

구조적 위험은 서로 다른 명령어가 동시에 ALU, CPU 부품을 사용하려고 할때 일어난다.

2.2 슈퍼 스칼라

CPU 내부는 여러개의 파이프 라인을 이용한다.
CPU내부에서 여러개의 명령어 파이프 라인을 포함한 구조를 슈퍼스칼라 라고 한다.

2.3 비순차적 명령어 처리

마지막으로 얘기할 명령어 병렬 처리 기법은 비순차적 명령어 처리 이다.
오늘날 CPU 성능향상에 크게 기여한 기법이자, 대부분의 CPU가 차용하는 기법이다.

명령어의 합법적인 새치기이기도 하다.

아래의 표를 보자

서로 의존적이기 때문에 아래의 파이프라인은 순차적이지만, 의존적이지 않은것은 먼저 처리하는것이 속도가 빠르다.

3. CISC와 RISC

명령어 파이프 라이닝과 슈퍼 스칼라 기법을 실제로 CPU에 적용하려면 명령어가 파이프 라이닝에 최적화 되어 있어야한다.

파이프 라이닝 하기 쉬운 명령어란 무엇일까?

이와 관련하여 CPU의 언어인 ISA, 각기 다른 성격의 ISA를 기반으로 설계된 CISC , RISC를 알아보자.

3.1 명령어 집합

모든 CPU들은 똑같이 생긴 명령어를 실행할까? 정답은 그렇지 않다.
CPU는 이해할수 있는 명령어들의 모음을 명령어 집합, 명령어 집합구조라고 한다.

같은 소스코드로 만들어진 같은 프로그램이라 할지라도, ISA가 다르면 CPU가 이해할수 있는 어셈블리어도 달라진다.

동일한 소스코드를 작성하고, ISA가 다른 컴퓨터에서 어셈블리어로 컴파일 하면, 다른 결과값을 볼수 있다.

우리는 앞서, 명령어 병렬처리 기법을 학습했다.
그리고 이를 적용하기에 용이한 ISA가 존재하고, 그렇지 못한 ISA가 존재한다.

처리기법을 도입하기 유리한 ISA를 알아보자.

3.2 CISC

CISC는 Complex Instruction Set Computer의 약자이다.
x64, x86은 대표적인 CISC기반의 ISA이다.

CISC는 다양하고 강력한 기능의 명령어 집합을 사용하기 때문에 가변 길이 명령어를 활용한다.

그래서 상대적으로, 적은 수의 명령어로도 프로그램을 실행할 수 있다.

그리고 이는 "컴파일된 프로그램의 크기가 작다는것을 의미한다."

하지만 CISC는 치명적인 단점이 있는데, 명령어의 크기와 실행되까지의 시간이 일정치 않다.
그리고 명령어 하나를 실행하는데, 여러 클럭주기를 필요로 한다.

이는 명령어 파이프라인을 구현하기에 걸림돌이 된다.
파이프 라이닝은 CPU가 높은 성능을 내기위한 핵심이다.

파이프 라이닝을 하려면, 소요되는 시간이 동일해야 한다.

하지만 CISC를 보면 불가능하다.

또한, 대다수의 복잡한 명령어는 사용 빈도수가 낮다.

이러한 이유로 CISC 기반 CPU는 한계가 있다.

3.3 RISC

CISC의 문제점을 생각해보자.

  • 파이프라인을 활용하려면, 명령어 길이와 수행시간이 규격화 되어있어야 한다.
  • 사람들은 자주쓰이는 명령어만 사용한다.

이런 원칙하에 등장한것이 RISC이다.

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글