# [OS] Deadlockκ³Ό Banker's Algorithm
Study Repository

[OS] Deadlockκ³Ό Banker's Algorithm

by rlaehddnd0422

λ°λ“œλ½(DeadLock)μ΄λž€?

λ°λ“œλ½

 

두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μ„œλ‘œκ°€ 가진 μžμ›μ„ 기닀리며 μ€‘λ‹¨λœ μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€. 

이 κ³Όμ •μ—μ„œ 각 ν”„λ‘œμ„ΈμŠ€λŠ” μ„œλ‘œκ°€ μ›ν•˜λŠ” μžμ›μ„ μœ μ§€ν•œ 채 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ μ–»κΈ°λ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€.

 

  1. Process1은 Process2의 μžμ›μ„ ν•„μš”λ‘œ 함.
  2. Process2은 Process1의 μžμ›μ„ ν•„μš”λ‘œ 함.
  3. μ„œλ‘œκ°€ 가진 μžμ›μ„ μš”μ²­ν•˜λ©° 기닀리기 λ•Œλ¬Έμ— μ„œλ‘œ λ¬΄ν•œμ • κΈ°λ‹€λ¦¬λŠ” ν˜„μƒμ΄ λ°œμƒ.

 

μ˜ˆμ‹œ κ·Έλ¦Ό

 

μžλ™μ°¨λ₯Ό ν”„λ‘œμ„ΈμŠ€, ν˜„μž¬ μœ„μΉ˜ν•œ 길을 μžμ›μ΄λΌκ³  μƒκ°ν•˜λ©΄ μ’€ 더 μ΄ν•΄ν•˜κΈ° μ‰¬μšΈ κ²λ‹ˆλ‹€.

μžλ™μ°¨μ™€ μžλ™μ°¨, 즉 μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ ν˜„μž¬ μœ„μΉ˜ν•œ κΈΈμ—μ„œ 쀑간 ꡐ차둜(μ„œλ‘œκ°€ ν•„μš”λ‘œ ν•˜λŠ” μžμ›)μ—μ„œ μ§μ„ μœΌλ‘œ λ‚˜μ•„κ°€μ•Ό ν•˜λŠ”λ°, λ™μ‹œμ— λ‹€λ₯Έ 길을 μ‚¬μš©ν•  수 μ—†μœΌλ©° ν˜„μž¬ κΈΈμ—μ„œλ„ λ²—μ–΄λ‚˜μ§€ λͺ»ν•˜λŠ” 상황이 λ°”λ‘œ λ°λ“œλ½μž…λ‹ˆλ‹€.

 

 

λ°λ“œλ½ ν•„μš”μΆ©λΆ„ 쑰건

ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ°λ“œλ½ μƒνƒœκ°€ 되기 μœ„ν•΄μ„œλŠ” μ•„λž˜μ˜ λ„€ 가지 쑰건이 λͺ¨λ‘ μΆ©μ‘±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

  1. μƒν˜Έ 배제(Mutual Exclusion) : 주어진 μ‹œκ°„ 내에 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ μžμ›μ„ 독점할 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ“€μ€ 이 μžμ›μ— μ ‘κ·Όν•  수 없도둝 μ„€μ •λœ 상황.
  2. 점유 λŒ€κΈ°(Hold And Wait) : ν”„λ‘œμ„ΈμŠ€κ°€ μ΅œμ†Œν•œ ν•˜λ‚˜μ˜ μžμ›μ„ μ μœ ν•˜κ³  μžˆμœΌλ©΄μ„œ, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ— ν• λ‹Ήλ˜μ–΄ μ‚¬μš©λ˜κ³  μžˆλŠ” μžμ›μ„ μΆ”κ°€λ‘œ μ μœ ν•˜κΈ° μœ„ν•΄ λŒ€κΈ°ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μžˆμ–΄μ•Ό ν•˜λŠ” 상황. 즉, νŠΉμ • ν”„λ‘œμ„ΈμŠ€κ°€ μ μœ ν•œ μžμ›μ„ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μš”μ²­ν•˜λ©° λŒ€κΈ°ν•˜λŠ” μƒνƒœ.
  3. 비선점(Non-Preemptive) : λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ κ°•μ œμ μœΌλ‘œ κ°€μ Έμ˜¬ 수 없도둝 μ„€μ •λœ 상황.
  4. ν™˜ν˜• λŒ€κΈ°(Circular Wait) : 두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ„œλ‘œμ˜ μžμ›μ„ μš”κ΅¬ν•˜λŠ” 상황.

 

