이 글은 원 저자 Jakob Jenkov의 허가로 포스팅된 번역물이다.

원문 URL : http://tutorials.jenkov.com/java-concurrency/costs.html


 


 싱글쓰레드에서 멀티쓰레드로 가는 길에는 꼭 장점만 있는 것은 아니다. 여기에는 비용이 존재한다. 당신이 멀티쓰레드 구현을 할 수 있다는 이유로 어플리케이션에 멀티쓰레드를 적용해서는 안된다. 멀티쓰레드 적용에 따른 이득을 고려해야 하고, 이 이득이 그 비용보다 커야한다. 이를 판단하는 데에 의구심이 든다면, 추측에서 그치지 말고 어플리케이션의 성능이나 반응성을 실제로 테스트해보라.


더 복잡한 디자인

 멀티쓰레드 어플리케이션의 어떤 부분들은 싱글쓰레드보다 더 단순하긴 하지만, 그 외 다른 부분들은 더 복잡하다. 공유된 자원에 접근하는 멀티쓰레드로 실행되는 코드는 특별한 주의가 필요하다. 쓰레드의 상호작용은 늘, 전혀 단순하지 않다. 잘못된 쓰레드 동기화에서 발생하는 에러가 발견되고 고쳐지기는 매우 어렵다.


컨텍스트 스위칭의 간접 비용

 CPU가 한 쓰레드에서 다른 쓰레드로 전환할 때, CPU는 현재 쓰레드의 로컬 데이터, 프로그램 포인터(또는 기타등등)을 저장하고 다음에 실행될 쓰레드의 로컬 데이터, 프로그램 포인터(또는 기타등등)을 불러올 필요가 있다. 이 스위칭을 '컨텍스트 스위칭'이라 한다. CPU는 한 쓰레드의 컨텍스트에서 실행중인 상태를 다른 쓰레드의 컨텍스트에서 실행중인 것으로 전환한다.

컨텍스트 스위칭의 비용은 저렴하지 않다. 당신은 이 스위칭이 필요 이상으로 발생하기를 원하지 않을 것이다.

위키피디아에서 컨텍스트 스위칭에 관한 자료를 읽어볼 수 있다.


자원 소비의 증가

 한 쓰레드가 가동되기 위해서는 컴퓨터의 자원이 필요하다. 쓰레드는 CPU의 시간 뿐만 아니라 로컬 스택을 유지하기 위한 메모리도 필요하다. 이것은 또한 쓰레드를 관리하기 위한 오퍼레이팅 시스템 내부의 자원을 차지하기도 한다. 아무 작업도 하지 않고 기다리는 쓰레드 100개를 생성하는 프로그램을 만들어보고 이 프로그램이 돌아갈 때 메모리를 얼마나 점유하는지 지켜보라.


'Java > Concurrency' 카테고리의 다른 글

자바 쓰레드 시작하기  (0) 2017.04.09
컨커런시 vs. 페러럴리즘  (0) 2017.04.09
컨커런시 모델  (0) 2017.04.09
멀티쓰레딩의 장점  (0) 2017.04.09
자바 컨커런시 / 멀티쓰레딩 튜토리얼  (0) 2017.04.09

+ Recent posts