SlideShare a Scribd company logo
1 of 37
Download to read offline
7가지 동시성 모델
스레드와 잠금장치
아꿈사 송성곤
2.1 동작하는 가장 단순한 코드
❏ 1일차 : 상호 배제와 메모리 모델
❏ 2일차 : 내제된 잠금 장치를 넘어서
❏ 3일차 : 거인의 어깨 위에서
2.2 1일차 : 상호배제와 메모리 모델
❏ 상호배제(Mutual exclusion)
❏ 경쟁조건(Race condition)
❏ 데드락(deadlock)
❏ 메모리 모델
2.2.1 스레드 만들기
Hello from new thread
Hello from main thread
Hello from main thread
Hello from new thread
2.2.2 첫번째 잠금장치
● 문제 : 두 쓰레드가 동시에
increment()를 실행하는 Race
condition 발생
● 해법 : 접근을 동기화하기
위해서 내재된 잠금(intrinsic
lock)을 이용
내재된 잠금장치 이용
2.2.3 메모리의 미스터리
● 문제 : 어떤 스레드가 동작한
결과가 다른 쓰레드에는
보이지 않는 경우 존재
○ 컴파일러는 코드가
실행되는 순서를
바꿈으로써 정적 최적화를
수행
○ JVM은 코드가 실행되는
순서를 바꿈으로써 동적
최적화
○ 코드를 실행하는
하드웨어는 코드의 순서를
바꾸는 것
2.2.4 메모리 가시성
자바 메모리 모델 : 한 스레드가 메모리에 가한 변화가 다른 메모리에 보이는 경우를
정의
단, 읽는 스레드와 쓰는 스레드가 동기화되지 않으면 그러한 가시성이 보장되지 않음
2.2.5 여러 개의 잠금장치
미리정해진 공통순서를 적용
잠금장치 요청시
공통순서를 따름
2.2.6 외부 메서드의 위험
순차 방문 전 방어적 복제
2.2.7 1일 차 마무리
❏ 공유되는 변수에 대한 접근을 반드시 동기화한다.
❏ 쓰는 스레드와 읽는 쓰레드가 모두 동기화 되어야 한다.
❏ 여러개의 잠금장치를 미리 정해진 공통의 순서에 따라 요청한다.
❏ 잠금장치를 가진 상태에서 외부 메서드를 호출하지 않는다.
❏ 잠금장치는 최대한 짧게 보유한다.
2.2.7 1일 차 마무리
❏ 자바 메모리 모델
❏ 참조 : http://changsuk.me/?p=2050
❏ 동기화와 가시성
❏ 자바의 표준 문서에선 JMM 명세를 통해 ‘먼저 발생한 일(happens-before)’이 무엇인지
보장함으로써 가시성의 단서를 제공
❏ 가시성을 위협하는 요소들
❏ 프로세서 캐시
❏ 동작의 재배열
❏ Volatile 키워드
2.2.7 1일 차 마무리
❏ 초기화 안정성
2.2.7 1일 차 마무리
❏ 중복확인 잠금(double checked locking) 안티 패턴
2.3 2일 차 : 내재된 잠금장치를 넘어서
내재된 잠금장치의 한계
❏ 내재된 잠금장치를 얻으려다가 블로킹 상태에 빠진 쓰레드를 원상복귀시킬 방법이 없다.
❏ 내재된 잠금장치를 얻으려고 노력하는 시간을 강제로 중단 시키는 타임아웃 기능이 없다.
❏ 내재된 잠금장치를 얻는 방법이 하나만 존재한다.
2.3.1 가로채기가 가능한 잠금장치
가로채기 가능한 잠금장치
2.3.2 타임아웃
● 문제 : 타임아웃이 데드락
상태에서 빠져나올수 있는
방법을 제공할뿐
● 데드락이라는 상황 자체를
발생 시키지 않는 것이 중요
2.3.3 협동 잠그기
연결리스트에 노드를 하나 삽입하려는 경우
협동 잠그기는 리스트의 일정한 부분만 잠그고,
그 외에 다른 노드에 대한 접근은 허용
2.3.4 조건 변수
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock () ;
Try {
while (! <<조건이 참이다.>>)
condition await();
≪공유되는 지원 사용≫
} finally {
lock.unlock();
}
2.3.5 원자 변수
원자 변수는 잠금장치나
블로킹에 기대지 않고
동기화를 구현하는 논블로킹,
락프리 알고리즘의 기초를 제공한다.
2.3.6 2일차 마무리
❏ 잠금장치를 얻고자 기다리는 과정을 가로챌 수 있 다.
❏ 잠금장치를 기다리는 동안 타임아웃이 발생할 수 있 다.
❏ 잠금장치를 얻고 반납하는 동작이 임의의 순서로 일어날 수 있다.
❏ 임의의 조건이 참이되는 것을 기다리기 위해 조건변수를 사용할 수 있다.
❏ 원자변수를 이용해서 잠금장치를 사용하는 것을 피할 수 있다.
2.3.6 2일차 마무리
❏ ReentrantLock 공정성(fairness)
❏ ReentrantReadWriteLock
❏ 불필요한 기상(spurious wakeup)
❏ AtomicIntegerFieldUpdater
2.4 3일차 : 거인의 어깨 위에서
철저하게 디버깅된 동시성 자료구조와 유틸리티는
우리 스스로 작성하는 코드보다 더 좋은 선택
2.4.1 스레드 생성 복습
Thread pool 이용
2.4.2 카피온라이트
1일 차 updateProgress()를 수정해서 방어적인 카피 방식을
자바 표준 라이브러리 CopyOnWriteArrayList를 사용해서 더 깔끔하게 처리
updateProgress()가 호출될 때마다 복제를 수행하는 것이 아니라 (훨씬 드물게 생길)
listeners의 값이 변경될 때에 한해서 복제를 하기 때문에 성능 면에서 더 효율적
2.4.3 완전한 프로그램
위키피디아에서 가장 많이 사용되는 단어는 ?
2.4.3 완전한 프로그램
2.4.3 완전한 프로그램
Counts HashMap
접근 동기화
2.4.3 완전한 프로그램
ConcurrentMap
사용
2.4.3 완전한 프로그램
각자의 내부에 국한된 공유되지 않는
counts를 사용하고,
종료 전 counts들을 하나로 병합
2.4.4 3일차 마무리
java.util.concurrent 패키지에서 제공하는 도구 이용하면
동시성 코드 를 쉽게 만들 수 있고, 프로그램을 더 안전하고 효과적으로 만들 수 있음
❏ 스레드를 직접 만드는 대신 스레드 풀을 이용한다.
❏ CopyOnWriteArrayList를 이용해 리스너 관리를 더 쉽고 효과적으로 만든다.
❏ 생산자와 소비자가 ArrayBlockingQueue를 이용해 더 효과적으로 의사소통을 한다.
❏ ConcurrentHashMap을 이용해 맵에 대한 동시적인 접근을 지원한다.
2.4.4 3일차 마무리
❏ ForkJoinPool
❏ 큰 업무를 작은 업무 단위로 쪼개고, 그것을
각기 다른 CPU에서 병렬로 실행한후 결과를
취합하는 방식
❏ 참조 :
http://homes.cs.washington.edu/~djg/teachi
ngMaterials/grossmanSPAC_forkJoinFrame
work.html
2.4.4 3일차 마무리
❏ CountDownLatch와 CyclicBarrier : 쓰레드간 처리를 동기화
두 스레드 사이에 로직을
동기화하는 데 사용
메인 스레드에서 작업을
처리하는 실행하는
Worker스레드를 만들어
실행하고,
개별 Worker스레드가
카운트다운래치의 값을
하나씩 제거하여 0이
되면 메인 스레드가
시그널을 받아서 흐름을
진행
2.4.4 3일차 마무리
❏ 암달의 법칙(Amdahl's law)
❏ 프로세서를 아무리 추가하더라도 성능 향상은
순차적인 부분에 의해 제한된다.
❏ 구스타프슨의 법칙(Gustafson's Law)
❏ 대용량 데이터 처리는 효과적으로 병렬화할 수
있다는 법칙
2.5 마치며
어떤 사람들은 이것이 올바르게 사용하는 것 이 너무나 어렵게 느껴지기 때문에, 아예
사용하는 것을 회피하고 멀티스레드 코드를 작성하는 것 자체를 원치 않는다.
어떤 사람들은 그런 호들갑을 이해하지 못한다. 몇 개의 간단한 규칙만 지켜지면
충분하고, 그렇게 하는 것이야 말로 다른 어떤 형태의 프로그래밍과 다를 바 없다고
여긴다.
2.5 관리
❏ 스레딩과 관련된 문제는 안정적으로 테스트할 수 없기 때문에, 멀티 스레드를
사용하는 코드를 대할 때 신중에 신중을 기울이는 방법 밖에는 없다.
❏ 멀티스레딩 프로그래밍을 어렵게 만드는 것은 코드를 작성하는 것이 어려운 것이 아니라
테스트하는 것이 어렵기 때문이다. 어떤 함정에 빠질 수 있기 때문이 아니라 함정에 빠졌다는
사실 자체를 알 수 없기 때문에 어려운 것
2.5 다른 언어들
코드의 순서가 뒤바뀌는 현상은 자바에만 국한되는 내용은 아니다.
차이점이 있다면 언어는 대개 그런 뒤바뀜이 언제 어떻게 일어나는지를 설명하는
명확한 메모리 모델을 가지고 있지 않다는 점이다.
C와 C++의 경우에는 최근에 C11과 C++ 11 표준에 메모리 모델이 추가됨으로써 이런
차이를 메웠다.
2.5 마지막 생각
이런 여러 가지 문제점에도 불구하고,
멀티스레딩 프로그래밍은
오랫동안 우리 곁에 머물 것이다.

More Related Content

What's hot

Smc–state machinecompiler
Smc–state machinecompilerSmc–state machinecompiler
Smc–state machinecompilerDong Hyeun Lee
 
Spin locks 추가 자료
Spin locks 추가 자료Spin locks 추가 자료
Spin locks 추가 자료codevania
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것흥배 최
 
7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기GeniusYG
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10hyun soomyung
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 
Mongo db in use(naver)
Mongo db in use(naver)Mongo db in use(naver)
Mongo db in use(naver)InBum Kim
 
Effective Java ~
Effective Java ~Effective Java ~
Effective Java ~영원 서
 
Event Loop - Java Script
Event Loop - Java ScriptEvent Loop - Java Script
Event Loop - Java Scriptjehun seem
 
2017년 javascript의 현재주소
2017년 javascript의 현재주소2017년 javascript의 현재주소
2017년 javascript의 현재주소윤학 권
 
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)InBum Kim
 
Clean code(06)
Clean code(06)Clean code(06)
Clean code(06)규열 김
 
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]MongoDB
 
