본문 바로가기

OS

[CPU] 멀티코어 이야기

개요

대부분 학사레벨에서 CPU를 배우면, 싱글코어를 기반으로 배우거나, 공부하게된다. 멀티코어는 간단하게 넘어가거나, 정확하게 모르고 넘어가는 경우도 많다.

 

최근에 여러 발표를 보면서, CPU 구조도와 코드와 설명이 서로 매칭이 안되는 발표를 듣게 되었다. 이 원인을 싱글코어와 멀티코어의 차이점을 잘 모르다보니, 그리고 현재의 CPU들에 대해서 잘 모르다보니 발생한 문제라고 판단하였다.

 

문제는 이 설명이 틀렸다는 것을 눈치챘지만, 나라면 정확히 발표 할 수 있을까?, "현재 사용하는 CPU들은 어떤식으로 동작하는데?" 라는 의문이 생겨 정리해본다.

 

배경지식

클럭(Clock)

디지털 회로에서 프로세서가 처리하는 명령 하나는 여러 마디로 구분되어지고, 이를 state라고 부른다.

기계어 명령어를 처리하기 위해서는 여러 상태를 지나야만 하나의 명령어가 완료된다. 이때 다음 상태로 넘어가기 위해서 클럭 신호에 맞춰서 넘어간다.

 

예를 들어 4GHz의 프로세서는 1초에 40억번의 클럭 신호를 발생시킨다. 따라서 프로세서에서 내부 상태가 1초에 40억번 변경된다는 의미이다. 그래서 사람들이 말하는 40억번의 연산을 한다는 말은 여기에서 나오는 말이다. (물론 이상적일 경우)

 

클럭사이클(Clock Cycle)

Oscillator의 두 펄스 사이의 시간을 Clock Cycle이라고 한다. 그리고 CPU의 속도는 이 Clock Cycle에 의해서 결정된다. 일반적으로 초당 펄스 수가 높을 수록 컴퓨터의 프로세서가 정보를 더 빨리 처리할 수 있다. 따라서 4GHz의 프로세서는 초당 40억번의 사이클을 수행한다는 의미이다. 정리해보면 클럭 속도(Cycle)는 Hz단위로 측정한다.

 

대역폭: 단위 시간에 얼마나 많은 데이터가 흐를 수 있는가
레이턴시: 원하는 작업이 완료되는데까지 걸리는 시간

 

현재 CPU들을 사용하는 단위

과거에는 프로세서를 사용하는 단위가 "프로세스" 였다. 멀티 태스킹을 위해서 시분할 시스템으로 구축되거나 context switching 등의 동작을 진행하면서 여러 프로세스가 동시에 하나의 물리적인 프로세서에서 동작하도록 만들었다.

 

여러 책이나, 코딩책에서도 스레드가 언급되면서 자주 설명되는 부분이 있다.

눈치챘겠지만, 현재는 스레드가 프로세서를 사용하는 최소 단위이다.

 

윈도우를 기준으로, 메모장을 실행하면 운영체제는 메모장 프로세스 자료구조를 만들지만, 실제로 실행되려면 스레드 자료구조를 만들어야한다. 그래서 프로그래밍 책에서도 1개의 프로세스에 1개의 스레드가 들어가 있는 듯한 그림을 자주 볼 수 있다.

 

스레드는 자신의 레지스터 상태, 호출 스택의 상태를 가지고 있어 하나의 실행 흐름을 유지한다.

프로세스ID, 주소공간, 프로세스 우선순위, 현재 열려있는 파일들의 목록등은 프로세스가 가지고 있다.

 

위 사항은 각 운영체제의 프로세스 자료구조와, 스레드 자료구조를 확인하면 더 정확히 알 수 있다.

 

현대 운영체제는 대부분 선점형으로 되어있어서, 우선순위를 고려해 다음 스레드에게 프로세서 사용 기회를 준다.

(이는 얼마든지 변경될 수 있는 사항이니, 곧이 곧대로 알고 있을 필요는 없다)

 

파이프라인(Pipeline)

파이프라인은 고성능 프로세서를 만들 수 있도록 해준 기술이다.(캐시도 일등 공신)

일반적으로 곱셈과 같이 시간이 오래 걸리는 산술 연산장치와 어느 정도 시간이 걸리는 주요 작업은 대부분 파이프라인화(pipelining)가 되어 있다.

 

파이프라인은 결국 연속으로 주어지는 어떤 작업을 처리하는데 있어서 처리율을 높이는 알고리즘이다.

일반적으로 특별한 말 없이 "파이프라인" 이라고 하면, 명령어 파이프라인을 말한다.

 

 

본론

