스레드 독점(Thread Starvation)

2경빈·2025년 4월 8일

CS

목록 보기
7/11

스레드 독점 및 UI 멈춤 현상 정리

문제 현상

  • CPU에 하나의 스레드만 계속 할당되는 현상.

원인

  • 스레드의 퀀텀이 없거나 너무 큰 경우 발생할 수 있다.
  • 운영체제의 스케줄러가 비효율적으로 동작하는 경우도 있다.
  • 개발자가 while(true) 같은 무한 루프를 사용하면서 Thread.Sleep() 등을 주지 않은 경우 발생할 수 있다.
  • 스레드 우선순위(priority)가 극단적으로 설정되어 있을 경우에도 해당 스레드가 CPU를 독점하게 된다.

결과

1. 응답성 저하 (Responsiveness 감소)

GUI 기반 애플리케이션에서는 UI를 업데이트하는 스레드가 CPU를 사용하지 못하면, 앱이 멈춘 것처럼 보이고 사용자 입력에 반응하지 않게 된다.
예를 들어 윈도우 폼이나 안드로이드 앱에서 "먹통" 현상이 발생하는 것이다.

2. 멀티스레드 설계의 의미 상실

스레드를 여러 개 만든 이유는 병렬로 작업을 수행하기 위함인데, 하나의 스레드만 작업을 하게 되면 결국 싱글 스레드 구조와 다를 바 없게 된다.

3. 리소스 낭비

CPU를 사용하지 못하는 스레드들은 idle 상태로 전환되며, 이 상태에서 메모리만 차지하게 된다.
이로 인해 메모리 누수와 유사한 상황이 발생할 수 있으며, 관리가 제대로 되지 않으면 스레드가 계속 쌓이게 된다.

4. 스레드 기아(Starvation)

특정 스레드가 CPU를 계속 점유하게 되면, 다른 스레드들은 실행 기회를 얻지 못하게 된다.
이 상황이 반복되면 어떤 작업은 아예 실행조차 되지 않는 경우가 생기며, 이는 데드락과는 달리 그냥 "굶어죽는" 문제라 볼 수 있다.

5. 비동기 작업 지연

예를 들어 파일 다운로드, DB 처리, 네트워크 요청 등을 수행하는 비동기 스레드가 실행되지 못하면 결과를 받아오지 못하게 된다.
사용자 입장에서는 "왜 이렇게 오래 걸리지?"라고 느끼게 된다.

6. 데이터 일관성 문제

공유 자원을 다루는 작업은 일반적으로 여러 스레드에 분산되어야 하지만, 하나의 스레드가 오랜 시간 CPU를 점유하면 락을 장시간 잡게 된다.
이로 인해 다른 스레드들은 락이 풀릴 때까지 대기해야 하며, 데이터 처리 지연과 데드락 위험이 함께 증가하게 된다.


UI가 멈추는 이유

일반적인 스레드는 생성될 때 특별한 역할이 정해지지 않는다.
하지만 UI 스레드(Main Thread)는 프레임워크에서 애플리케이션 시작 시 자동으로 생성되며, 화면을 그리거나 사용자 이벤트를 처리하는 역할을 수행한다.
CPU를 특정 스레드가 독점하게 되면, UI 스레드는 CPU 자원을 얻지 못하고 대기 상태가 된다.
이로 인해 UI가 멈추거나 응답하지 않는 현상이 발생하게 된다.


해결 방법

연산 처리나 무거운 작업은 반드시 UI 스레드 외부에서 수행해야 한다.
예를 들어 Task, async/await, BackgroundWorker, ThreadPool 등을 활용하면 된다.
UI 스레드는 가볍게 유지하여 사용자 입력과 화면 갱신을 빠르게 처리할 수 있도록 해야 한다.

profile
eggs before hatching

0개의 댓글