Multitasking on DB and Django
Multitasking on DB and DjangoMultitasking on DB and Django
Multitasking on DB and DjangoSeokhwanMoon
 
Netty 시작하기 (3)
Netty 시작하기 (3)Netty 시작하기 (3)
Netty 시작하기 (3)Daehyun Kim
 

What's hot (20)

Smc–state machinecompiler
Smc–state machinecompilerSmc–state machinecompiler
Smc–state machinecompiler
 
Spin locks 추가 자료
Spin locks 추가 자료Spin locks 추가 자료
Spin locks 추가 자료
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
 
7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
Node week1
Node week1Node week1
Node week1
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
ES6-01
ES6-01ES6-01
ES6-01
 
Mongo db in use(naver)
Mongo db in use(naver)Mongo db in use(naver)
Mongo db in use(naver)
 
javascript01
javascript01javascript01
javascript01
 
Effective Java ~
Effective Java ~Effective Java ~
Effective Java ~
 
Event Loop - Java Script
Event Loop - Java ScriptEvent Loop - Java Script
Event Loop - Java Script
 
2017년 javascript의 현재주소
2017년 javascript의 현재주소2017년 javascript의 현재주소
2017년 javascript의 현재주소
 
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
Mongo db monitoring 어떤 것이 좋을까(mongodb korea, 김인범)
 
