Item 84. Thread Scheduler

ν”„λ‘œκ·Έλž¨ λ™μž‘μ„ μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬μ— κΈ°λŒ€μ§€ 말라

운영체제의 μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬λŠ” μž‘μ—…μ„ κ³΅μ •ν•˜κ²Œ μˆ˜ν–‰ν•˜λ € ν•˜μ§€λ§Œ, ꡬ체적인 정책은 μš΄μ˜μ²΄μ œλ§ˆλ‹€ λ‹€λ₯Ό 수 μžˆλ‹€. 운영체제 정책에 따라 μ •ν™•μ„±μ΄λ‚˜ μ„±λŠ₯이 λ‹¬λΌμ§€κ²Œ 되면, λ‹€λ₯Έ ν”Œλž«νΌμ— μ΄μ‹ν•˜κΈ° μ–΄λ €μ›Œμ§€κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 정책에 μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλœλ‹€. μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ ν•˜κΈ° μœ„ν•΄μ„  μ•„λž˜ μ„Έ 가지 방법을 μ‚¬μš©ν•  수 μžˆλ‹€.

1. μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œμ˜ 수λ₯Ό 적게 μœ μ§€

κ°€μž₯ 쒋은 방법은 μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œμ˜ 수λ₯Ό ν”„λ‘œμ„Έμ„œ μˆ˜λ³΄λ‹€ μ§€λ‚˜μΉ˜κ²Œ λ§Žμ•„μ§€μ§€ μ•Šλ„λ‘ ν•˜μ—¬ μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬κ°€ κ³ λ―Όν•  일을 μ€„μ΄λŠ” 것이닀. μ‹€ν–‰ μ€€λΉ„κ°€ 된 μŠ€λ ˆλ“œλ“€μ΄ 맑은 μž‘μ—…μ„ μ™„λ£Œν•  λ•ŒκΉŒμ§€ 계속 μ‹€ν–‰ν•˜κ²Œ λ§Œλ“€λ©΄, μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§ 정책이 μƒμ΄ν•˜λ”λΌλ„ λ™μž‘μ΄ 크게 달라지지 μ•Šκ²Œ λœλ‹€.

κ²°κ΅­ μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€λ ˆλ“œ 수λ₯Ό 적게 μœ μ§€ν•˜λŠ” 것이 μ€‘μš”ν•œλ°, 각 μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μ™„λ£Œ ν›„μ—” λ‹€μŒ μž‘μ—… μ „κΉŒμ§„ λŒ€κΈ°ν•˜λ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€. μ‹€ν–‰μž ν”„λ ˆμž„μ›Œν¬(Executor Framework)둜 예λ₯Ό λ“€λ©΄, μŠ€λ ˆλ“œ ν’€ 크기λ₯Ό 적절히 μ„€μ •ν•˜κ³ , μž‘μ—…μ„ 짧게 μœ μ§€ν•˜λ©΄ λœλ‹€.

2. λ°”μœ λŒ€κΈ° μƒνƒœ νšŒν”Ό

λ°”μœ λŒ€κΈ°(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--;
        }
    }
}

μœ„ μ½”λ“œλŠ” κΈ°μ‘΄ CountDownLatch 클래슀λ₯Ό λ°”μœ λŒ€κΈ° μƒνƒœλ‘œ κ΅¬ν˜„ν•œ κ²ƒμœΌλ‘œ, 책에 λ”°λ₯΄λ©΄ 10λ°° 이상 λŠλ¦¬λ‹€κ³  ν•œλ‹€.

3. μŠ€λ ˆλ“œ μš°μ„ μˆœμœ„λ₯Ό μ‘°μ ˆν•˜μ§€ μ•ŠκΈ°

Thread.yieldλ₯Ό μ‚¬μš©ν•˜λ©΄ μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λŸ¬μ—κ²Œ ν˜„μž¬ μŠ€λ ˆλ“œμ˜ 싀행을 λ©ˆμΆ”κ³  λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ 싀행을 μ–‘λ³΄ν•˜λ„λ‘ μš”μ²­ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 맀번 같은 κ²°κ³Όλ₯Ό 보μž₯ν•˜μ§€ μ•ŠμœΌλ©°, OS에 따라 λ™μž‘μ΄ λ‹¬λΌμ§ˆ 수 있기 λ•Œλ¬Έμ— μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

Last updated

Was this helpful?