스레드 스케줄러?
- 여러 스레드가 실행 중인 경우 작동한다.
- 스레드의 실행 시간과 순서를 결정한다.
운영체제별 차이점
- 정상적인 OS : 공정한 스레드 실행을 보장하지만
- 구체적인 스케줄링 정책은 사실 OS 마다 상이할 수도 ㅣㅇㅆ다.
- 그래서..
프로그램 설계시 주의
- 스레드 스케줄러 정책에 의존하는 프로그램을 짜는 것은 노노
- 정확성과 성능이 스케줄러에 좌우되는 것은 좋지 못한 프로그래밍 방식이다
어떤것이 견고하고 빠른 .. 이식성 좋은 프로그램일까?
-
실행 가능한 스레드 수의 관리
- 목표 : 프로세서 의 수보다 지나치게 많아지지 않도록 유지해야 한다.
- 효과 : 스레드 스케줄러의 부담을 줄여야한다.
-
스레드 실행 방식
- 원칙 : 실행 준비된 스레드는 작업 완료까지 계속적으로 실행한다.
- 결과 : 다양한 스케줄링 정책에서도 일관된 동작을 보장한다.
스레드 수 구분
- 실행 가능한 스레드 수는
- 현재 실행 중이거나 실행 대기 중인 스레드임
- 전체 스레드의 수
- 프로그램 내의 모든 스레드 포함함
- 실행 가능한 스레드보다 훨씬 많을 수 있음
- 대기 중인 스레드
- 실행 가능한 상태가 아니다.
- 전체 스레드 수에는 포함되지만, 실행 가능한 스레드 수에는 미포함이다.
실행 가능한 스레드 수 관리
- 작업 완료 후에 대기 상태 전환함.
- 원칙으로는 당장 처리할 작업이 없다면, 실행되지 않아야 한다.
바쁜 대기(busy waiting) 회피
- 정의
- 공유 객체의 상태 변화를 지속적으로 검사하는 상태임.
- 바쁜 대기
- 스레드가 원하는 조건이 만족될 때까지 계속해서 검사하면서 대기하는 상태를 말함.
- 문제점
- 스레드 스케줄러의 변덕에 취약하다.
- 프로세서에 큰 부담을 준다.
- 다른 유용한 작업의 실행 기회를 박탈한다.
잘못된 구현방식
public class SlowCountDownLatch {
private int count;
public SlowCountDownLatch(int count) {
if (count < 0)
throw new IllegalArgumentException(count + " < 0");
this.count = count;
}
public void await() {
while (true) {
synchronized(this) {
if (count == 0)
return;
}
}
}
public synchronized void countDown() {
if (count != 0)
count
}
}
- await 에서 에서
빠른 대기 상태
를 유발함.
- CPU 자원이 낭비
- 비효율적인 동기화
결론
- 뭔 소리를 주저리하는지..
- 그냥 스레드 우선순위는 OS 혹은 스레드 스케줄러마다 다르다. 의존하지 말고, 스레드 우선순위를 제어하려고 하지말고, 의존도 하지말것.