Ceh
CehCeh
Ceh
 
Clean code(06)
Clean code(06)Clean code(06)
Clean code(06)
 
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
분산 트랜잭션 - 큰힘에는 큰 책임이 따른다 [MongoDB]
 
Multitasking on DB and Django
Multitasking on DB and DjangoMultitasking on DB and Django
Multitasking on DB and Django
 
Netty 시작하기 (3)
Netty 시작하기 (3)Netty 시작하기 (3)
Netty 시작하기 (3)
 

Viewers also liked

함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고Sunggon Song
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8HyeonSeok Choi
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HyeonSeok Choi
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장HyeonSeok Choi
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장Sunggon Song
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 

Viewers also liked (13)

함수형사고 실용적사고
함수형사고 실용적사고함수형사고 실용적사고
함수형사고 실용적사고
 
Ddd start 10장
Ddd start 10장Ddd start 10장
Ddd start 10장
 
DDD start 1장
DDD start 1장DDD start 1장
DDD start 1장
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 

Similar to 7가지 동시성 모델-2장

제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm엑셈
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programmingByeongsu Kang
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
자바 메모리 릭 패턴
자바 메모리 릭 패턴자바 메모리 릭 패턴
자바 메모리 릭 패턴효원 강
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018Shengzhe Li
 
