SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
멀티쓰레드 프로그래밍과
   동기화 객체
   김성익 (noerror@hitel.net)
               2005.03.31
도입
• 멀티 테스킹, 멀티 쓰레드, 멀티 프로세
  서

• 멀티 쓰레드 프로그래밍 활용
• 싱글 쓰레드와 멀티 쓰레드의 차이
• 동기화 객체
멀티쓰레드
• 프로세스(Process)란 ?

• 쓰레드(Thread)란 ?

• 컨텍스트 스위칭    (Context Switching)
 쓰레드 레벨의 컨텍스트 스위칭, 프로세스 레벨의 컨
 텍스트 스위칭 차이
 컨텍스트 스위칭 비용, 메모리 공유
멀티쓰레드 프로그래밍
• 다수의 쓰레드를 동시에 활용하여 개발

• 병목 현상을 줄이고 효율을 높인다.
 컨텍스트 스위칭의 비용에도 불구하고 더 빠른 효율
 을 가지도록 접근
• 개별적인 작업을 동시에 한다.
 연관성이 없는 작업을 어렵게 끼워 맞출 필요가 없음
병목
• IO등의 작업으로 블록
  상태로 전이할 경우

• 예제
 극단적인 경우지만 Sleep 에
 해당하는 작업 동안에는 CPU는
 대기
 결과값은 약 2000.
병목 제거
• 멀티 쓰레드로 개선
 결과는 약1000.
사용 / 관련 함수
• CreateThread
 쓰레드를 생성 (beginthread과 같은 기능)
 주의)마지막 인자 NULL인 경우 98에서는 Fail
• TerminateThread
 쓰레드를 강제로 정지
 사용 지양 (자바는 초기 시절에만 존재)
• SetThreadPriority/GetThreadPriority
• WaitForSingleObject/MultipleObjects
• CloseHandle
컨텍스트 스위칭 조건
• 블럭모드로 진입(Sleep 함수, IO 작업)
 sleep(0) ??
 스케줄링 룰에 따라    (임의제어불가)
동기화 문제 (1)
• 멀티 쓰레드는 메모리 공유
동기화 문제(2)
• 쓰레드만 봤을 때는 논리적 오류가 없지
  만 컨텍스트 스위칭 일어난 시점에 따라
  치명적인 문제 발생
동기화 문제(3)
• 레지스터에 저장된 이전 값을 사용하는
  경우
동기화 처리
• 동기화 객체이용
동기화 객체
• 기능 : Enter/Leave

•   크리티컬 섹션 Critical Section
•   뮤텍스 Mutex
•   세마포어 Semaphore
•   이벤트 Event
크리티컬 섹션(1)
• 하나의 쓰레드만 통과 가능
 프로세스(process)간의 동기화에 사용 불가
• 다른 쓰레드가 사용중이면 블럭됨
 CPU를 다른 쓰레드로 넘김
• 커널 레벨의 객체가 아니라 빠르다
 뮤텍스, 세마포어등의 다른 객체에 비해서
• 한 쓰레드에서 여러 번 호출시 무시
 데드락을 막기 위함 ???
크리티컬 섹션(2)
• 사용




• 스핀락   spinlock
 멀티 프로세서 환경에서 빈번한 컨텍스트 스위칭을
 막기 위해 바로 스위칭 하지 않고 일정 카운트 만큼
 CPU가 대기
세마포어 (1)
• N개만큼 통과 가능
• Named Semaphore는 프로세스간의
  동기화 처리도 가능
• 쓰레드, 프로세스 무관하게 카운트
 한 쓰레드에서 모두 소유한 상태에서 다시 Enter 하
 면 데드락 (비교. 크리티컬섹션)
세마포어 (2)
• 사용흐름




• 초기 N에서 사용시 -1, 사용 후 +1 =>
  카운트가 0이면 대기 상태로
뮤텍스
• 카운트가 1인 세마 포어
• 사용흐름
이벤트(1)
• 시그널을 제어 할 수 있다
 근본적으로 Mutex, Shemapore와 다른점
 Mutex, Shemapore는 wait and signal이 무조
 건 자동, 이벤트는 수동 Reset이 가능하다
• IO 동기화 등에 사용됨
 시그널을 함수로 셋 가능한 특성 이용
이벤트(2)
• 수동 리셋 / 자동 리셋 방식
• 자동시그널 사용흐름 (mutex 유사)




• 수동시그널
 흐름을 외부에서 제어하는 데 주로 사용
