반응형

멀티스레드 프로그래밍 패턴

1. 공유 메모리 모델

- 모든 코어/스레드가 하나의 메모리 공간을 공유하는 모델

 

고려해야할 점.

- 메모리 쓰기 작업하려고하면, 먼저 메모리 공간이 쓰기 가능한지(다른스레드가 작업중인지) 확인해야함.

(그 후, 메모리 영역에 잠금(lock)을 걸고 쓰기해야함.  그 후 해제해야한다.)

 

단점

- 잠금 매커니즘 관리가 까다로움.

- 성능 병목이 발생

  - 스레드가 잠금획득한 상태로 죽어버리거나 (데드락)

  - 두 개의 스레드가 경쟁적으로 잠금 획득하려고 함 (레이스 컨디션)

  - 잠가놓은 리소스 획득하기 위해 무한 대기 (스타베이션)

- 가장 느린 스레드의 속도에 다른 모든 스레드의 속도가 맞춰짐. (잠금 확인하는 시점에 모든 스레드가 동기화되야해서)

 

장점

 스레드 간 공유되는 자원이 아예 없다면, 락없이 빠른 병렬성 보장 됨.

행 하나하나를 리소스로 보고 스레드 개수로 분할도 가능. (물론, 사양표나 테스트를 통해 해당작업이 Thread-safe인지 반드시 확인해야함.)

 

 GPU는 공유 메모리 모델을 사용함. 잠금 관리의 '까다로운'부분은 하드웨어와 드라이버(런타임 라이브러리)에서 어느 정도 관리를 해주기때문임.

 

 

2. 메시지 전달 모델 (생산자-소비자 패턴)

- 모든 작업 스레드가 완전히 격리된 메모리 공간 할당받음. 

- 스레드 간 데이터 교환은 통신 채널을 통해, 서로 메시지를 교환함으로 이뤄짐.

 

'워커 스레드'(이 떄는 소비자)는 이미지에서 값을 읽어서 5를 뺀다. 

'워커 스레드'(이 떄는 생산자)는 자신의 결과값을 출력 스레드로 던진다. 

공유 메모리 모델은 좌표값 필요 없었음 (메모리 주소 자체가 좌표값 역할)

메시지 전달 모델에서는 좌표값, 색상값 모두 필요. (어떤 스레드가 작업을 머저 끝낼지 몰라서)

 

입력, 워커, 출력 스레드가 각자 격리된 메모리 공간을 소유함.

단점

- 메모리의 공간적 부담이 늘어나는 단점이 있다.

- 메모리를 일관성 없이 참조해, CPU 캐시 적중률이 수직 하락하는 단점.

 

장점

- 각자 스레드가 자신이 낼 수 있는 최고 속도로 동작 가능.

 

 

 

 

 

멀티프스레드 프로그래밍 

멀티 코어를 이용하는 가장 기초적인 방법은 운영체제가 지원하는 스레드 생성 API를 이용해서 스레드 생성하고, 일감 분배, 데이터 분산, 처리 및 결과값 도출을 직접 짜는 것.

 

참고자료

https://namu.wiki/w/%EB%A9%80%ED%8B%B0%EC%BD%94%EC%96%B4%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C#s-2.4

반응형