태크놀로지

멀티쓰레드 프로그램 작성시 주의해야할점 - CPU 본문

멀티코어

멀티쓰레드 프로그램 작성시 주의해야할점 - CPU

원택 2020. 9. 17. 23:00

멀티쓰레드 프로그램 작성시 주의점

  • 컴파일러
  • CPU
    • 상호배제의 구현
    • 메모리 일관성 문제

 

상호배제

멀티쓰레드 프로그램에서의 문제는 하나의 자원을 여러 쓰레드에서 동시에 사용해서 생기는 경우가 대부분이다. 해결책은 상호배제

 

임계영역

  • Critical Section
  • 프로그램중 상호배제로 보호받고 있는 구간
  • 오직 하나의 쓰레드만 실행할 수 있음

임계영역 구현 - lock & unlock을 사용해서 lock과 unlock 사이에 임계영역을 둔다.

 

lock & unlock의 문제점

  • 병렬성이 없다.
  • 호출하는데 오버헤드가 크다. (cpu를 많이 잡아먹음)

그럼 lock과 unlock을 어떻게 구현해야하나?

 

  • 공유 메모리를 통해서 구현
  • 피커슨, 데커, 빵집 알고리즘

-> lock을 시스템 콜로 하는게 아니라 알고리즘으로 구현함 (+특별한 명령어)

 

피터슨 알고리즘

  • 쓰레드 2개만 가능(3개부터 안됨)
  • 매개변수로 쓰레드 아이디를 전달받아야함. 또한 쓰레드 아이디는 0 또는1 이라고 가정

코드분석

Flag[myId] = true // 다른 쓰레드가 사용하는거를 막음
victim = myId
while(Flag[other] && victim == myId) // 내 쓰레드가 접근하려할때 다른쓰레드가 접근중인지를 체크

case1

두 쓰레드가 동시에 lock을 실행할 수 있음. 동시에 실행되서 bool 값이 동시에 true가 됨(데드락 발생)

victim = myId로 데드락 문제 해결

 

mutex와의 성능비교

멀티쓰레드(그냥) 144 / 결과 X

싱글쓰레드 199 / 결과 O

멀티쓰레드(lock) 4051 / 결과 O

싱글쓰레드(lock) 2199 / 결과 O

멀티쓰레드(peterson) 5367 / 결과 X

-> 오히려 mutex보다 더 느리고 결과도 이상함.

 

피터슨 알고리즘의 문제

  • 빈번한 메모리 참조로 인한 성능 문제 flag, victim
  • 실제 컴퓨터에서 오동작을 일으킴

결론은 피터슨 알고리즘은 mutex보다 성능과 정확성이 떨어진다.

 


다음 포스팅 - [실습1 베이커리 알고리즘]

베이커리 알고리즘이란 n개의 쓰레드에서 동기화 구현

  • 빵집 알고리즘 구현해보기
  • 1억만들기 프로그램 사용
  • 쓰레드 1, 2, 4, 8, 16개 일때 실행시간을 구해라
  • mutex 있고 없고 버전과 속도 비교
  • 제출물
    • .cpp
    • 실행속도 비교표 (no lock, mutex 사용, 빵집 알고리즘)
    • CPU의 종류 (모델명, 코어개수, 클럭)
    • 실행시간이 30분 이상 걸리거나 컴퓨터가 버벅거리면 속도 측정 생략 가능
      • 이러한 이상 현상이 생기는 원인에 대한 예측 설명

 

 


출처

한국산업기술대학교 게임공학부 정내훈 교수님 강의 - 멀티코어 프로그래밍