μœ„ 넀가지 쑰건이 λͺ¨λ‘ μΆ©μ‘±λ˜μ–΄λ„ κ΅μ°©μƒνƒœκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ 수 μžˆμ§€λ§Œ, λ°˜λŒ€λ‘œ κ΅μ°©μƒνƒœκ°€ λ°œμƒν–ˆλ‹€λ©΄ μœ„ 넀가지 쑰건이 λͺ¨λ‘ μΆ©μ‘±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. (ν•„μš” μΆ©λΆ„ 쑰건)

 

κ΅μ°©μƒνƒœ λ°œμƒ ----> λ„€ 가지 쑰건 λͺ¨λ‘ 만쑱
λ„€ 가지 쑰건 λͺ¨λ‘ 만쑱 --X--> κ΅μ°©μƒνƒœ λ°œμƒ

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

λ°λ“œλ½ ν•΄κ²° λ°©λ²•μœΌλ‘œλŠ” 4가지 방법이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

첫 번째, 예방

  • μ• μ‹œλ‹Ήμ΄ˆ, μ‹œμŠ€ν…œμ„ 섀계할 λ•Œ κ΅μ°©μƒνƒœκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ 사전에 μ œμ–΄ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
  • λ„€ 가지 쑰건 쀑 μ–΄λŠ ν•˜λ‚˜λ₯Ό μ œκ±°ν•¨μœΌλ‘œμ¨ μˆ˜ν–‰λ˜λŠ” 방법.

두 번째, 발견

  • μ‹œμŠ€ν…œμ— κ΅μ°©μƒνƒœκ°€ λ°œμƒν–ˆλŠ”μ§€ μ κ²€ν•˜μ—¬ κ΅μ°©μƒνƒœμ— μžˆλŠ” ν”„λ‘œμ„ΈμŠ€μ™€ μžμ›μ„ λ°œκ²¬ν•˜κ³  κ΄€λ ¨λœ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ œκ±°ν•˜λŠ” 방법
  • λ°λ“œλ½ 발견 μ•Œκ³ λ¦¬μ¦˜, μžμ› ν• λ‹Ή κ·Έλž˜ν”„ 등을 μ‚¬μš©.

μ„Έ 번째, 회볡

  • κ΅μ°©μƒνƒœλŠ” 사싀 맀우 λ“œλ¬Όκ²Œ μΌμ–΄λ‚©λ‹ˆλ‹€. λ•Œλ¬Έμ— 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” λΉ„μš©μ΄ 더 크기 λ•Œλ¬Έμ— κ΅μ°©μƒνƒœκ°€ λ°œμƒν•˜λ©΄ μž‘μ—…μ„ μ’…λ£Œμ‹œμΌœ λ²„λ¦¬λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 
  • ν˜„λŒ€ μš΄μ˜μ²΄μ œμ—μ„œ λ°λ“œλ½ ν•΄κ²°λ°©λ²•μœΌλ‘œ μ±„νƒν•˜λŠ” λ°©λ²•μœΌλ‘œ, ν”νžˆ λ³Ό 수 μžˆλŠ” '응닡 μ—†μŒ'이 회볡 기법을 μ‚¬μš©ν–ˆλ‹€κ³  보면 됨.

