열렬히.뛰기

멀티코어 프로그래밍

운영체제 > Part 2 : 프로세스 관리 > 공룡책 4장 : 쓰레드 > 멀티코어 프로그래밍

멀티코어 프로그래밍 : 개요

멀티코어의 등장

  • 컴퓨터의 진화 : 싱글코어 프로세서 ⇒ 멀티코어 프로세서
    • 싱글코어의 클럭만 늘리면 발열과 전력소모가 너무 심해짐.
    • 결국 여러 개의 코어를 붙이는 방향으로 선회.

다중 쓰레드와 멀티코어

다중 쓰레드 프로그래밍은 이러한 다중 코어를 보다 효율적으로 사용하고,

병행성(concurrency)를 향상할 기법을 제공한다.

싱글 코어에서는 1개의 코어가 1번에 1개의 쓰레드만 처리.

  • 병행성 = 시간에 따라 쓰레드가 잘 정렬됨(interleaved)을 의미.

반면 멀티 코어에서는 각 코어를 통해 각 쓰레드를 처리.

  • 병행성 = 여러 개의 쓰레드가 동시에 처리될 수 있음을 의미

병행과 병렬의 차이

다중 쓰레드를 다루기 위해 자주 나오는 용어를 짚고 넘어가자.

💡 병행성 : 프로세서가 여러 프로세스를 번갈아 처리해 마치 동시에 실행 되는 것처럼 보이는 것 병렬성 : 실제로 여러 프로세서를 사용해 여러 프로세스를 동시에 처리

멀티코어 개발 전에도 병행성은 구현할 수 있었다.

  • CPU 스케쥴러로 하여금 프로세스 사이의 전환(=문맥 교환)을 굉장히 빠르게 처리하도록 함.
  • 병행성은 구현된 것이나, 병렬성은 구현되지 않음.

멀티코어 프로그래밍 : 특징

멀티코어 시스템의 발전은 시스템 설계자 뿐만 아닌 App 개발자에게도 영향을 미침.

더 많은 App 개발자들이 멀티코어를 활용해야 할, 즉 다중 쓰레드를 처리해야 할 상황에 처해있음.

5가지 포인트

일반적으로 다중 코어 시스템을 처리하기 위해서는 5가지 봐야 할 점이 있음.

💡 1. task 인식 2. 균형 3. 데이터 분리 4. 데이터 종속성 5. 시험 및 디버깅

  1. task 인식
  • 무엇을 병렬적이고, 독립적인 task로 나눌지 결정해야 함.
  • task : 각각의 코어에서 병렬적으로 실행할 수 있는 일.
  1. 균형
  • 각 task들이 전체 작업에 균등한 기여도를 가지는지 판단해야 함.
  • 일부 task는 전체 프로세스에 별로 기여를 하지 못할 수도 있음.
    • 이러한 task에 한 코어를 별도로 쓰는 것은 자원낭비임.
  1. 데이터 분리
  • App을 task로 분리했으면, task에 딸린 data도 분리해야 됨.
  1. 데이터 종속성
  • 한 task에 딸린 data는 다른 task와도 연관이 없는지 체크해야 함.
  • 연관이 있다면, task끼리 data를 동기화하도록 설계해야 함.
  1. 테스트 & 디버깅
  • 멀티코어로 작동하는 프로그램은 실행 경로가 다양함.
  • 테스트와 디버깅 작업이 좀 더 어려워 질 수 있음.

이러한 이유 때문에 멀티코어에 관한 교육을 늘려야 한다고 주장하는 사람이 많음.

병렬 실행의 유형

병렬성(parallelism) 실행에는 2가지 유행; 데이터 병렬성과 태스크 병렬성이 존재.

꼭 둘 중 하나만 실행해야 하는 것은 아니며, 둘을 섞어서 App을 만들 수도 있음.

데이터 병렬 실행

동일한 데이터를 쪼갠 뒤, 각 부분집합을 연산하는데 초점을 맞춘다.

예를 들어, 다음과 같은 배열 : [0, 1, 2, 3, … n] 의 합을 구한다고 쳐보자.

싱글코어 ⇒ [0, 1, 2, 3, … n]의 합을 그냥 구한다.

반면, 듀얼코어라면 다음과 같이 동작한다.

  • 코어1 : [0, 1, 2, … n/2 - 1] 의 합을 구한다.
  • 코어2 : 나머지의 합을 구한다.
  • 두 결과를 서로 더한다.

태스크 병렬 실행

각각의 태스크를 코어에 분배한다.

다음과 같은 배열 : [0, 1, 2, 3, … n] 관련 작업을 한다고 쳐보자.

  • 코어 1 : [0, 1, 2, 3, … n] 의 합을 구한다.
  • 코어 2 : [0, 1, 2, 3, … n] 의 평균을 구한다.