[OS] Thread, Process, Core는 많을수록 좋은가

 

 

Thread, Process, Core는 많을수록 좋을까

보통 이러한 질문은 느낌상 '아니니까 묻는 것 같은데' 라는 직감을 준다.

만약 누군가 이 각각이 많을수록 어떠한 영향을 줍니까?라고 물어보면 단순히 생각했을 때 Core는 뇌의 역할이니까 뇌가 많을수록 처리량이 많을 것 같고, 한 프로그램 내에 Process가 여러개로 있다면 병렬처리할 기회가 많이 생길 것 같아서 괜찮을 것 같고, Thread가 여러 개라면 이 또한 병렬처리에 유리할 것 같다.

 

그러한 생각이 틀렸는가를 판단하기 위해서 각각을 살펴본다.

 

 

Thread가 많으면 어떨까

Thread는 크게 하드웨어 입장과 소프트웨어 입장에서 생각할 수 있다. 여기선 소프트웨어 입장으로서 Process 내의 Thread라고 해해보자. 우리는 Thread가 여러 개일때 코어를 통해서 병렬수행이 가능함을 알고있다. 하지만, 하나만 짚어보자. 

 

'병렬동시성은 다르다'

병렬은 정말 동시에 처리되는 것이며 동시성은 마치 동시에 수행되는 것처럼 다수 작업이 빠르게 전환되는 작업이다.

진짜 병렬처리를 한다면, CPU의 코어가 하나가 아닌 충분한 개수의 여러 개여야 한다는 사전조건이 붙는다. 만일 그렇지 못했다면 Context Switching 비용이 발생한다.

 

 

하나의 예시로 유투브 프로세스가 있다. 해당 프로세스는 영상, 댓글, 광고에 대해서 각각 Thread가 총 3개 존재한다고 가정한다. 그리고 CPU는 하이퍼스레딩을 지원받아 코어당 2개의 스레드를 가지고, 충분한 개수가 스레드만큼 지원되니 실제로 병렬적인 수행을 이룰 것이다.

 

이번엔 상황이 달라져, Process가 가진 Thread만큼을 Cpu의 Thread가 가지지 못했다. 이제 CPU측에서는 한 코어가 자신이 가진 Thread 하나로 Process의 다수 Thread를 관리해야한다. 그렇다면 얘는 가령 시분할 스케쥴링에 따라서  t1, t2, t3... 마다 빠르게 작업 프로세스를 변환하며 마치 동시에 수행하는 것처럼 굴 것이다.

 

 

이러한 환경에서 Process가 스레드로 지나치리 많이 분할되어있다면, 이 컨텍스트 스위칭은 많이 발생할 것이고 사실 프로세스 간 전환 비용은 무시할 수준이 아니기에(캐시 미스 등), 자원 낭비가 결국 발생한다

 

 

그러니 Thread가 많으면 좋을까? 라는 생각은 아래처럼 정리할 수 있다

1. CPU 자원이 받쳐주지 못한다면 컨텍스트 스위칭 비용이 비효율적으로 일어난다

2. 스레드는 메모리, 캐시 등의 여러 자원을 공유하는데 이러한 자원을 갖고자 경쟁작업도 일어나며 성능의 저하가 올 수 있다 (데드락 발생 위험)

 

Process가 많으면 어떨까?

잘 알려진 예로, 웹 브라우저의 경우 나타낸 것처럼 여러 프로세스로 구성되어있다. 

그리고 프로세스는 독립된 실행 단위이자 독립된 메모리 공간을 차지하는 친구다. 프로그램 내에 여러 프로세스로 구성되어있다면 스레드처럼 각각이 병렬로 처리될 수 있지 않을까? 라는 최초의 의견으로 돌아가서 고려해보자. 또한, 독립적으로 처리된다는 건 안전하고 확장성을 갖춘 것이 아닌가라는 생각도 할 수 있다. 하지만, 결론적으론 그렇다

 

역시나 컨텍스트 스위칭 비용이 일어날 수 있다

뿐만 아니라 프로세스에서의 Context Switching이 일어나면 이느 Thread보다도 더 많은 비용이 발생한다. Thread는 차라리 공유된 영역이라도 있으니 덜한데, 프로세스는 전체 메모리 공간과 파일이 별도로 구성되어 있으니 더 많은 정보에 대한 관리비용이 일어나는 것이다.

 

프로세스가 많을수록 메모리 사용량이 증가한다

말했듯이 프로세스는 독립된 메모리 공간을 가진다. 중복된 영역이 중첩되며 메모리 사용량은 기존보다 늘어나게된다. 메모리가 부족해지면 Swap이라고 하여 데이터를 하드디스크에 임시로 저장하는 비싼 비용이 일어나기도 한다

 

프로세스 간 통신 비용이 발생한다

각 프로세스가 독립적으로 실행됨에 따라 서로 데이터를 주고 받고자 IPC(Inter-Proces-Communication)방식을 이용하곤 하는데, 이또한 성능 저하를 일으키는 요소중 하나다

 

 

Core가 많으면 어떨까?

그럼 PC 자체의 성능이 높으면 좋지 않을까. 라는 생각을 하게되었다. CPU는 OS에 의해 프로세스의 스레드를 작업 단위로 실행한다. OS는 여러 스레드를 하드웨어 스레드에 매핑할 것이고, 코어 간의 부하 균형을 조정해 효율성을 극대화하려고 한다. 이렇듯 각 코어는 자신의 메모리를 활용해 실행 속도를 높이는 데 기여하리라 기대하는데.. 이 또한 결론만 내어보자.

 

소프트웨어적 한계

하드웨어적인 코어뿐만 아니라 소프트웨어 측에서도 멀티코어를 지원해야한다. 멀티코어를 지원한다면 코어의 효율적 분배 작업을 통해 병렬 처리를 진행한다.

더불어 실행하는 프로그램 자체가 단일 스레드라면 어떨까. 실행하는 프로그램이 단일 스레드로 동작하게끔 설계되어있으면 굳이 비싼 돈을 들인 추가 코어가 사용될 리가 없다.

 

비용 증가

항상 하드웨어측으로 넘어가면 이제 비용적인 고민이 들어간다. 앞서 말한 것처럼 지원이 되지않거나, 복잡할 일을 할 것이 아니라면 고급 CPU를 쓰는 건 효율적이지 못하다.