Skip to content

Instantly share code, notes, and snippets.

@blood72
Created May 30, 2019 06:19
Show Gist options
  • Save blood72/43d87f30e4fb46f021af5a07ec35198c to your computer and use it in GitHub Desktop.
Save blood72/43d87f30e4fb46f021af5a07ec35198c to your computer and use it in GitHub Desktop.
학창 시절에 만든 C언어 은행가 알고리즘 (반성하자 더티코드ㅜ_ㅜ)
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
int allocated_table[5][5]; //할당 행렬A
int claim_table[5][5]; //요구 행렬C
int avaliable_vector[5]; //가용 벡터V
int allocated_vector[5] = { 0, 0, 0, 0, 0 }; //할당 벡터C-A
int resource_vector[5]; //자원 벡터R
int isRun[5]; //현재 프로세스 실행상태
int isSafe = -1; //-1은 FALSE, 1은 TRUE
int i, j, k, resource_num, process_num; //i: 행, j:렬, k: 실행가능여부
int count = 0; //while문 조건변수
///////////////////////////////////////////////////////////입력 코드
printf("\n자원의 개수를 입력하시오 : ");
scanf("%d", &resource_num);
printf("\n프로세스의 개수를 입력하시오: ");
scanf("%d", &process_num);
for (i = 0; i < process_num; i++) {
isRun[i] = 1;
count++;
}
printf("\n자원 벡터를 입력하시오: ");
for (i = 0; i < resource_num; i++)
scanf("%d", &resource_vector[i]);
printf("\n할당 행렬을 입력하시오 (가로순으로): ");
for (i = 0; i < process_num; i++) {
for (j = 0; j < resource_num; j++)
scanf("%d", &allocated_table[i][j]);
}
printf("\n요구 행렬을 입력하시오 (가로순으로): ");
for (i = 0; i < process_num; i++) {
for (j = 0; j < resource_num; j++)
scanf("%d", &claim_table[i][j]);
}
printf("\n입력된 자원 벡터 : ");
for (i = 0; i < resource_num; i++)
printf("%d ", resource_vector[i]);
printf("\n입력된 할당 행렬:\n");
for (i = 0; i < process_num; i++) {
for (j = 0; j < resource_num; j++)
printf("\t%d", allocated_table[i][j]);
printf("\n");
}
printf("\n입력된 요구 행렬:\n");
for (i = 0; i < process_num; i++) {
for (j = 0; j < resource_num; j++)
printf("\t%d", claim_table[i][j]);
printf("\n");
}
for (i = 0; i < process_num; i++)
for (j = 0; j < resource_num; j++)
allocated_vector[j] += allocated_table[i][j];
printf("\n요구 벡터: ");
for (i = 0; i < resource_num; i++)
printf("%d ", allocated_vector[i]);
for (i = 0; i < resource_num; i++)
avaliable_vector[i] = resource_vector[i] - allocated_vector[i];
printf("\n가용 벡터: ");
for (i = 0; i < resource_num; i++)
printf("%d ", avaliable_vector[i]);
printf("\n");
/////////////////////////////////////////////////////////////
while (count != 0) { //체크된 프로세스 개수만큼 while문을 돌린다
isSafe = -1;
for (i = 0; i < process_num; i++) {
if (isRun[i]) { //프로세스가 실행상태인지 확인
k = 1;
for (j = 0; j < resource_num; j++) {
if (claim_table[i][j] - allocated_table[i][j] > avaliable_vector[j])
{ //요구행렬C - 할당행렬A > 가용벡터V
k = 0; //이 프로세스는 실행할 수 없음
break;
}
}
if (k) {
printf("\n%d번 프로세스가 실행 중입니다.\n", i + 1);
isRun[i] = 0; //프로세스를 종료상태로 둔다
count--;
isSafe = 1;
for (j = 0; j < resource_num; j++)
avaliable_vector[j] += allocated_table[i][j];
break;
}
}
}
if (isSafe == -1) {
printf("\n안전하지 않은 상태입니다.");
break;
}
if (isSafe == 1)
printf("\n안전한 상태입니다.");
printf("\n가용 벡터: ");
for (i = 0; i < resource_num; i++)
printf("%d ", avaliable_vector[i]);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment