멀티코어 프로그래밍: 두 판 사이의 차이

20번째 줄: 20번째 줄:
===멀티 스레드 프로그래밍===
===멀티 스레드 프로그래밍===
'''멀티 스레드 프로그래밍'''은 하나의 작업을 위해서 하나의 프로세스에서 여러 스레드를 생성하여 여러 CPU코어를 사용하기 위해 코드를 작성하는 작업을 말한다. 스레드는 하나의 프로세스의 힙 메모리 공간과 텍스트 메모리 공간을 공유하고 있기 때문에 서로 변수나 객체의 교환이 가능하다.
'''멀티 스레드 프로그래밍'''은 하나의 작업을 위해서 하나의 프로세스에서 여러 스레드를 생성하여 여러 CPU코어를 사용하기 위해 코드를 작성하는 작업을 말한다. 스레드는 하나의 프로세스의 힙 메모리 공간과 텍스트 메모리 공간을 공유하고 있기 때문에 서로 변수나 객체의 교환이 가능하다.
===GPU를 이용한 멀티 코어 프로그래밍===
그래픽카드는 CPU보다 훨씬 많은 산술 연산 장치를 가지고 있는 하드웨어이다. 특정 라이브러리(CUDA, OpenCL, Direct Compute)을 이용하면 CPU보다 연산 속도가 빠른 GPU를 사용할 수 있다. 하지만 복잡하다는 단점이 있다.
===멀티 프로세스와 멀티 스레드의 장단점===
===멀티 프로세스와 멀티 스레드의 장단점===
멀티 프로세스 프로그램의 경우에는 여러 프로세스를 사용해서 서로 간의 프로세스 통신을 해야 하고 프로세스와 프로세스 사이의 컨텍스트 스위칭이 스레드와 스레드 사이의 컨텍스트 스위칭 보다 부하(overhead)가 크므로 전체 속도에서 손해를 볼 수 있다. 반면 각각의 프로세스는 별개의 메모리 공간을 지니고 있으므로 하나의 프로세스에서 오류가 생겨 종료한다 해도 다른 프로세스에는 영향이 없다는 장점이 있다.
멀티 프로세스 프로그램의 경우에는 여러 프로세스를 사용해서 서로 간의 프로세스 통신을 해야 하고 프로세스와 프로세스 사이의 컨텍스트 스위칭이 스레드와 스레드 사이의 컨텍스트 스위칭 보다 부하(overhead)가 크므로 전체 속도에서 손해를 볼 수 있다. 반면 각각의 프로세스는 별개의 메모리 공간을 지니고 있으므로 하나의 프로세스에서 오류가 생겨 종료한다 해도 다른 프로세스에는 영향이 없다는 장점이 있다.

2017년 5월 15일 (월) 21:52 판

멀티코어 프로그래밍이란 하나의 작업을 위해 여러 개의 CPU코어를 사용하기 위해 코드를 작성하는 작업을 말한다. 멀티코어를 사용하기 위해서는 여러가지 방법이 있다.

기본 용어 정리

프로세스

프로세스(Process)란 간단하게 실행 중인 프로그램을 말한다. 좀 더 자세히 말하면 다음과 같은 요소로 이루어진다.

  • 프로세스가 실행할 프로그램 명령문이 저장된 텍스트 메모리 공간
  • 프로세스 내에서 함수가 호출된 순서과 호출한 위치를 저장하는 스택 메모리 공간
  • 프로세스에서 동적으로 할당된 힙 메모리 공간
  • 프로세스의 현재 상태가 저장된 CPU의 레지스터들

스레드

스레드(Thread)란 프로세스 내에서 프로세스의 텍스트 메모리 공간과 힙 메모리 공간을 공유하며 별개의 스택 메모리 공간과 CPU 레지스터를 가지는 별개의 실행 흐름이다. 스레드에는 유저 레벨 스레드와 커널 레벨 스레드로 구분된다.

컨텍스트

Context는 문맥이라 번역하는데 프로세스 혹은 스레드의 현재 무엇을 실행하고 있는지, 어디까지 실행하고 있는 정보를 말한다.

컨텍스트 스위칭

Context switching은 현재 실행 중이던 스레드가 다른 스레드로 교체되는 작업을 말한다. 이 작업은 운영체제에서 담당한다.

멀티 코어 사용 기법

멀티 프로세스 프로그래밍

멀티 프로세스 프로그래밍은 하나의 작업을 위해서 여러 개의 프로세스를 생성하여 여러 CPU코어를 사용하기 위해 코드를 작성하는 작업을 말한다. 프로세스는 각자 별개의 메모리 영역을 가지고 있기 때문에 서로의 메모리 공간에 접속할 수 없기 때문에 IPC(InterProcess Communication)이라는 기법이 필요하다.

멀티 스레드 프로그래밍

멀티 스레드 프로그래밍은 하나의 작업을 위해서 하나의 프로세스에서 여러 스레드를 생성하여 여러 CPU코어를 사용하기 위해 코드를 작성하는 작업을 말한다. 스레드는 하나의 프로세스의 힙 메모리 공간과 텍스트 메모리 공간을 공유하고 있기 때문에 서로 변수나 객체의 교환이 가능하다.

GPU를 이용한 멀티 코어 프로그래밍

그래픽카드는 CPU보다 훨씬 많은 산술 연산 장치를 가지고 있는 하드웨어이다. 특정 라이브러리(CUDA, OpenCL, Direct Compute)을 이용하면 CPU보다 연산 속도가 빠른 GPU를 사용할 수 있다. 하지만 복잡하다는 단점이 있다.

멀티 프로세스와 멀티 스레드의 장단점

멀티 프로세스 프로그램의 경우에는 여러 프로세스를 사용해서 서로 간의 프로세스 통신을 해야 하고 프로세스와 프로세스 사이의 컨텍스트 스위칭이 스레드와 스레드 사이의 컨텍스트 스위칭 보다 부하(overhead)가 크므로 전체 속도에서 손해를 볼 수 있다. 반면 각각의 프로세스는 별개의 메모리 공간을 지니고 있으므로 하나의 프로세스에서 오류가 생겨 종료한다 해도 다른 프로세스에는 영향이 없다는 장점이 있다.

멀티 스레드 프로그램의 경우네는 한 프로세스에서 여러 스레드를 사용하므로 서로 간의 통신또한 빠르며 프로세스와 프로세스의 컨텍스트 스위칭이 없으므로 속도가 빠를 수 있다. 하지만 여러 스레드가 하나의 프로세스에 존재하므로 하나의 스레드에 문제가 생겨 종료가 되면 다른 스레드에서 영향을 미쳐 프로세스가 종료가 된다는 단점이 있다.

멀티 코어 사용시에 생길 수 있는 문제

공유 자원 문제

공유 자원이란 시스템 안에서 각 프로세스, 스레드끼리 함께 접근을 할 수 있는, 모니터, 프린터, 메모리, 파일, 네트워크등의 자원을 말한다. 공유자원은 프로세스에서 접근하여 수정할 수 있기 때문에 A라는 프로세스에서 B라는 파일을 수정하고 있을 때, C라는 프로세스가 B파일을 읽는다면 C프로세스가 읽는 B파일 데이터에 오류가 생길 수 있으며, A프로세스와 C프로세스가 B파일을 동시에 수정하려 할 때는 충돌이 일어날 수 있다.

이런 문제를 해결하기 위해서 운영체제에서 공유 자원을 관리하기 때문에 멀티 프로세스 프로그램에서는 속도는 느리지만 대부분의 공유자원 문제에서 자유롭다. 하지만 멀티 스레드 프로그램의 경우에는 프로세스 안에서 메모리를 공유하기 때문에 메모리 공유의 문제가 생긴다.

실제 프로그램의 예