Zoo keeper 소개
Zoo keeper 소개Zoo keeper 소개
Zoo keeper 소개주표 홍
 
05_동기화_개요
05_동기화_개요05_동기화_개요
05_동기화_개요noerror
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항Minchul Jung
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4Usys4u
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
android_thread
android_threadandroid_thread
android_threadhandfoot
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in actionBingu Shim
 

Similar to 7가지 동시성 모델-2장 (20)

제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
MutiCore 19-20
MutiCore 19-20MutiCore 19-20
MutiCore 19-20
 
Java 8 고급 (3/6)
Java 8 고급 (3/6)Java 8 고급 (3/6)
Java 8 고급 (3/6)
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
자바 메모리 릭 패턴
자바 메모리 릭 패턴자바 메모리 릭 패턴
자바 메모리 릭 패턴
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 
Zoo keeper 소개
Zoo keeper 소개Zoo keeper 소개
Zoo keeper 소개
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
05_동기화_개요
05_동기화_개요05_동기화_개요
05_동기화_개요
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4U
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
android_thread
android_threadandroid_thread
android_thread
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in action
 

More from Sunggon Song

K8s in action chap15
K8s in action chap15K8s in action chap15
K8s in action chap15Sunggon Song
 
랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션Sunggon Song
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learningSunggon Song
 
서포트 벡터머신
서포트 벡터머신서포트 벡터머신
서포트 벡터머신Sunggon Song
 
대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크Sunggon Song
 
데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝Sunggon Song
 
합성곱 신경망
합성곱 신경망합성곱 신경망
합성곱 신경망Sunggon Song
 
밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장Sunggon Song
 

More from Sunggon Song (9)

K8s in action chap15
K8s in action chap15K8s in action chap15
K8s in action chap15
 
랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션
 
K8s in action02
K8s in action02K8s in action02
K8s in action02
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learning
 
서포트 벡터머신
서포트 벡터머신서포트 벡터머신
서포트 벡터머신
 
대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크
 
데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝
 
합성곱 신경망
합성곱 신경망합성곱 신경망
합성곱 신경망
 
밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장
 