λ„€ 번째, νšŒν”Ό

  • κ΅μ°©μƒνƒœκ°€ λ°œμƒν•  κ°€λŠ₯성을 λ°°μ œν•˜μ§€ μ•Šκ³ , λ°λ“œλ½μ΄ λ°œμƒν•˜λ©΄ κ΅μ°©μƒνƒœλ₯Ό νšŒν”Όν•˜λŠ” λ°©λ²•μœΌλ‘œ 은행원 μ•Œκ³ λ¦¬μ¦˜μ΄ μ‚¬μš©λ©λ‹ˆλ‹€.
  • ꡐ착 μƒνƒœ κ°€λŠ₯성이 없을 λ•Œ μžμ›μ„ ν• λ‹Ήν•˜λŠ” 방식.

 

λ°λ“œλ½ νšŒν”Ό 기법 - Banker's Algorithm

κ΅μ°©μƒνƒœλ₯Ό νšŒν”Όν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, 총 μžμ›μ˜ μ–‘κ³Ό ν˜„μž¬ ν• λ‹Ήν•œ μžμ›μ˜ 양을 κΈ°μ€€μœΌλ‘œ μ•ˆμ •/λΆˆμ•ˆμ • μƒνƒœλ‘œ λ‚˜λˆ  μ•ˆμ • μƒνƒœλ‘œ 가도둝 μžμ›μ„ ν• λ‹Ήν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.

 

- μ—¬κΈ°μ„œ λ§ν•˜λŠ” μ•ˆμ • μƒνƒœλŠ” "ꡐ착 μƒνƒœλ₯Ό μΌμœΌν‚€μ§€ μ•ŠλŠ” μƒνƒœ"둜, ν”„λ‘œμ„ΈμŠ€μ˜ μ΅œλŒ€ μžμ› μš”κ΅¬λŸ‰μ„ μš΄μ˜μ²΄μ œκ°€ μΆ©μ‘±μ‹œμΌœμ€„ 수 μžˆλŠ” μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€. 

- λΆˆμ•ˆμ • μƒνƒœλŠ” "μ•ˆμ • μƒνƒœλ‘œ κ°€λŠ” μˆœμ„œμ—΄μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μƒνƒœ"둜 λ°λ“œλ½μ΄ λ°œμƒν•  수 μžˆλŠ” μƒνƒœλ₯Ό λ§ν•©λ‹ˆλ‹€.

 

은행원 μ•Œκ³ λ¦¬μ¦˜μ„ μ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

λ¨Όμ € 전체 μ½”λ“œμž…λ‹ˆλ‹€.

import java.util.ArrayList;
import java.util.List;

public class BankersAlgorithm {

    static int n = 5; // ν”„λ‘œμ„ΈμŠ€ 갯수
    static int m = 3; // μžμ› 갯수
    static int[][] need = new int[n + 1][m + 1];
    static boolean[] finish = new boolean[n + 1];
    static List<Resource> allocations = new ArrayList<>(); // 이미 ν• λ‹Ήν•œ μ–‘
    static List<Resource> maxRequires = new ArrayList<>(); // μ΅œλŒ€μΉ˜λ‘œ μš”κ΅¬ν•˜λŠ” μ–‘
    static List<Integer> ans = new ArrayList<>(); // μ΅œλŒ€μΉ˜λ‘œ μš”κ΅¬ν•˜λŠ” μ–‘