데드락
• 동기화 객체에서 대기하지만 영원히 대
  기하게 되는 경우
 같은 쓰레드에서 사용중인 동기화 객체를 다시 통과
 하려고 할 때 영원히 통과할 수 없는 경우
 서로 다른 쓰레드에서 상대 객체를 대기하면서 기다
 리는 경우


• 논리적 오류
응용
• N개의 read 허용하며, write시는 하나
  만 가능하고, 이때 read 는 불가능
결론
• 멀티 쓰레드에서의 동기화의 까다로움
• 동기화의 문제는 쉽게 발견되지 않음
• 그럼에도 불구하고 효율을 높일 수 있다
  면?

Mais conteúdo relacionado

Mais procurados

Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
중선 곽
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
devCAT Studio, NEXON
 
프라우드넷 사용법 훑어보기
프라우드넷 사용법 훑어보기프라우드넷 사용법 훑어보기
프라우드넷 사용법 훑어보기
Hyun-jik Bae
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
devCAT Studio, NEXON
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
ChangKyu Song
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
devCAT Studio, NEXON
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문
중선 곽
 

Mais procurados (20)

Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
프라우드넷 사용법 훑어보기
프라우드넷 사용법 훑어보기프라우드넷 사용법 훑어보기
프라우드넷 사용법 훑어보기
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Node-express 채팅 서버 개발기
Node-express 채팅 서버 개발기Node-express 채팅 서버 개발기
Node-express 채팅 서버 개발기
 
암호화 이것만 알면 된다.
암호화 이것만 알면 된다.암호화 이것만 알면 된다.
암호화 이것만 알면 된다.
 
Network 초보자를 위한 Netty
Network 초보자를 위한 NettyNetwork 초보자를 위한 Netty
Network 초보자를 위한 Netty
 
컴퓨터 네트워크와 인터넷
컴퓨터 네트워크와 인터넷컴퓨터 네트워크와 인터넷
컴퓨터 네트워크와 인터넷
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
[125]웹 성능 최적화에 필요한 브라우저의 모든 것
[125]웹 성능 최적화에 필요한 브라우저의 모든 것[125]웹 성능 최적화에 필요한 브라우저의 모든 것
[125]웹 성능 최적화에 필요한 브라우저의 모든 것
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음서버 개발자가 되기 위한 첫 걸음
서버 개발자가 되기 위한 첫 걸음
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
 
서버성능개선 류우림
서버성능개선 류우림서버성능개선 류우림
서버성능개선 류우림
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문
 

Destaque

Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
Sunghyouk Bae
 
