스레드풀의 동작 방식은 어떻게 되나요?
_____A: 스레드를 미리 생성해 풀(Pool)에 보관하고, 작업 요청이 들어올 때마다 스레드를 할당해 실행한 뒤 다시 반환하는 방식의 자원 관리 기법입니다. 매번 스레드를 생성·파괴하는 오버헤드를 줄이고, 시스템 안정성과 성능을 향상시킵니다.
2. Q: 왜 스레드풀이 필요한가?
A:
- 스레드 생성·소멸 비용 절감: 빈번한 스레드 생성을 방지
- 자원 고갈 방지: 최대 스레드 수를 제한해 과도한 동시 실행을 제어
- 응답성 향상: 스레드 준비 시간을 최소화해 지연 감소
- 관리 편의성: 스레드 수, 큐 크기, 정책 등 중앙 집중형 제어
3. Q: Java의 ThreadPoolExecutor 주요 구성 요소는?
A:
- corePoolSize: 기본으로 유지할 최소 스레드 수
- maximumPoolSize: 생성 가능한 최대 스레드 수
- keepAliveTime: 휴면 스레드 유지 시간
- workQueue: 대기 작업을 저장하는 큐(LinkedBlockingQueue, SynchronousQueue 등)
- threadFactory: 스레드 생성 전략
- RejectedExecutionHandler: 큐가 가득 찼을 때 작업 거부 처리 정책
4. Q: ThreadPoolExecutor 동작 흐름은?
A:
1) 클라이언트가 execute() 또는 submit() 호출
2) 현재 실행 중인 스레드 수 < corePoolSize면 새 스레드 생성 후 작업 실행
3) ≥ corePoolSize이면 workQueue에 작업 삽입 시도
4) 큐가 꽉 차 있고 스레드 수 < maximumPoolSize면 추가 스레드 생성 후 실행
5) 큐도 가득 차고 최대 스레드 수 초과 시 RejectedExecutionHandler 호출
5. Q: 작업 제출(submit/execute) 과정은?
A:
- execute(): Runnable을 직접 실행, 반환값 없음
- submit(): Callable 또는 Runnable을 감싸 Future 반환
- 내부에서 모두 execute()에 작업을 위임해 큐잉·스레드 할당 과정을 거침
6. Q: 스레드 생성 및 재사용 과정은?
A:
- 초기에는 corePoolSize만큼의 스레드를 즉시 생성하지 않음(기본 정책)
- 작업이 들어올 때마다 필요한 만큼 corePoolSize까지 스레드를 생성
- keepAliveTime 이후 idle 상태의 스레드는 종료(단, corePoolSize 이하로는 유지)
- 생성된 스레드는 반복 사용됨
7. Q: workQueue의 종류와 특징은?
A:
- ArrayBlockingQueue(유한 큐): 고정 크기 큐, 가득 차면 스레드 추가
- SynchronousQueue(직통 큐): 큐 자체 버퍼 없음, 직접 스레드 핸드오프
- PriorityBlockingQueue: 우선순위 큐
8. Q: RejectedExecutionHandler(작업 거부 정책) 종류는?
A:
- AbortPolicy(기본): RejectedExecutionException 던짐
- CallerRunsPolicy: 호출 스레드가 작업 실행(성능 저하 위험)
- DiscardPolicy: 아무 처리 없이 버림
- DiscardOldestPolicy: 큐에서 가장 오래된 작업 제거 후 새 작업 삽입 시도
9. Q: 스레드풀 종료(shutdown) 과정은?
A:
- shutdown(): 새로운 작업 거부, 기존 대기 및 실행 작업 완료 후 종료
- shutdownNow(): 대기 큐에 있는 작업 반환, 실행 중인 스레드 인터럽트 시도
- awaitTermination(timeout): 지정 시간 대기 후 종료 여부 반환
10. Q: 스레드풀 사용 시 주의사항은?
A:
- 큐 크기와 최대 스레드 수 균형 조정
- 무제한 큐 사용 시 메모리 과다 사용 주의
- 긴 작업은 별도 전용 풀로 분리
- 데몬 스레드 여부(threadFactory 설정) 관리
- 자원(파일, DB 연결) 반환 코드 누락 방지
11. Q: 실제 구성 예시(Java)
A:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
4, // corePoolSize
10, // maximumPoolSize
60L, TimeUnit.SECONDS,// keepAliveTime
new ArrayBlockingQueue<>(100),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
12. Q: 스레드풀 도입 효과는?
A:
- 시스템 안정성: 최대 스레드 수 제한으로 리소스 고갈 방지
- 성능 최적화: 스레드 생성 비용 절감, 작업 대기시간 예측 가능
- 운영 편의: 모니터링·튜닝 지표(core/max/QPS) 확보 가능
스레드풀의 주요 목적은 스레드 생성과 소멸에 드는 비용을 줄이고, 시스템 자원을 효율적으로 활용하는 것입니다.
스레드풀의 동작 방식은 다음과 같은 주요 요소로 구성됩니다.
1. 스레드풀의 구성 요소 - 스레드 : 스레드풀은 여러 개의 스레드를 미리 생성하여 유지합니다.
이 스레드들은 작업을 수행하기 위해 대기하고 있습니다.
- 작업 큐 : 스레드풀에 제출된 작업은 작업 큐에 저장됩니다.
이 큐는 FIFO(First In, First Out) 방식으로 동작하는 경우가 많습니다.
- 스레드 관리 : 스레드풀은 스레드의 생성, 재사용, 종료를 관리합니다.
이를 통해 스레드의 수를 제한하고, 시스템 자원을 효율적으로 사용할 수 있습니다.
2. 스레드풀의 동작 과정 1. 작업 제출 : 클라이언트는 스레드풀에 작업을 제출합니다.
이 작업은 일반적으로 Runnable 또는 Callable 인터페이스를 구현한 객체입니다.
2. 작업 큐에 추가 : 제출된 작업은 작업 큐에 추가됩니다.
만약 스레드풀이 이미 최대 스레드 수에 도달해 있다면, 새로운 작업은 큐에서 대기하게 됩니다.
3. 스레드 할당 : 스레드풀은 대기 중인 스레드 중 하나를 선택하여 작업을 수행하도록 합니다.
만약 대기 중인 스레드가 없다면, 새로운 스레드를 생성할 수 있습니다.
그러나 스레드 수가 최대치에 도달한 경우, 추가 스레드를 생성하지 않고 대기 중인 작업이 완료될 때까지 기다립니다.
4. 작업 수행 : 선택된 스레드는 작업을 수행합니다.
작업이 완료되면, 스레드는 다시 스레드풀로 반환되어 대기 상태로 돌아갑니다.
5. 스레드 종료 : 스레드풀은 일정 시간 동안 사용되지 않은 스레드를 종료할 수 있습니다.
이를 통해 자원을 효율적으로 관리하고, 시스템의 부하를 줄일 수 있습니다.
3. 스레드풀의 장점 - 성능 향상 : 스레드 생성과 소멸에 드는 비용을 줄여 성능을 향상시킵니다.
- 자원 관리 : 시스템 자원을 효율적으로 관리하여 과도한 스레드 생성으로 인한 성능 저하를 방지합니다.
- 간편한 사용 : 스레드풀을 사용하면 복잡한 스레드 관리 로직을 간단하게 처리할 수 있습니다.
4. 스레드풀의 단점 - 복잡한 디버깅 : 멀티스레드 환경에서 발생하는 문제는 디버깅이 어려울 수 있습니다.
- 자원 고갈 : 스레드 수를 제한하지 않으면, 작업이 많아질 경우 자원이 고갈될 수 있습니다.
- 작업 우선순위 : 기본적으로 스레드풀은 작업의 우선순위를 고려하지 않기 때문에, 긴급한 작업이 지연될 수 있습니다.
5. 스레드풀의 구현 예시 Java에서는 `ExecutorService` 인터페이스를 통해 스레드풀을 쉽게 구현할 수 있습니다.
예를 들어, `Executors.newFixedThreadPool(int nThreads)` 메서드를 사용하여 고정 크기의 스레드풀을 생성할 수 있습니다.
```java ExecutorService executor = Executors.newFixedThreadPool(
10); executor.submit(() -> { // 작업 수행 }); executor.shutdown(); ``` 이와 같이 스레드풀은 멀티스레딩 환경에서 효율적으로 작업을 처리할 수 있는 강력한 도구입니다.
적절한 사용과 관리가 이루어진다면, 성능과 자원 관리 측면에서 큰 이점을 제공할 수 있습니다.
작성자:
정승우 [비회원]
| 작성일자: 1년 전
2024-11-21 22:51:30
조회수: 127 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 127 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.