    public static void main(String[] args) {
        initAllocations();
        initMaxRequires();

        Resource available = new Resource(3, 3, 2);

        // ν”„λ‘œμ„ΈμŠ€κ°€ ν•„μš”ν•œ μžμ›μ–‘μ„ needs에 λ‹΄μŒ.
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                need[i][j] = maxRequires.get(i).get(j) - allocations.get(i).get(j);
            }
        }

        for (int i = 0; i < n; i++) {
            System.out.print(i + "번째 ν”„λ‘œμ„ΈμŠ€μ˜ μžμ› μš”κ΅¬λŸ‰ : ");
            for (int j = 0; j < m; j++) {
                System.out.print(need[i][j] + " ");
            }
            System.out.println();
        }

        for (int k = 0; k < n; k++) {
            for (int processNum = 0; processNum < n; processNum++) {
                if (finish[processNum] == false) {
                    boolean flag = false;
                    for (int j = 0; j < m; j++) {
                        if (need[processNum][j] > available.get(j)) {
                            flag = true;
                            break;
                        }
                    }
                    if (flag == false) {
                        ans.add(processNum);
                        // μžμ› ν—Œλ‚©
                        available.a += allocations.get(processNum).get(0);
                        available.b += allocations.get(processNum).get(1);
                        available.c += allocations.get(processNum).get(2);

                        finish[processNum] = true;
                    }
                }
            }
        }

        boolean isAllSafe = true;
        for (int i = 0; i < n; i++) {
            if (finish[i] == false) {
                isAllSafe = false;
                break;
            }
        }

        if (isAllSafe) {
            System.out.println("-- μ•ˆμ •μƒνƒœ μˆœμ„œ --");
            for (int i = 0; i < n; i++) {
                System.out.println("Process" + i + " " + ans.get(i));
            }
            System.out.println();
            return;
        }

        System.out.println("λΆˆμ•ˆμ • μƒνƒœ");
    }

    private static void initMaxRequires() {
        maxRequires.add(new Resource(7, 5, 3));
        maxRequires.add(new Resource(3, 2, 2));
        maxRequires.add(new Resource(9, 0, 2));
        maxRequires.add(new Resource(2, 2, 2));
        maxRequires.add(new Resource(4, 3, 3));
    }

    private static void initAllocations() {
        allocations.add(new Resource(0, 1, 0));
        allocations.add(new Resource(2, 0, 0));
        allocations.add(new Resource(3, 0, 2));
        allocations.add(new Resource(2, 1, 1));
        allocations.add(new Resource(0, 0, 2));
    }

    static class Resource {
        int a;
        int b;
        int c;

        public int get(int order) {
            if (order == 0) {
                return this.a;
            }

            if (order == 1) {
                return this.b;
            }

            return this.c;
        }

        public Resource(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }
}

 

 

μ—¬κΈ°μ„œ μ „μ—­(static)으둜 μ„ μ–Έν•΄μ€€ λ³€μˆ˜λ“€μ„ λ¨Όμ € λ΄…μ‹œλ‹€.