[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효
NAVER D2
 

Destaque (7)

[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
 
[135] 우리 팀에서도 코드리뷰를 할 수 있을까 안오균
[135] 우리 팀에서도 코드리뷰를 할 수 있을까 안오균[135] 우리 팀에서도 코드리뷰를 할 수 있을까 안오균
[135] 우리 팀에서도 코드리뷰를 할 수 있을까 안오균
 
[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효[145]5년간의네이버웹엔진개발삽질기그리고 김효
[145]5년간의네이버웹엔진개발삽질기그리고 김효
 
티켓몬스터를 위한 PHP 개발 방법
티켓몬스터를 위한 PHP 개발 방법티켓몬스터를 위한 PHP 개발 방법
티켓몬스터를 위한 PHP 개발 방법
 
유연하게 확장할 수 있는 PHP 웹 개발 이야기
유연하게 확장할 수 있는 PHP 웹 개발 이야기유연하게 확장할 수 있는 PHP 웹 개발 이야기
유연하게 확장할 수 있는 PHP 웹 개발 이야기
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 

Semelhante a 05_동기화_개요

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu Kang
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
xxbdxx
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patterns
QooJuice
 
05_스마트 포인터 구현하기
05_스마트 포인터 구현하기05_스마트 포인터 구현하기
05_스마트 포인터 구현하기
noerror
 
06_게임엔진 활용팁
06_게임엔진 활용팁06_게임엔진 활용팁
06_게임엔진 활용팁
noerror
 

Semelhante a 05_동기화_개요 (20)

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Microsoft pp lpdf
Microsoft pp lpdfMicrosoft pp lpdf
Microsoft pp lpdf
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
네이버 NLP Challenge 후기
네이버 NLP Challenge 후기네이버 NLP Challenge 후기
네이버 NLP Challenge 후기
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
 
More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patterns
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
Neural turing machine
Neural turing machineNeural turing machine
Neural turing machine
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
 
05_스마트 포인터 구현하기
05_스마트 포인터 구현하기05_스마트 포인터 구현하기
05_스마트 포인터 구현하기
 
Asynchronous 101 - (1)
Asynchronous 101 - (1)Asynchronous 101 - (1)
Asynchronous 101 - (1)
 
06_게임엔진 활용팁
06_게임엔진 활용팁06_게임엔진 활용팁
06_게임엔진 활용팁
 

Mais de noerror

NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집
noerror
 
KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법
noerror
 
11_통계 자료분석 입문
11_통계 자료분석 입문11_통계 자료분석 입문
11_통계 자료분석 입문
noerror
 
11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법
noerror
 
ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법
noerror
 
08_Marching Cube Terrains
08_Marching Cube Terrains08_Marching Cube Terrains
08_Marching Cube Terrains
noerror
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드
noerror
 
08_플래시 맛보기
08_플래시 맛보기08_플래시 맛보기
08_플래시 맛보기
noerror
 
08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강
noerror
 
08_Wxwidgets 소개
08_Wxwidgets 소개08_Wxwidgets 소개
08_Wxwidgets 소개
noerror
 
07_PhysX 강체물리 입문
07_PhysX 강체물리 입문07_PhysX 강체물리 입문
07_PhysX 강체물리 입문
noerror
 
07_스케일폼 소개
07_스케일폼 소개07_스케일폼 소개
07_스케일폼 소개
noerror
 
07_Visual Shader Editor
07_Visual Shader Editor07_Visual Shader Editor
07_Visual Shader Editor
noerror
 
06_HDR 소개
06_HDR 소개06_HDR 소개
06_HDR 소개
noerror
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
noerror
 
06_자동차물리입문(1)
06_자동차물리입문(1)06_자동차물리입문(1)
06_자동차물리입문(1)
noerror
 
06_앰비언트어클루전 소개
06_앰비언트어클루전 소개06_앰비언트어클루전 소개
06_앰비언트어클루전 소개
noerror
 

Mais de noerror (20)

15_TextureAtlas
15_TextureAtlas15_TextureAtlas
15_TextureAtlas
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용
 
NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집NDC08_실시간비주얼그래프편집
NDC08_실시간비주얼그래프편집
 
KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법KCGS11_실시간 피사계 심도 렌더링 개선 기법
KCGS11_실시간 피사계 심도 렌더링 개선 기법
 
11_통계 자료분석 입문
11_통계 자료분석 입문11_통계 자료분석 입문
11_통계 자료분석 입문
 
11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템11_빠른 개발 가능한 레벨 편집 시스템
11_빠른 개발 가능한 레벨 편집 시스템
 
11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법11_SH를 이용한 실시간 투명 근사법
11_SH를 이용한 실시간 투명 근사법
 
ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법ICON08_게임 애니메이션 최적화 기법
ICON08_게임 애니메이션 최적화 기법
 
08_Marching Cube Terrains
08_Marching Cube Terrains08_Marching Cube Terrains
08_Marching Cube Terrains
 
08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드08_게임 물리 프로그래밍 가이드
08_게임 물리 프로그래밍 가이드
 
08_플래시 맛보기
08_플래시 맛보기08_플래시 맛보기
08_플래시 맛보기
 
08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강08_애니메이션고등학교 게임과 특강
08_애니메이션고등학교 게임과 특강
 
08_Wxwidgets 소개
08_Wxwidgets 소개08_Wxwidgets 소개
08_Wxwidgets 소개
 
07_PhysX 강체물리 입문
07_PhysX 강체물리 입문07_PhysX 강체물리 입문
07_PhysX 강체물리 입문
 
07_스케일폼 소개
07_스케일폼 소개07_스케일폼 소개
07_스케일폼 소개
 
07_Visual Shader Editor
07_Visual Shader Editor07_Visual Shader Editor
07_Visual Shader Editor
 
06_HDR 소개
06_HDR 소개06_HDR 소개
06_HDR 소개
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
 
06_자동차물리입문(1)
06_자동차물리입문(1)06_자동차물리입문(1)
06_자동차물리입문(1)
 
06_앰비언트어클루전 소개
06_앰비언트어클루전 소개06_앰비언트어클루전 소개
06_앰비언트어클루전 소개
 

05_동기화_개요

  • 1. 멀티쓰레드 프로그래밍과 동기화 객체 김성익 (noerror@hitel.net) 2005.03.31
  • 2. 도입 • 멀티 테스킹, 멀티 쓰레드, 멀티 프로세 서 • 멀티 쓰레드 프로그래밍 활용 • 싱글 쓰레드와 멀티 쓰레드의 차이 • 동기화 객체
  • 3. 멀티쓰레드 • 프로세스(Process)란 ? • 쓰레드(Thread)란 ? • 컨텍스트 스위칭 (Context Switching) 쓰레드 레벨의 컨텍스트 스위칭, 프로세스 레벨의 컨 텍스트 스위칭 차이 컨텍스트 스위칭 비용, 메모리 공유
  • 4. 멀티쓰레드 프로그래밍 • 다수의 쓰레드를 동시에 활용하여 개발 • 병목 현상을 줄이고 효율을 높인다. 컨텍스트 스위칭의 비용에도 불구하고 더 빠른 효율 을 가지도록 접근 • 개별적인 작업을 동시에 한다. 연관성이 없는 작업을 어렵게 끼워 맞출 필요가 없음
  • 5. 병목 • IO등의 작업으로 블록 상태로 전이할 경우 • 예제 극단적인 경우지만 Sleep 에 해당하는 작업 동안에는 CPU는 대기 결과값은 약 2000.
  • 6. 병목 제거 • 멀티 쓰레드로 개선 결과는 약1000.
  • 7. 사용 / 관련 함수 • CreateThread 쓰레드를 생성 (beginthread과 같은 기능) 주의)마지막 인자 NULL인 경우 98에서는 Fail • TerminateThread 쓰레드를 강제로 정지 사용 지양 (자바는 초기 시절에만 존재) • SetThreadPriority/GetThreadPriority • WaitForSingleObject/MultipleObjects • CloseHandle
  • 8. 컨텍스트 스위칭 조건 • 블럭모드로 진입(Sleep 함수, IO 작업) sleep(0) ?? 스케줄링 룰에 따라 (임의제어불가)
  • 9. 동기화 문제 (1) • 멀티 쓰레드는 메모리 공유
  • 10. 동기화 문제(2) • 쓰레드만 봤을 때는 논리적 오류가 없지 만 컨텍스트 스위칭 일어난 시점에 따라 치명적인 문제 발생
  • 11. 동기화 문제(3) • 레지스터에 저장된 이전 값을 사용하는 경우
  • 13. 동기화 객체 • 기능 : Enter/Leave • 크리티컬 섹션 Critical Section • 뮤텍스 Mutex • 세마포어 Semaphore • 이벤트 Event
  • 14. 크리티컬 섹션(1) • 하나의 쓰레드만 통과 가능 프로세스(process)간의 동기화에 사용 불가 • 다른 쓰레드가 사용중이면 블럭됨 CPU를 다른 쓰레드로 넘김 • 커널 레벨의 객체가 아니라 빠르다 뮤텍스, 세마포어등의 다른 객체에 비해서 • 한 쓰레드에서 여러 번 호출시 무시 데드락을 막기 위함 ???
  • 15. 크리티컬 섹션(2) • 사용 • 스핀락 spinlock 멀티 프로세서 환경에서 빈번한 컨텍스트 스위칭을 막기 위해 바로 스위칭 하지 않고 일정 카운트 만큼 CPU가 대기
  • 16. 세마포어 (1) • N개만큼 통과 가능 • Named Semaphore는 프로세스간의 동기화 처리도 가능 • 쓰레드, 프로세스 무관하게 카운트 한 쓰레드에서 모두 소유한 상태에서 다시 Enter 하 면 데드락 (비교. 크리티컬섹션)
  • 17. 세마포어 (2) • 사용흐름 • 초기 N에서 사용시 -1, 사용 후 +1 => 카운트가 0이면 대기 상태로
  • 18. 뮤텍스 • 카운트가 1인 세마 포어 • 사용흐름
  • 19. 이벤트(1) • 시그널을 제어 할 수 있다 근본적으로 Mutex, Shemapore와 다른점 Mutex, Shemapore는 wait and signal이 무조 건 자동, 이벤트는 수동 Reset이 가능하다 • IO 동기화 등에 사용됨 시그널을 함수로 셋 가능한 특성 이용
  • 20. 이벤트(2) • 수동 리셋 / 자동 리셋 방식 • 자동시그널 사용흐름 (mutex 유사) • 수동시그널 흐름을 외부에서 제어하는 데 주로 사용
  • 21. 데드락 • 동기화 객체에서 대기하지만 영원히 대 기하게 되는 경우 같은 쓰레드에서 사용중인 동기화 객체를 다시 통과 하려고 할 때 영원히 통과할 수 없는 경우 서로 다른 쓰레드에서 상대 객체를 대기하면서 기다 리는 경우 • 논리적 오류
  • 22. 응용 • N개의 read 허용하며, write시는 하나 만 가능하고, 이때 read 는 불가능
  • 23. 결론 • 멀티 쓰레드에서의 동기화의 까다로움 • 동기화의 문제는 쉽게 발견되지 않음 • 그럼에도 불구하고 효율을 높일 수 있다 면?