앞서서 배경지식으로 알아야할 가장 기본적인 단어들만 언급했다. 그러나 CPU가 복잡하고, 어려운 공부 대상이기 때문에, 더 정확히 알고, 많은 걸 알 수록 보이는 것이 많고, 이해가 된다.

  • IPC(Inter-process communication)
  • pipeline
  • 공유메모리
  • 데이터 의존성
  • 명령어 집합을 다루는 프로세서의 명령어 처리 방식
  • 해저드

하이퍼 스레딩(멀티 스레딩)

하이퍼스레딩은 인텔이 만든 멀티스레딩의 상품명이다. 즉, 하이퍼스레딩 = 멀티스레딩.

 

멀티 스레딩은 하나의 물리 프로세서가 두개의 논리 혹은 가상 프로세서로 보이게 하는 기술이다.

하드웨어 수준에서 스레드 문맥을 복제하기 때문에 2개의 논리 프로세서로 보이게 할 수 있는 것이다.

 

일반적으로 동작은 슈퍼스칼라 프로세서에서 동시에 두 스레드로 부터 명령어를 가져와 파이프라인에 넣는 기술이다.

이렇게 하면 제대로 활용되지 않은 프로세서 자원을 더욱더 효율적으로 쓸 수 있다.

 

멀티 스레딩의 특징

멀티 스레딩은 자원 복제를 최소화 한것이다. 스레드 문맥(context)을 유지하는 자원은 복제하고, 명령어 파이프라인이나, 캐시는 그대로 공유한다. 스레드 문맥 2개를 지원하는 운영체제에서는 두개의 논리 프로세서가 있는 것으로 보인다.

 

요즘 CPU를 구매하고, 운영체제를 설치하고, 작업관리자 등에서 확인하면 분명 4코어 프로세서를 구매했음에도 불구하고, 8코어 처럼 보인다. 이것이 멀티 스레딩이 적용되어있기 때문이다.

 

동작은 다음과 같다. 스레드가 자신에게 주어진 시간만큼 프로세서를 사용했다면, 운영체제는 이 스레드에서 프로세서를 빼앗아 다른 스레드에게 준다. 이를 context switching이라고 한다.

 

멀티 코어

두 개 이상의 독립 코어를 단일 집적 회로로 이루어진 하나의 패키지로 통합한 것이다.

멀티 코어는 동작 방식에 따라서 여러 모습을 가지고 있다.(칩 멀티 프로세서, 대칭형 멀티 프로세서 멀티 코어 ,분산 공유 메모리 등)

 

비순차 프로세서 파이프라인 단계 중 스케줄링 단계가 병목이 생겼는데, 앞서 설명한 것처럼 CPU의 성능은 높은 클럭이다. 문제는 클럭을 높이는 것은 기술적 한계 문제로 힘들어 지고 있고, 이를 해결하기 위해서 멀티 코어를 사용하게 된다.

 

즉, 모든 문제를 병렬적으로 처리한다.

 

공유 메모리 구조

일반적으로 우리가 사용하는 PC는 공유메모리 구조를 가지고 있다. 우리가 사용하는 CPU는 칩 멀티 프로세서 형태를 가지고 있다.

 

정리

앞서서 멀티 스레딩까지는 싱글 스레드 처럼 이야기 하고, 갑자기 생뚱맞은 멀티코어 이야기를 한것 같다. 이렇게 느꼈다면, 제대로 이해한것이 맞지 않나 싶다.

 

왜냐하면, 결국 현재의 CPU들은 멀티 코어이자 멀티 스레딩을 동시에 적용 중이기 때문에, 4코어 8스레드 라거나 논리 8코어 등의 말을 하기 때문이다.

 

동작

그래서 일반적인 PC들은 어떻게 동작하느냐? 라는 질문을 답변해보자면, 정답은 "커널이 어떻게 설계되었느냐에 따라서 결정되는 이슈이다" 라고 답변하는 것이 맞다.

 

4코어 8스레드 시스템으로 예시를 들어보겠다.

프로세스 A, B, C가 각각 스레드 1개, 3개, 4개를 사용하는 프로세스라고 가정하자.

이때 운영체제는 절대로 프로세서의 스레드를 사용하지 않는다고 가정(운영체제가 별개라고 가정)하면, 

프로세스 A, B, C는 총 8개의 스레드를 이용해야하고, CPU는 8스레드라고 가정했기때문에 정확히 필요한 개수가 맞아떨어지게된다.

따라서 context switching이 일어나지 않고 병렬처리가 가능할 것이다.

 

다만, 이러한 논리는 "커널이 반드시 위와 같이 동작할 것이다"라고 가정했을 때이다. 본인의 OS 혹은 커널이 어떤식으로 멀티스레드를 이용하는지는 운영체제에 대한 공식 문서를 보고 알 수 있다.