스터디를 진행하면서 나왔던 질문중에 하나가 ‘CPU 코어에서 말하는 스레드와 자바 개발시 말하는 스레드의 차이는 무엇인가?’였었다. 정확히 답을 하지 못해 이 두가지 상황에서의 근본적인 차이점에 대해 알아보게 되었다.

병렬성(Parallelism)과 동시성(Concurrency)

우선 두가지 차이에 앞서 멀티 프로세싱, 멀티 스레드에도 자주 등장하는 이 두가지 단어에 대해 알아두면 좋을 것 같다.

  • 병렬성(Parallelism) : 병렬로 실행되는 성질을 의미. 같은 시간에 동시에 여러 작업이 실행되는 성질
  • 동시성(Concurrency) : 여러 개의 작업들이 짧은 시간 내 번갈아 가며 병렬로 처리되는 것처럼 보이도록 실행되는 성질. ‘동시성’이라는 이름을 가졌지만, 동시에 실행되지 않는다.

하드웨어 스레드

하드웨어 스펙이 점점 좋아지면서, 대부분의 컴퓨터 내 CPU는 멀티코어를 지원한다. 컴퓨터를 살 때 많이 봤겠지만, N코어 M스레드라고 가정한다면, 말그대로 CPU 코어는 N개를 가진다는 것을 의미한다. 즉, 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛이 N개 있다는 뜻이다.
여기서 M은 “논리적” 코어 개수이며, “동시에 실행 가능한 스레드 개수”를 말한다. 이전까지는 N=M(코어수와 동시 실행가능한 스레드 수가 일치)했으나, 시대가 점점 좋아지며 많은 CPU가 하나의 코어에 여러 스레드를 실행할 수 있도록 하이퍼 스레딩을 지원한다. 여기서 말하는 스레드는 하드웨어적 스레드이다.

소프트웨어 스레드

자바에서 스레드 풀을 100~200으로 지정해놓고 사용하는 것을 본 적이 있었을 것이다. 앞서 말했던 하드웨어 스레드는 많아봤자 32?까지밖에 안되는데!!(CPU 코어 한계상), 어떻게 100, 200까지 설정할 수 있는 것일까?
그건 바로 앞서 말한 하드웨어 스레드와 자바에서 말하는 스레드의 개념이 다르기 때문이다.

앞서 설정한 100, 200은 위 그림에서 보여지는 자바 스레드 칸(정확히는 스레드풀)에서 생성되는 최대 스레드 개수이다. 이렇게 생성된 스레드는 CPU core를 서로 차지하며 짧은 시간 내에 번갈아가며 작업을 처리한다. 이렇듯, 자바 스레드는 동시성을 가지고 있어 하드웨어적 스레드 개수보다 더 많은 스레드를 생성하여 하드웨어적 스레드를 번갈아 가며 사용하여 작업을 처리한다.

이렇든 스레드를 번갈아가며 동시에 실행하게 되면 컨텍스트 스위칭등 추가적인 비용이 발생함에도 불구하고, 자바는 왜 동시성을 적용한 소프트웨어 스레드를 채택했을까?
만일 동기화 작업으로 인해 작업 시간이 많이 드는 스레드 8개와, 비교적 시간이 적게 소요되는 스레드 8개가 있다고 가정해보자. 이러한 동시성 프로그래밍을 적용하지 않을 경우, 운이 나쁘면 작업시간이 많이 드는 스레드 8개를 다 처리하고 난 후에야 나머지 가벼운 작업을 하는 스레드 8개를 처리할 수 있다. 이렇게 작업속도를 저하시킬 수 있기 때문에, 동시에 여러 스레드를 조금조금씩 처리하는 방식을 채택하였다.


참고 자료 :

  1. 자바의 동시성 #1 - 물리적 아키텍쳐와 자바 스레드
  2. CPU가 지원하는 쓰레드랑 프로그래밍 상의 쓰레드랑 다른건가요?
  3. 하드웨어 스레드와 소프트웨어 스레드

oksusutea's blog

꾸준히 기록하려고 만든 블로그