Post
KO

스레드와 비용

컨텍스트 스위칭

하나의 스레드가 실행되다가 다른 스레드가 실행되는 순간 컨텍스트 스위칭(context switching)이 일어난다.

컨텍스트 스위칭은 단숨에 공짜로 일어나는 일이 아니다.

운영체제와 JVM 역시 프로그램 스레드가 사용하는 것과 같은 CPU를 함께 사용하고 있다.

운영체제나 JVM이 CPU를 많이 사용하면 할수록 실제 프로그램 스레드가 사용할 수 있는 CPU양은 줄어든다.

컨텍스트가 변경되면서 다른 스레드를 실행하려면 해당 스레드가 사용하던 데이터가 프로세서의 캐시 메모리에 들어 있지 않을 확률도 높다. 그러면 캐시에서 찾지 못한 내용을 다른 저장소에서 찾아와야 하기 때문에 원래 예정된 것보다 느리게 실행되는 것이다.

대기 중인 스레드가 밀려 있다고 해도, 현재 실행 중인 스레드에게 최소한의 실행 시간을 보장해주는 정책을 취하고 있다.

대기 상태에 들어가는 연산을 많이 사용하는 프로그램(블로킹 I/O를 사용하거나, 락 대기 시간이 길거나, 상태 변수의 값을 기다리는 등)은 CPU를 주로 활용하는 프로그램보다 컨텍스트 스위칭 횟수가 훨씬 많아지고, 따라서 스케줄링 부하가 늘어나면서 전체적인 처리량이 줄어든다. (넌블록킹 알고리즘을 사용하면 컨텍스트 스위칭에 소모되는 부하를 줄일 수 있다.)

컨텍스트 스위칭에 필요한 비용은 프로세서상에서 5,000 ~ 10,000 클럭 사이클 또는 수 마이크로초 동안 시간을 소모한다고 알려져 있다.

메모리 동기화

메모리 배리어는 캐시를 플러시하거나 무효화하고, 하드웨어와 관련된 쓰기 버퍼를 플러시하고, 실행 파이프라인을 늦출 수도 있다.

멀티스레드를 사용하는 큰 이유 중의 하나가 바로 다중 CPU 하드웨어를 충분히 활용하고자 하는 것이다.

암달의 법칙에 따르면 애플리케이션 확장성은 반드시 순차적으로 실행되야만 하는 코드가 전체에서 얼마만큼의 비율이 차지하냐에 달렸다고 한다.

출처 :

https://book.naver.com/bookdb/book_detail.nhn?bid=4683550

자바 병렬 프로그래밍

자바 병렬 처리 프로그램 작성 안내서!이 책은 자바 병렬 프로그래밍 참고 매뉴얼이다. 병렬 처리 관련 기능에 어떤 것이 있고, 어떻게 사용하는지에 대한 방법뿐 아니라, 그 내부에 숨어 있는 디자인 패턴과 그 패턴을 사용한 원론적인 이유도 살펴본다. 특히 자바 멀티스레드 프로그램에 대한 설계와 구현 노하우를 전수한다. 자바 병렬 프로그래밍 API에 대한 훌륭한 가이드북이자, 스레드 관련 전문 지식을 빼놓지 않고 설명한 점이 돋보인다. 본문은 병렬 처리와 스레드 안전성에 대한 기초, 스레드 안전한 클래스를 작성하는 기법, JAVA.UT

This article is licensed under CC BY 4.0 by the author.