λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/운영체제

λ°λ“œλ½

by joaa 2024. 2. 9.

🎈 Deadlock?

두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€ ν˜Ήμ€ μŠ€λ ˆλ“œκ°€ μ„œλ‘œκ°€ κ°€μ§„ λ¦¬μ†ŒμŠ€λ₯Ό κΈ°λ‹€λ¦¬λŠ” μƒνƒœ

 

 

🎈 λ°λ“œλ½μ„ λ§Œλ“œλŠ” λ„€ κ°€μ§€ 쑰건

1. Mutual exclusion

    λ¦¬μ†ŒμŠ€(resource)λ₯Ό κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•  수 μ—†λ‹€.

2. Hold and Wait

    ν”„λ‘œμ„ΈμŠ€κ°€ 이미 ν•˜λ‚˜ μ΄μƒμ˜ λ¦¬μ†ŒμŠ€λ₯Ό μ·¨λ“ν•œ(hold) μƒνƒœμ—μ„œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” λ¦¬μ†ŒμŠ€λ₯Ό μΆ”κ°€λ‘œ κΈ°λ‹€λ¦°λ‹€(wait).

3. No preemption

    λ¦¬μ†ŒμŠ€ λ°˜ν™˜(relase)은 였직 κ·Έ λ¦¬μ†ŒμŠ€λ₯Ό μ·¨λ“ν•œ ν”„λ‘œμ„ΈμŠ€λ§Œ ν•  수 μžˆλ‹€. 

4. Circular wait

    ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μˆœν™˜(circular) ν˜•νƒœλ‘œ μ„œλ‘œμ˜ λ¦¬μ†ŒμŠ€λ₯Ό κΈ°λ‹€λ¦°λ‹€.

 

 

🎈 OS의 λ°λ“œλ½ ν•΄κ²° 방법

1. λ°λ“œλ½ λ°©μ§€

   λ„€ κ°€μ§€ 쑰건 쀑 ν•˜λ‚˜κ°€ μΆ©μ‘±λ˜μ§€ μ•Šκ²Œ μ‹œμŠ€ν…œμ„ λ””μžμΈ

#1. Mutual exclusion λ°©μ§€: λ¦¬μ†ŒμŠ€λ₯Ό 곡유 κ°€λŠ₯ν•˜κ²Œ 함. ν˜„μ‹€μ μœΌλ‘œ λΆˆκ°€λŠ₯. 

#2. Hold and wait λ°©μ§€:

- μ‚¬μš©ν•  λ¦¬μ†ŒμŠ€λ“€μ„ λͺ¨λ‘ νšλ“ν•œ 뒀에 μ‹œμž‘

- λ¦¬μ†ŒμŠ€λ₯Ό μ „ν˜€ κ°€μ§€μ§€ μ•Šμ€ μƒνƒœμ—μ„œλ§Œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­

#3. No preemption

- 좔가적인 λ¦¬μ†ŒμŠ€λ₯Ό κΈ°λ‹€λ €μ•Ό ν•œλ‹€λ©΄ 이미 νšλ“ν•œ λ¦¬μ†ŒμŠ€λ₯Ό λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ 선점 κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€. 

#4. Circular wait

- λͺ¨λ“  λ¦¬μ†ŒμŠ€μ— μˆœμ„œ 체계λ₯Ό λΆ€μ—¬ν•΄μ„œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ¦¬μ†ŒμŠ€λ₯Ό λΆ€μ—¬. λ°λ“œλ½ λ°©μ§€ 방법 쀑 κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 방식.

 

2. λ°λ“œλ½ νšŒν”Ό

μ‹€ν–‰ ν™˜κ²½μ—μ„œ 좔가적인 정보λ₯Ό ν™œμš©ν•΄μ„œ λ°λ“œλ½μ΄ λ°œμƒν•  것 같은 상황을 νšŒν”Όν•˜λŠ” 것

Banker algorithm

: λ¦¬μ†ŒμŠ€ μš”μ²­μ„ ν—ˆλ½ν•΄μ€¬μ„ λ•Œ λ°λ“œλ½μ΄ λ°œμƒν•  κ°€λŠ₯성이 있으면 λ¦¬μ†ŒμŠ€λ₯Ό 할당해도 μ•ˆμ „ν•  λ•Œ κΉŒμ§€ 계속 μš”μ²­μ„ κ±°μ ˆν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜. 

 

3. λ°λ“œλ½ 감지와 볡ꡬ

λ°λ“œλ½μ„ ν—ˆμš©ν•˜κ³  λ°λ“œλ½μ΄ λ°œμƒν•˜λ©΄ λ³΅κ΅¬ν•˜λŠ” μ „λž΅

볡ꡬ μ „λž΅ 1. ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•œλ‹€. 

볡ꡬ μ „λž΅ 2. λ¦¬μ†ŒμŠ€μ˜ μΌμ‹œμ μΈ 선점을 ν—ˆμš©ν•œλ‹€. 

 

4. λ°λ“œλ½ λ¬΄μ‹œ

 

 

 

🎈 ν”„λ‘œκ·Έλž˜λ° λ ˆλ²¨μ—μ„œ λ°λ“œλ½

public class Main {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        
        Thread t1 = new Thread(() -> {...});
        
        Thread t2 = new Thread(() -> {...});
        
        t1.start();
        t2.start();
    }
}


Thread t1 = new Thread(() -> {
    synchronized(lock1) {
    	System.out.println("[t1] get lock1");
        synchronized(lock2) {
        	System.out.println("[t1] get lock2");
        }
    }
});


Thread t2 = new Thread(() -> {
    synchronized(lock2) {
    	System.out.println("[t2] get lock2");
        synchronized(lock1) {
        	System.out.println("[t2] get lock1");
        }
    }
});

 

- mutual exclusion을 λ‚¨λ°œν•˜μ§€ μ•Šμ•˜λŠ”μ§€ 확인

mutual exclusion이 λ°˜λ“œμ‹œ ν•„μš”ν•œ 상황이라면

- lock 취득 μˆœμ„œλ₯Ό λ³€κ²½ν•˜λ©΄ circular waitλ₯Ό λ°©μ§€

- μ€‘μ²©ν•΄μ„œ lock을 μ·¨λ“ν•˜λ € ν•΄μ„œ hold and waitκ°€ λ°œμƒν•˜λ―€λ‘œ, μ€‘μ²©ν•΄μ„œ μ·¨λ“ν•˜μ§€ μ•Šλ„λ‘ν•˜μ—¬ λ°λ“œλ½ λ°©μ§€

'CS > 운영체제' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

CPU μŠ€μΌ€μ€„λŸ¬  (0) 2024.02.12
OSμ—μ„œ ν”„λ‘œμ„ΈμŠ€ μƒνƒœ  (0) 2024.02.10
λͺ¨λ‹ˆν„°  (0) 2024.02.08
동기화, 경쟁 쑰건, μž„κ³„ μ˜μ—­  (0) 2024.02.04
CPU bound, I/O bound  (1) 2024.02.03