4 minute read

‘혼자 공부하는 컴퓨터구조+운영체제 - 강민철’ 책을 참고하여 작성한 포스트입니다.


클럭

  • 클럭 속도가 빠르면 CPU를 포함한 컴퓨터 부품들은 그만큼 빠르게 작동할 것이고 그에 따라 일반적으로 CPU 성능이 좋다.
  • 클럭 속도는 헤르츠(Hz) 단위로 측정한다. 1초에 클럭이 몇 번 반복되는지를 나타낸다.


코어와 멀티코어

  • 코어(core)는 CPU 내에서 명령어를 실행하는 부품..
  • 코어를 여러 개 포함하는 CPU를 멀티코어(multi-core)CPU 또는 멀티코어 프로세서 라고 부른다.


스레드와 멀티스레드

  • 스레드(thread)하드웨어적 스레드소프트웨어적 스레드로 나눌 수 있다.

하드웨어적 스레드

  • 스레드를 하드웨어적으로 정의하면 하나의 코어가 동시에 처리하는 명령어 단위 이다.
  • 하나의 코어로 여러 명령어를 동시에 처리하는 CPU를 멀티스레드(multithread)프로세서 또는 멀티스레드 CPU라고 부른다.
  • 인텔은 하이퍼스레딩(hyper-threading)이라고 부른다.

소프트웨어적 스레드

  • 소프트웨어적으로 정의하면 하나의 프로세스에서 독립적으로 실행되는 단위이다.
  • 프로그래밍 언어나 운영체제 학습 시 접하는 스레드는 보통 이렇게 정의된 스레드이다.
  • 여러 기능들을 작동시키는 코드를 각각의 스레드로 만들면 1코어 1스레드 CPU도 소프트웨어적 스레드를 수십 개 실행할 수 있다!

멀티스레드 프로세서

  • 소프트웨어적 스레드는 추후 운영체제에서 자세히 알아보고, 여기서는 하드웨어 스레드로 지칭해 설명한다.
  • 멀티스레드 프로세서의 핵심은 레지스터이다.
  • 하나의 코어로 여러 명령어를 동시에 처리하도록 만들려면 프로그램 카운터, 스택 포인터, 메모리 버퍼 레스터, 메모리 주소 레지스터와 같이 하나의 명령어를 처리하기 위해 꼭 필요한 레지스터를 여러개 가지고 있으면 된다.
  • 즉, ALU와 제어장치가 두 개의 필요 레지스터 세트에 저장된 명령어를 해석하고 실행하면 하나의 코어에서 두 개의 명령어가 동시에 실행되는 것이다.
  • 이같은 경우 1코어 2스레드 CPU가 한 번에 2개의 명령어를 처리하는 것인데, 프로그램 입장에서는 한 번에 하나의 명령어를 처리하는 CPU가 두 개 있는 것처럼 보인다.
  • 그래서 하드웨어 스레드를 논리 프로세서(logical processor)라고 부르기도 한다.



명령어 병렬 처리기법

  • 명령어 병렬 처리 기법(ILP, Instruction-Level Parallelism)은 명령어를 동시에 처리하여 CPU를 쉬지 않고 작동시키는 기법이다.



명령어 파이프라인

  • 명령어 파이프라인을 이해하려면 하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어 보아야 한다.
  • 클럭 단위로 명령어 처리 과정을 나누어보면 다음과 같다.
    1. 명령어 인출(instruction fetch)
    2. 명령어 해석(instruction decode)
    3. 명령어 실행(execute instruction)
    4. 결과 저장(write back)
  • 여기서 중요한 점은 같은 단계가 겹치는 것이 아니면 CPU는 각 단계를 동시에 실행할 수 있다는 점이다.
  • ‘인출’하는 동안, 다른 명령어를 ‘실행’ 할수 있고 다른 경우도 같다.
  • 명령어들을 명령어 파이파라인(instruction pipeline)에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝(instruction pipelining)이라고 한다.
  • 파이프라이닝은 높은 성능을 가져오지만 특정 상황엣서는 성능 향상에 실패하는 경우도 있는데 이를 파이프라인 위험(pipeline hazard)이라고 부른다.
  • 파이프라인 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험이 있다.

데이터 위험(data hazrard)

  • 데이터 의존성에 의해 발생한다.
  • 어떤 명령어가 다른 명령어의 데이터에 의존한다면 두 명령어를 동시에 실행시키려고 할때 제대로 작동하지 않을 것이다.