static int n = 5; // ν”„λ‘œμ„ΈμŠ€ 갯수
static int m = 3; // μžμ› 갯수
static int[][] need = new int[n + 1][m + 1];
static boolean[] finish = new boolean[n + 1];
static List<Resource> allocations = new ArrayList<>(); // 이미 ν• λ‹Ήν•œ μ–‘
static List<Resource> maxRequires = new ArrayList<>(); // μ΅œλŒ€μΉ˜λ‘œ μš”κ΅¬ν•˜λŠ” μ–‘
static List<Integer> ans = new ArrayList<>(); // μ΅œλŒ€μΉ˜λ‘œ μš”κ΅¬ν•˜λŠ” μ–‘

 

  • n은 ν˜„μž¬ 싀행쀑인 ν”„λ‘œμ„ΈμŠ€ 갯수이고, m은 μžμ› 갯수둜 μ‹€μ œλ‘œλŠ” CPUλ‚˜ λ©”λͺ¨λ¦¬λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • needλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ ν•„μš”λ‘œν•˜λŠ” μžμ›μ˜ μš”κ΅¬λŸ‰μ„ 담은 이차원 λ°°μ—΄λ‘œ, need[i][j]μ—λŠ” i번째 ν”„λ‘œμ„ΈμŠ€κ°€ ν•„μš”λ‘œν•˜λŠ” j번째 μžμ›μ˜ 양이 λ‹΄κΉλ‹ˆλ‹€.
  • finishλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ •μƒμ μœΌλ‘œ λ§ˆμ³€λŠ”μ§€μ— λŒ€ν•œ μ—¬λΆ€λ₯Ό 담은 일차원 boolean λ°°μ—΄μž…λ‹ˆλ‹€.
  • allocationsλŠ” ν”„λ‘œμ„ΈμŠ€μ— 이미 ν• λ‹Ήλ˜μ–΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ 가지고 μžˆλŠ” μžμ›μ˜ 양이 λ‹΄κΈ΄ Listμž…λ‹ˆλ‹€.
    • allocation.get(i).get(0) = i번째 ν”„λ‘œμ„ΈμŠ€κ°€ 이미 ν• λ‹Ήλ˜μ–΄ 가진 a μžμ›μ˜ μ–‘
    • allocation.get(i).get(1) = i번째 ν”„λ‘œμ„ΈμŠ€κ°€ 이미 ν• λ‹Ήλ˜μ–΄ 가진 b μžμ›μ˜ μ–‘
    • allocation.get(i).get(2) = i번째 ν”„λ‘œμ„ΈμŠ€κ°€ 이미 ν• λ‹Ήλ˜μ–΄ 가진 c μžμ›μ˜ μ–‘
  • maxRequiresλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ΅œλŒ€μΉ˜λ‘œ μš”κ΅¬ν•˜λŠ” μžμ›μ˜ 양이 λ‹΄κΈ΄ List μž…λ‹ˆλ‹€.
    • maxRequires.get(i).get(0) = i번째 ν”„λ‘œμ„ΈμŠ€κ°€ μš”κ΅¬ν•˜λŠ” a μžμ›μ˜ μ΅œλŒ€λŸ‰
    • maxRequires.get(i).get(1) = i번째 ν”„λ‘œμ„ΈμŠ€κ°€ μš”κ΅¬ν•˜λŠ” b μžμ›μ˜ μ΅œλŒ€λŸ‰
    • maxRequires.get(i).get(2) = i번째 ν”„λ‘œμ„ΈμŠ€κ°€ μš”κ΅¬ν•˜λŠ” c μžμ›μ˜ μ΅œλŒ€λŸ‰ 
  • ansμ—λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ•ˆμ •μƒνƒœλ‘œ λ„λ‹¬ν•˜λŠ” μˆœμ„œλŒ€λ‘œ ν”„λ‘œμ„ΈμŠ€ 번호λ₯Ό 담을 List

 

λ¨Όμ € 5개의 ν”„λ‘œμ„ΈμŠ€κ°€ 각 ν•„μš”λ‘œ ν•˜λŠ” μ΅œλŒ€ μžμ›λŸ‰κ³Ό ν˜„μž¬ 가지고 μžˆλŠ” μžμ›λŸ‰μ„ μ΄ˆκΈ°ν™” ν•΄λ΄…μ‹œλ‹€.

private static void initMaxRequires() {
    maxRequires.add(new Resource(7, 5, 3));
    maxRequires.add(new Resource(3, 2, 2));
    maxRequires.add(new Resource(9, 0, 2));
    maxRequires.add(new Resource(2, 2, 2));
    maxRequires.add(new Resource(4, 3, 3));
}

private static void initAllocations() {
    allocations.add(new Resource(0, 1, 0));
    allocations.add(new Resource(2, 0, 0));
    allocations.add(new Resource(3, 0, 2));
    allocations.add(new Resource(2, 1, 1));
    allocations.add(new Resource(0, 0, 2));
}

 

 

ν”„λ‘œμ„ΈμŠ€ Allocation ( A, B, C ) Max_Requires ( A, B, C )
P0 ( 0, 1, 0 ) ( 7, 5, 3 )
P1 ( 2, 0, 0 ) ( 3, 2, 2 )
P2 ( 3, 0, 2 ) ( 9, 0, 2 )
P3 ( 2, 1, 1 ) ( 2, 2, 2 )
P4 ( 0, 0, 2 ) ( 4, 3, 3 )

 

 

