컴퓨터 공학/멀티쓰레드

멀티쓰레드 프로그래밍 소개

hhzn 2024. 10. 14. 16:42

오늘날의 컴퓨터는 코어 수에 따라서 직렬 컴퓨터와 병렬 컴퓨터 두 종류로 나눌 수 있다.

 

직렬 컴퓨터는 Serial Computer라고 하고, Single Core 컴퓨터라고도 한다.

하나의 CPU(또는 Core)만을 갖는 컴퓨터로 듀얼 코어가 대중화되기 이전의 대부분의 컴퓨터를 가리킨다.

학사 과정에서 배우는 대부분의 컴퓨터공학 지식들은 (자료구조 및 알고리즘) 싱글 코어 컴퓨터를 가정하고 있다.

 

 

병렬 컴퓨터는 Parallel Computer 라고 한다.

여러 개의 CPU(또는 Core)가 명령을 실행하는 컴퓨터로 직렬 컴퓨터의 속도 제한을 극복하기 위해 제작되었다. 
현재 우리가 작성하는 프로그램이 실행되는 컴퓨터이다.

 

 

병렬 컴퓨터

병렬 컴퓨터는 여러 개의 작업을 보다 더 빨리 실행하기 위해서 ... 는 여러 대의 컴퓨터를 사용하여도 가능하다.

궁극적 목적은 하나의 작업을 보다 빨리 실행하기 위함이다.

 

 

병렬 프로그램

병렬 프로그램은 동시에 여러 개의 명령 흐름이 실행되는 프로그램이다. 

직렬 컴퓨터에서 실행함을 가정하고 만들어진 프로그램을 병렬 컴퓨터에서 실행했을 경우의 속도 증가는 0%이다. 

우리는 동시에 여러 개의 명령 흐름이 실행되도록 프로그래밍 해야 한다.

 

병렬 프로그램의 특징은 실행된 프로세스의 내부 여러 곳이 동시에 실행된다는 점이다.
동시에 실행되는 객체들 사이에 동기화는 필수이다. 

병렬 프로그램의 모델은 두 가지 있는데, 공유 메모리 모델과 메시지 패싱 모델이다.

공유 메모리(Shared Memory) 모델은 간단히 말하면 스레드끼리 메모리를 공유하는 방식이다.

메시지 패싱(Message Passing) 모델은 함수를 통해 스레드 아이디와 데이터를 명시해 데이터를 주고받는 방식이다. 커널을 이용하기 때문에 시스템 콜로 수행된다.

 

병렬 프로그래밍은 정확성과 성능을 요구한다. 여러 콘텍스트(context)에서 동시다발적으로 호출해도 문제 없이 실행되는 알고리즘이 필요한데, 이를 지키는 것이 매우 어렵다. 오류가 발생한다면 성능이 아무리 빨라져도 소용이 없다.

또한 콘텍스트가 증가함에 따라 성능 또한 향상되어야 한다.

성능 향상이 코어의 개수에 비례하는 알고리즘이 최고의 알고리즘이다. 코어 개수 이상으로 빨라질 수는 없고, 기존의 직렬 프로그램보다 느려질 수도 있는데 이 경우 병렬 프로그래밍을 사용할 이유가 없다.

 

 

 

멀티스레드 프로그래밍

현재 운영체제에서 병렬 프로그래밍의 유일한 구현 수단이다. 하나의 프로세스 안에서 여러 개의 스레드를 실행시켜 병렬성을 얻는 프로그래밍 방법이다.

멀티코어 CPU에서의 프로그램 성능 향상을 위한 방법이다. 싱글 컴퓨터, 분산 컴퓨터에서는 사용할 수 없다. 

 

 


 

 

멀티 스레드 프로그래밍을 위해서 알아야 할 기본 지식들이 있다. 다음의 내용들이다.

 

운영체제는 사용자의 프로그램을 프로세스 단위로 관리한다. 즉 실행되는 프로그램은 프로세스이다.

실행 파일은 운영체제가 파일 내용을 메모리에 복사 후 시작 주소로 점프해서 실행된다. 

오늘 날의 대부분의 운영체제는 시분할 시스템으로 작동하는데, 여러 프로세스를 고속으로 번갈아 가면서 실행되는 시스템이다. 실행 중인 프로세스의 상태를 강제로 준비 상태로 변경하여 반복한다.

 

프로세스의 메모리는 총 네 구역으로 이루어져 있다.

  • CODE segment : 실행될 명령어가 들어가는 구역
  • DATA segment : 전역 변수가 들어가는 구역
  • STACK segment : 지역 변수와 함수 리턴 주소가 들어가는 구역
  • HEAP segment : malloc 이나 new 로 할당받은 메모리가 들어가는 구역

각 영역이 어떤 특징을 가지고 있는지 잘 알고있어야 한다.

 

 

프로세스와 스레드의 특징과 차이점도 알아야 하는데,

 

프로세스는 초기에 하나의 시작 스레드를 가지며, 스레드는 다른 스레드를 만들 수 있다.

스레드 생성은 프로그래머가 지시하며 모든 스레드는 자신 고유의 스택(STACK)을 갖고있다. 이말인 즉슨 스레드끼리는 STACK을 공유하지 않으며, DATA, CODE, HEAP을 공유한다. 

스레드는 CPU에서 하드웨어적으로 관리된다.

 

스레드의 여러 특징들은 프로세스의 특징에 대해 많은 장점을 갖고있다.
프로세스를 만드는 것은 오버헤드(Overhead)가 매우 큰 작업이다. 그러나 스레드는 생성 오버헤드가 적다. 스레드는 공유하지 않는STACK 만을 신경쓰면 되는데, 프로세스는 모든 구역에 대해 공유하지 않기 때문에 생성 오버헤드가 매우 크다. 이와 같은 이유로 Context switch 비용이 프로세스보다 스레드가 적게들고, 스레드간 통신이 간단하다.

 


 

그래서 결론은.. 

 

고성능을 필요로 하는 프로그램은 멀티 스레딩을 지원하지 않으면 살아남지 못한다. 프로그래밍 방법을 바꿔 기존의 프로그램을 멀티 코어 CPU에서 실행했을 때 속도 향상이 있도록 프로그램 하여야 한다.

 

 

 

 

** 오류 지적은 환영입니다.^^ **

'컴퓨터 공학 > 멀티쓰레드' 카테고리의 다른 글

멀티쓰레드 프로그래밍 입문  (1) 2024.10.16