제어 위험(control hazard)

  • 주로 분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생한다.
  • 프로그램 실행 흐름이 바뀌어 명령어가 실행되며 프로그램 카운터 값에 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어진다(?)
  • 이를 해결하기 위해 사용하는 기술 중 하나가 분기 예측(branch prediction)이다.
  • 분기 예측은 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술이다.

구조적 위험(structural hazard)

  • 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할때 발생.
  • 자원 위험(resource hazard)이라고도 부른다.



슈퍼스칼라(superscalar)

  • CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
  • 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 ‘슈퍼스칼라 프로세서’ 또는 ‘슈퍼스칼라 CPU’라고 한다.
  • 멀티스레드 프로세서 같은 구조에서는 한 번에 여러 명령어를 인출, 해석, 실행이 가능하니 슈퍼스칼라 구조 사용이 가능하다.
  • 파이프라인이 많으면 성능도 향상되겠지만 ‘파이프라인 위험’ 등의 문제가 있어 실제로는 반드시 비례하여 성능이 좋아지지는 않음



비순차적 명령어 처리

  • 비순차적 명령어 처리(OoOE, Out-of-Order execution)은 OoOE로 줄여 부른다.
  • 모든 명령어를 순차적으로만 처리한다면 파이프라인 위험등과 같은 문제들로 인해 명령어가 곧바로 처리되지 못하는 현상이 발생하기도 한다.
  • 이런 경우 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 며령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리 기법이라고 한다.



명령어 집합

  • CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합(instruction set) 혹은 명령어 집합 구조(ISA, instruction set architecture)라고 한다.
  • CPU마다 ISA가 다를 수 있다.
  • 명령어 집합 구조 라고 칭하는 이유는 CPU가 어떤 명령어를 이해하는지에 따라 컴퓨터 구조 및 설계 방식이 달라지기 때문
  • 예로, 인텔 노트북 속 CPU는 x86, x86-64 ISA를 이해하고, 아이폰 속 CPU는 ARM ISA를 이해한다.
  • 같은 소스 코드로 만들어진 같은 프로그램이라 할지라도 ISA가 다르면 CPU가 이해할 수 있는 명령어, 어셈블리어가 달라진다.
  • 게다가 그에 따라 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리 방법 등 많은 것이 달라진다.
  • 즉, ISA는 CPU의 언어임과 동시에 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속 이다.
  • 현대 ISA는 크게 CISC 와 RISC가 있다.



CISC

  • CISC(Complex Instruction Set Computer)는 복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식이다. x86 등이 여기에 해당한다.
  • 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다.
  • 그에 따라 같은 일을 수행하는 프로그램이더라도 실행하는 명령어 수가 더 적으며, 컴파일된 프로그램의 크기가 더 작다.
  • 메모리를 아끼며 개발하는 환경에 적합하다.
  • 명령어가 복잡하고 다양하므로 명령어의 크기와 실행되기까지의 시간이 일정하지 않으며, 명령어 하나 실행하는 데 여러 클럭 주기를 필요로 하는 단점이 있다.
  • 즉, 규격화되지 않은 명령어가 파이프라이닝을 어렵게 만든다.
  • 그리고 대다수의 명령어는 잘 사용되지 않는다.



RISC

  • RISC(Reduced Instruction Set Computer)는 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향한다.
  • 고정 길이 명령어를 활용한다고 볼 수 있다.
  • 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구하며, 그래서 load-store 구조라고 부르기도 한다.
  • 메모리에 대한 접근을 단순화, 최소화 하는 대신 레지스터를 적극적으로 활용한다.
  • 주소 지정 방식도 적다.



정리

  • 코어는 명령어를 실행할 수 있는 ‘하드웨어 부품’이다.
  • 스레드는 ‘명령어를 실행하는 단위’이다
  • 멀티코어 프로세서는 명령어를 실행할 수 있는 하드웨어 부품이 CPU 안에 두 개이상 있는 CPU를 의미하고,
  • 멀티스레드 프로세서는 하나의 코어로 여러 개의 명령어를 동시에 실행할 수 있는 CPU를 의미한다.
  • 클럭 속도가 높은 CPU는 빠르게 작동한다
  • 스레드에는 하드웨어적 스레드와 소프트웨어적 스레드가 있다
  • 명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐 실행하는 기법이다.
  • 슈퍼스칼라는 여러 개의 명령어 파이프라인을 두는 기법이다.
  • 비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 기법
  • ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이다.
  • CISC는 복잡하고 다양한 종류의 가변 길이 명령어 집합을 활용한다,
  • RISC는 단순하고 적은 종류의 고정 길이 명령어 집합을 활용한다.

Leave a comment