Resource available = new Resource(3, 3, 2);
  • ν˜„μž¬ μš΄μ˜μ²΄μ œκ°€ ν”„λ‘œμ„ΈμŠ€μ— ν• λ‹Ήν•΄ 쀄 수 μžˆλŠ” μžμ›μž…λ‹ˆλ‹€.

 

// ν”„λ‘œμ„ΈμŠ€κ°€ ν•„μš”ν•œ μžμ›μ–‘μ„ needs에 λ‹΄μŒ.
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        need[i][j] = maxRequires.get(i).get(j) - allocations.get(i).get(j);
    }
}
  • ν”„λ‘œμ„ΈμŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” μžμ›μ–‘μ„ needs에 λ‹΄μ•„μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
  • ν•„μš”λ‘œ ν•˜λŠ” μžμ›μ–‘μ€ μ΅œλŒ€ ν•„μš”λ‘œ ν•˜λŠ” μžμ›λŸ‰μ—μ„œ 이미 ν• λ‹Ήλ°›μ•„ 가지고 μžˆλŠ” μžμ›μ˜ μ–‘λ§ŒνΌ λΉΌμ£Όλ©΄ λ˜κ² μŠ΅λ‹ˆλ‹€.
ν”„λ‘œμ„ΈμŠ€ Need ( A, B, C )
P0 ( 7, 4, 3 )
P1 ( 1, 2, 2 )
P2 ( 6, 0, 0 )
P3 ( 0, 1, 1 )
P4 ( 4, 3, 1)

 

이제 은행원 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ κ΅μ°©μƒνƒœλ₯Ό νšŒν”Όν•΄ λ³Όκ±΄λ°μš”. 은행원 μ•Œκ³ λ¦¬μ¦˜ ꡬ쑰λ₯Ό λ¨Όμ € μ‚΄νŽ΄λ΄…μ‹œλ‹€.

 

은행원 μ•Œκ³ λ¦¬μ¦˜ Flow

  1. 0번 ν”„λ‘œμ„ΈμŠ€~ n-1번 ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•˜μ—¬ μˆœμ„œλŒ€λ‘œ ν”„λ‘œμ„ΈμŠ€κ°€ μš”κ΅¬ν•˜λŠ” μžμ›λŸ‰(need)이 availableν•œ μžμ›λŸ‰λ³΄λ‹€ 큰 경우 ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€λŠ” passν•˜μ—¬ λŒ€κΈ°.
  2. ν”„λ‘œμ„ΈμŠ€κ°€ μš”κ΅¬ν•˜λŠ” μžμ›λŸ‰ needκ°€ ν˜„μž¬ ν• λ‹Ή κ°€λŠ₯ν•œ μžμ›λŸ‰λ³΄λ‹€ μž‘μ€ 경우 μžμ›μ„ ν• λ‹Ήν•  수 μžˆμœΌλ‹ˆ μžμ›μ„ ν• λ‹Ή.
  3. ν”„λ‘œμ„ΈμŠ€ μ •μƒμˆ˜ν–‰ 및 μ’…λ£Œ.
  4. 이 ν›„ ν• λ‹Ή κ°€λŠ₯ν•œ μžμ›λŸ‰(available)에 μ •μƒμˆ˜ν–‰ ν›„ μ’…λ£Œλœ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›λŸ‰μ„ λ”ν•΄μ€λ‹ˆλ‹€.
  5. 1~4번 과정을 λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ n(μ΅œμ•…μ˜ 경우λ₯Ό κ³ λ €ν•˜μ—¬)번 λ°˜λ³΅ν•˜μ—¬ λͺ¨λ“  finishκ°€ trueκ°€ 되면 μ•ˆμ •μƒνƒœμ— 이름.

 

μœ„ 과정을 κ΅¬ν˜„ν•œ 것이 μ•„λž˜μ˜ μ½”λ“œμž…λ‹ˆλ‹€.

