[OS] Deadlockκ³Ό Banker's Algorithm
by rlaehddnd0422λ°λλ½(DeadLock)μ΄λ?
λ κ° μ΄μμ νλ‘μΈμ€λ€μ΄ μλ‘κ° κ°μ§ μμμ κΈ°λ€λ¦¬λ©° μ€λ¨λ μνλ₯Ό λ§ν©λλ€.
μ΄ κ³Όμ μμ κ° νλ‘μΈμ€λ μλ‘κ° μνλ μμμ μ μ§ν μ± λ€λ₯Έ νλ‘μΈμ€μ μμμ μ»κΈ°λ₯Ό κΈ°λ€λ¦½λλ€.
- Process1μ Process2μ μμμ νμλ‘ ν¨.
- Process2μ Process1μ μμμ νμλ‘ ν¨.
- μλ‘κ° κ°μ§ μμμ μμ²νλ©° κΈ°λ€λ¦¬κΈ° λλ¬Έμ μλ‘ λ¬΄νμ κΈ°λ€λ¦¬λ νμμ΄ λ°μ.
μλμ°¨λ₯Ό νλ‘μΈμ€, νμ¬ μμΉν κΈΈμ μμμ΄λΌκ³ μκ°νλ©΄ μ’ λ μ΄ν΄νκΈ° μ¬μΈ κ²λλ€.
μλμ°¨μ μλμ°¨, μ¦ μλ‘ λ€λ₯Έ νλ‘μΈμ€κ° νμ¬ μμΉν κΈΈμμ μ€κ° κ΅μ°¨λ‘(μλ‘κ° νμλ‘ νλ μμ)μμ μ§μ μΌλ‘ λμκ°μΌ νλλ°, λμμ λ€λ₯Έ κΈΈμ μ¬μ©ν μ μμΌλ©° νμ¬ κΈΈμμλ λ²μ΄λμ§ λͺ»νλ μν©μ΄ λ°λ‘ λ°λλ½μ λλ€.
λ°λλ½ νμμΆ©λΆ μ‘°κ±΄
νλ‘μΈμ€μμ λ°λλ½ μνκ° λκΈ° μν΄μλ μλμ λ€ κ°μ§ μ‘°κ±΄μ΄ λͺ¨λ μΆ©μ‘±λμ΄μΌ ν©λλ€.
- μνΈ λ°°μ (Mutual Exclusion) : μ£Όμ΄μ§ μκ° λ΄μ νλμ νλ‘μΈμ€λ§ μμμ λ μ ν μ μμ΅λλ€. μ¦, λ€λ₯Έ νλ‘μΈμ€λ€μ μ΄ μμμ μ κ·Όν μ μλλ‘ μ€μ λ μν©.
- μ μ λκΈ°(Hold And Wait) : νλ‘μΈμ€κ° μ΅μν νλμ μμμ μ μ νκ³ μμΌλ©΄μ, λ€λ₯Έ νλ‘μΈμ€μ ν λΉλμ΄ μ¬μ©λκ³ μλ μμμ μΆκ°λ‘ μ μ νκΈ° μν΄ λκΈ°νλ νλ‘μΈμ€κ° μμ΄μΌ νλ μν©. μ¦, νΉμ νλ‘μΈμ€κ° μ μ ν μμμ λ€λ₯Έ νλ‘μΈμ€κ° μμ²νλ©° λκΈ°νλ μν.
- λΉμ μ (Non-Preemptive) : λ€λ₯Έ νλ‘μΈμ€μ μμμ κ°μ μ μΌλ‘ κ°μ Έμ¬ μ μλλ‘ μ€μ λ μν©.
- νν λκΈ°(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
- 0λ² νλ‘μΈμ€~ n-1λ² νλ‘μΈμ€μ λνμ¬ μμλλ‘ νλ‘μΈμ€κ° μꡬνλ μμλ(need)μ΄ availableν μμλλ³΄λ€ ν° κ²½μ° ν΄λΉ νλ‘μΈμ€λ passνμ¬ λκΈ°.
- νλ‘μΈμ€κ° μꡬνλ μμλ needκ° νμ¬ ν λΉ κ°λ₯ν μμλλ³΄λ€ μμ κ²½μ° μμμ ν λΉν μ μμΌλ μμμ ν λΉ.
- νλ‘μΈμ€ μ μμν λ° μ’ λ£.
- μ΄ ν ν λΉ κ°λ₯ν μμλ(available)μ μ μμν ν μ’ λ£λ νλ‘μΈμ€μ μμλμ λν΄μ€λλ€.
- 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)λ₯Ό μμΈ‘νκΈ°κ° μ½μ§ μκ³ ν΄λΉ μκ³ λ¦¬μ¦μ λν μμμλͺ¨λμ΄ μ¦κ°νκ² λλ©°, νλ‘κ·Έλ¨ μ λν κ³ μ λμ΄μμ§ μκ³ νμ λ³ν μ μκΈ° λλ¬Έμ μνμ μκ³ λ¦¬μ¦μ μ¬μ€μ νμ©νκΈ°κ° μ΄λ ΅λ€λ μΉλͺ μ μΈ λ¨μ μ΄ μ‘΄μ¬ν©λλ€.
<μ°Έκ³ μλ£>
'π CS > OS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422