(멀티쓰레딩) 동시성과 병렬화
동시성과 병렬성의 의미
동시성 : 하나의 작업 주체가 여러 작업을 빠르게 바꿔가며 마치 동시에 진행하는 것처럼 하는것으로 멀티 쓰레딩이라고 보면 된다. 동시에 실행되기 때문에 하나의 공유자원에 접근한다면 레이스컨디션과 같은 임계영역 문제가 발생하기 쉽다. 그렇기에 항상 사용하는 자원에 대해 lock을 걸고 접근해야 하는 규칙이 존재한다.
병렬화 : 여러 작업주체가 자신의 할당량을 수행하여 작업 시간을 단축하는것으로 cpu의 멀티코어에 의한 멀티 프로세싱 이라고 보면 된다.
동시성과 병렬성의 적용 문제
동시성은 CPU Bound 보다 IO Bound에 적용하면 더 좋은데, CPU Bound에서는 컨텍스트 스위치 비용이 더 커질 수 있기 때문이다. 반면 처리속도가 느려 스위칭 횟수가 적은 IO Bound에서는 아주 적합하다고 할 수 있다.
병렬성은 동시성과 다르게 IO Bound보다는 CPU Bound에서 더 효과적이다. CPU 처리 양이 많아지면 CPU에 부하가 걸리게 되는데, 해당 처리를 병렬적으로, 독립적으로 수행할 수 있게 해야 하기 때문이다.
멀티코어 프로세서
CPU안에 여러개의 코어가 들어 있는것으로, 각 코어는 독립적으로 메모리에서 명령을 인출(fetch)하고 해당 명령을 제어 신호로 바꿔주고(decode) 명령을 실행 후 결과를 레지스터에 저장한다. 장점은 빠른 속도로 실행할 수 있지만 단점은 단일코어 프로세서에 비해 전력소모가 크고 코어끼리 소통할 수 있는 기술이 필요하다.
시스템 아키텍처 스타일
SISD(Single Instruction stream, Single Data stream)
단일 코어 프로세서로 보면된다. 하나의 명령만 수행 가능하며 데이터 셋도 하나이다. 쓰레드를 만들어서 스위칭은 가능하지만 처리속도에 한계가 있어서 간단하고 적은 전력소모의 IOT 제품에 적합하다.
SIMD(Single Instruction stream, Multi Data stream)
하나의 명령만 수행가능하지만 여러 데이터셋이 존재하는 구성으로, 흔히 그래픽 카드 생각하면 된다. 여러 벡터, 행렬, 좌표 계산등에 하나의 명령을 한번에 동시에 계산시킨다. 다른 명령을 수행가능한 코어 대신 프로세스 유닛이 병렬로 존재하여 연산을 수행한다.
MIMD(Multi Instruction stream, Multi Data stream)
현재 나오는 CPU들의 아키텍처 구성으로써 다중 코어 프로세서와 동일 하다. 각 코어들이 각자 다른 명령을 여러 데이터셋을 대상으로 수행 가능하다.
컴퓨터 메모리 아키텍처 스타일
동시성 및 병렬화를 활용한 애플리케이션의 데이터에 접근하는 속도를 높이기 위해선 모든 코어가 프로세서 상에서 접근 가능한 단일 물리 주소 공간을 제공해야 한다. 즉 메인 메모리를 어떻게 구성할꺼냐에 관한 문제이다.
UMA(Uniform Memory Access)
코어와 메모리 사이의 거리에 상관없이 동일한 시간에 접근하기 위한 방법으로써 SMP(Symmetric Multi-Processing) 방식이라고도 한다.
구조는 보통 각 프로세서 코어들과 메모리 사이에 버스로 연결 되있다. 장점은 모든 메인메모리 접근 시간이 동일하며, 캐시가 일정하고 하드웨어 설계가 간단해진다. 하지만 하나의 버스만 이용하므로 확장성 문제가 있고 버스 대역폭에 의해 성능이 제한될 수 있다.
NUMA(Non-Uniform Memory Access)
프로세서 코어의 위치에 따라 메인메모리 접근 시간이 달라지는 아키텍처이다.
구조는 각 프로세서가 캐시, 메인메모리, 독립적인 입출력을 가지고 있고 서로 상호연결 되어 있다.
그렇기에 UMA에 비해 확장성과 해당 프로세서 내의 메모리 접근시 속도가 빠르다.
하지만 각 프로세서가 주변 프로세서를 모니터링 하고 있어야 하고 외부 프로세서의 메모리 접근을 하는데에 시간이 오래 걸린다.