개발하는 동그리

[매일메일] 스레드, 프로세스, 코어의 수 본문

매일 공부/Backend CS

[매일메일] 스레드, 프로세스, 코어의 수

개발하는 동그리 2025. 4. 3. 14:31
반응형
스레드, 프로세스, 코어의 수가 많을수록 시스템 성능이 향상된다고 생각할 수 있지만, 실제로는 그렇지 않을 확률이 큽니다.

 

스레드가 많으면?

스레드가 지나치게 많아지면 운영체제가 스레드 간 컨텍스트 스위칭을 자주 수행해야 하여 CPU 자원이 스레드 관리에 소모됩니다. 이로 인해 실제 작업 수행 효율이 떨어질 수 있으며, 많은 스레드가 동시에 실행될 경우 메모리나 캐시, 락 등의 자원을 경쟁하게 되어 성능 저하나 데드 락이 발생할 가능성이 높아집니다. 또한, 스레드가 많아지면 동기화와 상태 관리가 복잡해져 버그 발생 가능성도 커집니다.

1. 컨텍스트 스위칭 오버헤드 증가

스레드는 하나의 프로세스 내에서 실행되므로, 스레드 간 전환은 프로세스 간 전환보다 가볍지만, 너무 많은 스레드가 존재하면 전환 횟수가 빈번해지고, 각 전환 시 캐시 무효화(Cache Invalidation)나 레지스터 저장/복원이 반복되어 CPU가 순수 계산에 집중하지 못하게 됩니다.

2. 락 경합 및 데드락 위험 증가

다수의 스레드가 공유 자원(예: 전역 변수, 파일, DB 커넥션 등)을 동시에 접근할 경우, 뮤텍스(Mutex), 세마포어(Semaphore) 등의 동기화 기법이 필요합니다. 이때 락 경합이 심화되면 성능 저하가 발생하며, 설계가 부실할 경우 데드락(Deadlock)이나 라이브락(Livelock)으로 이어질 수 있습니다.

3. 스레드 수 증가에 따른 자원 소비

각 스레드는 고유의 스택 메모리 공간(보통 수백 KB~수 MB)을 가지므로, 수천 개의 스레드를 생성할 경우 메모리 고갈이 발생할 수 있습니다. 특히 Java와 같은 환경에서는 쓰레드 수 증가가 힙(heap) 및 가비지 컬렉션 성능에도 영향을 줍니다.

 

프로세스가 많으면?

각 프로세스는 독립된 메모리 공간을 가집니다. 그래서 많은 프로세스가 동시에 실행되면 메모리 사용량이 급격히 증가할 수 있습니다. 또한, 프로세스를 생성하고 관리하는 데는 상당한 시스템 자원이 소모되며, 프로세스 간 통신(IPC)이 필요할 경우 성능 저하가 발생할 수 있습니다. 프로세스 간 컨텍스트 스위칭은 스레드 간 컨텍스트 스위칭보다 더 많은 오버헤드를 수반하기 때문에, 프로세스 수가 많아지면 시스템 성능이 저하될 수 있습니다. 운영체제는 동시에 실행할 수 있는 프로세스 수에 제한이 있으며, 이를 초과하면 새로운 프로세스 생성이 불가능하거나 시스템이 불안정해질 수 있습니다.

1. 프로세스 간 메모리 격리로 인한 자원 중복 사용

각 프로세스는 독립된 주소 공간을 갖기 때문에, 동일한 코드나 데이터가 여러 프로세스에 중복 로딩될 수 있으며, 이는 메모리 효율성을 떨어뜨립니다.

2. 프로세스 생성/삭제 비용

UNIX 계열 운영체제에서는 fork() 호출 시 부모 프로세스를 복제하는 과정이 발생하고, 이는 커널 수준에서 상당한 비용을 발생시킵니다. 현대 OS는 Copy-on-Write 방식을 적용하여 이를 줄이긴 했지만, 여전히 스레드에 비해 무겁습니다.

3. IPC 비용 및 복잡성

프로세스 간 통신은 메시지 큐, 파이프, 공유 메모리, 소켓 등을 사용해야 하며, 이는 구현 난이도뿐만 아니라 데이터 복사 비용과 동기화 비용이 수반되어 성능 저하로 이어질 수 있습니다.

 

코어가 많으면?

많은 코어를 가진 CPU는 병렬 처리 성능을 향상시킬 수 있지만, 이를 최대한 활용하기 위해서는 소프트웨어가 멀티코어 환경에 최적화되어 있어야 합니다. 단일 스레드 작업이 주를 이루는 경우, 추가 코어의 이점을 제대로 활용하지 못할 수 있습니다. 또한, 코어 수가 많아질수록 CPU의 비용과 전력 소비가 증가할 수 있으며, 발열 관리도 더 복잡해집니다.

1. 멀티코어 활용의 조건

하드웨어적으로 많은 코어가 존재하더라도, 소프트웨어가 이를 활용하지 못하면 성능 개선 효과는 제한적입니다. 예를 들어, 싱글 스레드 중심의 애플리케이션은 16코어 시스템에서도 1코어만 사용하는 경우가 발생합니다. 병렬 처리 알고리즘 및 스케줄링이 필수적입니다.

2. 캐시 일관성(Coherency) 유지 비용

코어 수가 많아지면, 각 코어의 캐시 간 데이터 일관성(coherency)을 유지해야 하므로, 이를 위한 프로토콜(MESI 등)이 CPU 내에서 더 많은 자원을 소모하게 됩니다.

3. 스레드 스케줄링 부담 증가

운영체제는 스레드를 가능한 한 코어에 고르게 배분해야 하지만, 많은 코어를 효율적으로 활용하기 위해서는 NUMA 구조나 코어간 affinity 설정과 같은 고급 기법이 필요합니다. 그렇지 않으면 캐시 효율이 저하되고 오히려 성능이 나빠질 수 있습니다.

4. 전력 소비와 발열 관리

고성능 멀티코어 CPU는 소비 전력(TDP)이 높으며, 이로 인한 발열도 증가합니다. 따라서 고급 쿨링 솔루션이 필요하며, 모바일 기기나 임베디드 시스템에서는 제약이 큽니다.

반응형