for (int k = 0; k < n; k++) {
    for (int processNum = 0; processNum < n; processNum++) {
        if (finish[processNum] == false) {
            boolean flag = false;
            for (int j = 0; j < m; j++) {
                if (need[processNum][j] > available.get(j)) {
                    flag = true;
                    break;
                }
            }
            if (flag == false) {
                ans.add(processNum);
                // μžμ› ν—Œλ‚©
                available.a += allocations.get(processNum).get(0);
                available.b += allocations.get(processNum).get(1);
                available.c += allocations.get(processNum).get(2);

                finish[processNum] = true;
            }
        }
    }
}

 

ν”„λ‘œμ„ΈμŠ€κ°€ λͺ¨λ‘ 마친 경우 μ•ˆμ •μƒνƒœμ— 이λ₯΄κΈ° λ•Œλ¬Έμ— λ°λ“œλ½μ„ νšŒν”Όν–ˆλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ iterν•˜μ—¬ finishκ°€ true인지 검사해주고 λͺ¨λ‘ true라면 μ•ˆμ •μƒνƒœκ°€ λ©λ‹ˆλ‹€.

boolean isAllSafe = true;
for (int i = 0; i < n; i++) {
    if (finish[i] == false) {
        isAllSafe = false;
        break;
    }
}

 

λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€κ°€ μ•ˆμ •μƒνƒœλΌλ©΄ μ•ˆμ •μƒνƒœμ— λ„λ‹¬ν•˜κ²Œ 된 ν”„λ‘œμ„ΈμŠ€μ˜ μˆœμ„œλ₯Ό μ•Œ 수 μžˆκ² μŠ΅λ‹ˆλ‹€. μ•„λž˜ μ½”λ“œμ—μ„œ μ•ˆμ •μƒνƒœμ— λ„λ‹¬ν•˜κ²Œ 된 ν”„λ‘œμ„ΈμŠ€μ˜ μˆœμ„œλ₯Ό 담은 리슀트λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

if (isAllSafe) {
    System.out.println("-- μ•ˆμ •μƒνƒœ μˆœμ„œ --");
    for (int i = 0; i < n; i++) {
        System.out.println("Process" + i + " " + ans.get(i));
    }
    System.out.println();
    return;
}

System.out.println("λΆˆμ•ˆμ • μƒνƒœ");

 

μ‹€μ œ κ²°κ³Ό

 

μ΄λ ‡κ²Œ λ°λ“œλ½ νšŒν”ΌκΈ°λ²•μΈ 은행원 μ•Œκ³ λ¦¬μ¦˜μ„ μ½”λ“œλ‘œ κ΅¬ν˜„ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

은행원 μ•Œκ³ λ¦¬μ¦˜μ€ ν”„λ‘œμ„ΈμŠ€κ°€ μ‹œμŠ€ν…œμ— λ“€μ–΄κ°ˆ λ•Œ ν•„μš”ν•œ μ΅œλŒ€ μžμ› 수λ₯Ό μ˜ˆμΈ‘ν•΄μ•Ό ν•˜λŠ”λ° 사싀 이 μ΅œλŒ€ν•„μš”λŸ‰(maxRequires)λ₯Ό μ˜ˆμΈ‘ν•˜κΈ°κ°€ 쉽지 μ•Šκ³  ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•œ μžμ›μ†Œλͺ¨λŸ‰μ΄ μ¦κ°€ν•˜κ²Œ 되며, ν”„λ‘œκ·Έλž¨ 수 λ˜ν•œ κ³ μ •λ˜μ–΄μžˆμ§€ μ•Šκ³  항상 λ³€ν•  수 있기 λ•Œλ¬Έμ— 은행원 μ•Œκ³ λ¦¬μ¦˜μ€ 사싀상 ν™œμš©ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€λŠ” 치λͺ…적인 단점이 μ‘΄μž¬ν•©λ‹ˆλ‹€. 

 

<참고 자료>

 

Deadlock(ꡐ착 μƒνƒœ)의 κ°œλ…κ³Ό λ°œμƒ 원인

 

velog.io

 

 

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°