7가지 동시성 모델-2장

  • 1. 7가지 동시성 모델 스레드와 잠금장치 아꿈사 송성곤
  • 2. 2.1 동작하는 가장 단순한 코드 ❏ 1일차 : 상호 배제와 메모리 모델 ❏ 2일차 : 내제된 잠금 장치를 넘어서 ❏ 3일차 : 거인의 어깨 위에서
  • 3. 2.2 1일차 : 상호배제와 메모리 모델 ❏ 상호배제(Mutual exclusion) ❏ 경쟁조건(Race condition) ❏ 데드락(deadlock) ❏ 메모리 모델
  • 4. 2.2.1 스레드 만들기 Hello from new thread Hello from main thread Hello from main thread Hello from new thread
  • 5. 2.2.2 첫번째 잠금장치 ● 문제 : 두 쓰레드가 동시에 increment()를 실행하는 Race condition 발생 ● 해법 : 접근을 동기화하기 위해서 내재된 잠금(intrinsic lock)을 이용 내재된 잠금장치 이용
  • 6. 2.2.3 메모리의 미스터리 ● 문제 : 어떤 스레드가 동작한 결과가 다른 쓰레드에는 보이지 않는 경우 존재 ○ 컴파일러는 코드가 실행되는 순서를 바꿈으로써 정적 최적화를 수행 ○ JVM은 코드가 실행되는 순서를 바꿈으로써 동적 최적화 ○ 코드를 실행하는 하드웨어는 코드의 순서를 바꾸는 것
  • 7. 2.2.4 메모리 가시성 자바 메모리 모델 : 한 스레드가 메모리에 가한 변화가 다른 메모리에 보이는 경우를 정의 단, 읽는 스레드와 쓰는 스레드가 동기화되지 않으면 그러한 가시성이 보장되지 않음
  • 8. 2.2.5 여러 개의 잠금장치 미리정해진 공통순서를 적용 잠금장치 요청시 공통순서를 따름
  • 9. 2.2.6 외부 메서드의 위험 순차 방문 전 방어적 복제
  • 10. 2.2.7 1일 차 마무리 ❏ 공유되는 변수에 대한 접근을 반드시 동기화한다. ❏ 쓰는 스레드와 읽는 쓰레드가 모두 동기화 되어야 한다. ❏ 여러개의 잠금장치를 미리 정해진 공통의 순서에 따라 요청한다. ❏ 잠금장치를 가진 상태에서 외부 메서드를 호출하지 않는다. ❏ 잠금장치는 최대한 짧게 보유한다.
  • 11. 2.2.7 1일 차 마무리 ❏ 자바 메모리 모델 ❏ 참조 : http://changsuk.me/?p=2050 ❏ 동기화와 가시성 ❏ 자바의 표준 문서에선 JMM 명세를 통해 ‘먼저 발생한 일(happens-before)’이 무엇인지 보장함으로써 가시성의 단서를 제공 ❏ 가시성을 위협하는 요소들 ❏ 프로세서 캐시 ❏ 동작의 재배열 ❏ Volatile 키워드
  • 12. 2.2.7 1일 차 마무리 ❏ 초기화 안정성
  • 13. 2.2.7 1일 차 마무리 ❏ 중복확인 잠금(double checked locking) 안티 패턴
  • 14. 2.3 2일 차 : 내재된 잠금장치를 넘어서 내재된 잠금장치의 한계 ❏ 내재된 잠금장치를 얻으려다가 블로킹 상태에 빠진 쓰레드를 원상복귀시킬 방법이 없다. ❏ 내재된 잠금장치를 얻으려고 노력하는 시간을 강제로 중단 시키는 타임아웃 기능이 없다. ❏ 내재된 잠금장치를 얻는 방법이 하나만 존재한다.
  • 15. 2.3.1 가로채기가 가능한 잠금장치 가로채기 가능한 잠금장치
  • 16. 2.3.2 타임아웃 ● 문제 : 타임아웃이 데드락 상태에서 빠져나올수 있는 방법을 제공할뿐 ● 데드락이라는 상황 자체를 발생 시키지 않는 것이 중요
  • 17. 2.3.3 협동 잠그기 연결리스트에 노드를 하나 삽입하려는 경우 협동 잠그기는 리스트의 일정한 부분만 잠그고, 그 외에 다른 노드에 대한 접근은 허용
  • 18. 2.3.4 조건 변수 ReentrantLock lock = new ReentrantLock(); Condition condition = lock.newCondition(); lock.lock () ; Try { while (! <<조건이 참이다.>>) condition await(); ≪공유되는 지원 사용≫ } finally { lock.unlock(); }
  • 19. 2.3.5 원자 변수 원자 변수는 잠금장치나 블로킹에 기대지 않고 동기화를 구현하는 논블로킹, 락프리 알고리즘의 기초를 제공한다.
  • 20. 2.3.6 2일차 마무리 ❏ 잠금장치를 얻고자 기다리는 과정을 가로챌 수 있 다. ❏ 잠금장치를 기다리는 동안 타임아웃이 발생할 수 있 다. ❏ 잠금장치를 얻고 반납하는 동작이 임의의 순서로 일어날 수 있다. ❏ 임의의 조건이 참이되는 것을 기다리기 위해 조건변수를 사용할 수 있다. ❏ 원자변수를 이용해서 잠금장치를 사용하는 것을 피할 수 있다.
  • 21. 2.3.6 2일차 마무리 ❏ ReentrantLock 공정성(fairness) ❏ ReentrantReadWriteLock ❏ 불필요한 기상(spurious wakeup) ❏ AtomicIntegerFieldUpdater
  • 22. 2.4 3일차 : 거인의 어깨 위에서 철저하게 디버깅된 동시성 자료구조와 유틸리티는 우리 스스로 작성하는 코드보다 더 좋은 선택
  • 23. 2.4.1 스레드 생성 복습 Thread pool 이용
  • 24. 2.4.2 카피온라이트 1일 차 updateProgress()를 수정해서 방어적인 카피 방식을 자바 표준 라이브러리 CopyOnWriteArrayList를 사용해서 더 깔끔하게 처리 updateProgress()가 호출될 때마다 복제를 수행하는 것이 아니라 (훨씬 드물게 생길) listeners의 값이 변경될 때에 한해서 복제를 하기 때문에 성능 면에서 더 효율적
  • 25. 2.4.3 완전한 프로그램 위키피디아에서 가장 많이 사용되는 단어는 ?
  • 27. 2.4.3 완전한 프로그램 Counts HashMap 접근 동기화
  • 29. 2.4.3 완전한 프로그램 각자의 내부에 국한된 공유되지 않는 counts를 사용하고, 종료 전 counts들을 하나로 병합
  • 30. 2.4.4 3일차 마무리 java.util.concurrent 패키지에서 제공하는 도구 이용하면 동시성 코드 를 쉽게 만들 수 있고, 프로그램을 더 안전하고 효과적으로 만들 수 있음 ❏ 스레드를 직접 만드는 대신 스레드 풀을 이용한다. ❏ CopyOnWriteArrayList를 이용해 리스너 관리를 더 쉽고 효과적으로 만든다. ❏ 생산자와 소비자가 ArrayBlockingQueue를 이용해 더 효과적으로 의사소통을 한다. ❏ ConcurrentHashMap을 이용해 맵에 대한 동시적인 접근을 지원한다.
  • 31. 2.4.4 3일차 마무리 ❏ ForkJoinPool ❏ 큰 업무를 작은 업무 단위로 쪼개고, 그것을 각기 다른 CPU에서 병렬로 실행한후 결과를 취합하는 방식 ❏ 참조 : http://homes.cs.washington.edu/~djg/teachi ngMaterials/grossmanSPAC_forkJoinFrame work.html
  • 32. 2.4.4 3일차 마무리 ❏ CountDownLatch와 CyclicBarrier : 쓰레드간 처리를 동기화 두 스레드 사이에 로직을 동기화하는 데 사용 메인 스레드에서 작업을 처리하는 실행하는 Worker스레드를 만들어 실행하고, 개별 Worker스레드가 카운트다운래치의 값을 하나씩 제거하여 0이 되면 메인 스레드가 시그널을 받아서 흐름을 진행
  • 33. 2.4.4 3일차 마무리 ❏ 암달의 법칙(Amdahl's law) ❏ 프로세서를 아무리 추가하더라도 성능 향상은 순차적인 부분에 의해 제한된다. ❏ 구스타프슨의 법칙(Gustafson's Law) ❏ 대용량 데이터 처리는 효과적으로 병렬화할 수 있다는 법칙
  • 34. 2.5 마치며 어떤 사람들은 이것이 올바르게 사용하는 것 이 너무나 어렵게 느껴지기 때문에, 아예 사용하는 것을 회피하고 멀티스레드 코드를 작성하는 것 자체를 원치 않는다. 어떤 사람들은 그런 호들갑을 이해하지 못한다. 몇 개의 간단한 규칙만 지켜지면 충분하고, 그렇게 하는 것이야 말로 다른 어떤 형태의 프로그래밍과 다를 바 없다고 여긴다.
  • 35. 2.5 관리 ❏ 스레딩과 관련된 문제는 안정적으로 테스트할 수 없기 때문에, 멀티 스레드를 사용하는 코드를 대할 때 신중에 신중을 기울이는 방법 밖에는 없다. ❏ 멀티스레딩 프로그래밍을 어렵게 만드는 것은 코드를 작성하는 것이 어려운 것이 아니라 테스트하는 것이 어렵기 때문이다. 어떤 함정에 빠질 수 있기 때문이 아니라 함정에 빠졌다는 사실 자체를 알 수 없기 때문에 어려운 것
  • 36. 2.5 다른 언어들 코드의 순서가 뒤바뀌는 현상은 자바에만 국한되는 내용은 아니다. 차이점이 있다면 언어는 대개 그런 뒤바뀜이 언제 어떻게 일어나는지를 설명하는 명확한 메모리 모델을 가지고 있지 않다는 점이다. C와 C++의 경우에는 최근에 C11과 C++ 11 표준에 메모리 모델이 추가됨으로써 이런 차이를 메웠다.
  • 37. 2.5 마지막 생각 이런 여러 가지 문제점에도 불구하고, 멀티스레딩 프로그래밍은 오랫동안 우리 곁에 머물 것이다.