BAB 6
DEADLOCKS
6.1. Tujuan Praktikum
Materi praktikum pada bab ini bertujuan untuk memperkenalkan
situasi deadlock yang mungkin terjadi pada sistem operasi. Sebelum terjadi
deadlock, terdapat kondisi-kondisi yang dapat menjadi penyebab situasi
deadlock.
(a) (b)
Gambar 6.1 (a) Resource Alocation Graph Tanpa Deadlock (b) Resource
Alocation Graph Dengan Deadlock
main.c
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 void print(int x[][10],int n,int m) {
5 int i,j;
6 for(i=0;i<n;i++){
7 printf("\n");
8 for(j=0;j<m;j++){
9 printf("%d\t",x[i][j]);
10 }
11 }
12 }
13
14 //Resource Request algorithm
15 void res_request(int A[10][10],int
N[10][10],int AV[10][10],int pid,int m) {
16 int reqmat[1][10];
17 int i;
18 printf("\n Enter additional request :- \n");
19
20 for(i=0;i<m;i++) {
21 printf(" Request for resource %d : ",i+1);
22 scanf("%d",&reqmat[0][i]);
23 }
24
25 for(i=0;i<m;i++)
26 if(reqmat[0][i] > N[pid][i]) {
27 printf("\n Error encountered.\n");
28 exit(0);
29 }
30
31 for(i=0;i<m;i++)
32 if(reqmat[0][i] > AV[0][i]) {
33 printf("\n Resources unavailable.\n");
34 exit(0);
35 }
36
37 for(i=0;i<m;i++) {
38 AV[0][i]-=reqmat[0][i];
39 A[pid][i]+=reqmat[0][i];
40 N[pid][i]-=reqmat[0][i];
41 }
42 }
43
44 //Safety algorithm
45 int safety(int A[][10],int N[][10],int
AV[1][10],int n,int m,int a[]){
46 int i,j,k,x=0;
47 int F[10],W[1][10];
48 int pflag=0,flag=0;
49 for(i=0;i<n;i++)
50 F[i]=0;
51 for(i=0;i<m;i++)
52 W[0][i]=AV[0][i];
53
54 for(k=0;k<n;k++) {
55 for(i=0;i<n;i++) {
56 if(F[i] == 0) {
57 flag=0;
58 for(j=0;j<m;j++) {
59 if(N[i][j] > W[0][j])
60 flag=1;
61 }
62
63 if(flag == 0 && F[i] == 0){
64 for(j=0;j<m;j++)
65 W[0][j]+=A[i][j];
66 F[i]=1;
67 pflag++;
68 a[x++]=i;
69 }
70 }
71 }
72 if(pflag == n)
73 return 1;
74 }
75 return 0;
76 }
77
78 //Banker's Algorithm
79 void accept(int A[][10],int N[][10],int
M[10][10],int W[1][10],int *n,int *m) {
80 int i,j;
81 printf("\n Enter total no. of processes : ");
82 scanf("%d",n);
83 printf("\n Enter total no. of resources : ");
84 scanf("%d",m);
85 for(i=0;i<*n;i++) {
86 printf("\n Process %d\n",i+1);
87 for(j=0;j<*m;j++) {
88 printf(" Allocation for resource %d :
",j+1);
89 scanf("%d",&A[i][j]);
90 printf(" Maximum for resource %d :
",j+1);
91 scanf("%d",&M[i][j]);
92 }
93 }
94
95 printf("\n Available resources : \n");
96 for(i=0;i<*m;i++) {
97 printf(" Resource %d : ",i+1);
98 scanf("%d",&W[0][i]);
99 }
100
101 for(i=0;i<*n;i++)
102 for(j=0;j<*m;j++)
103 N[i][j]=M[i][j]-A[i][j];
104
105 printf("\n Allocation Matrix");
106 print(A,*n,*m);
107 printf("\n Maximum Requirement Matrix");
108 print(M,*n,*m);
109 printf("\n Need Matrix");
110 print(N,*n,*m);
111 }
112
113 int banker(int A[][10],int N[][10],int
W[1][10],int n,int m){
114 int j,i,a[10];
115 j=safety(A,N,W,n,m,a);
116 if(j != 0 ) {
117 printf("\n\n");
118 for(i=0;i<n;i++)
119 printf(" P%d ",a[i]);
120 printf("\n A safety sequence has been
detected.\n");
121 return 1;
122 } else {
123 printf("\n Deadlock has occured.\n");
124 return 0;
125 }
126 }
127
128 int main() {
129 int ret;
130 int A[10][10];
131 int M[10][10];
132 int N[10][10];
133 int W[1][10];
134 int n,m,pid,ch;
135 printf("\n DEADLOCK AVOIDANCE USING BANKER'S
ALGORITHM\n");
136 accept(A,N,M,W,&n,&m);
137 ret=banker(A,N,W,n,m);
138 if(ret !=0 ) {
139 printf("\n Do you want make an additional
request ? (1=Yes|0=No)");
140 scanf("%d",&ch);
141 if(ch == 1) {
142 printf("\n Enter process no. : ");
143 scanf("%d",&pid);
144 res_request(A,N,W,pid-1,m);
145 ret=banker(A,N,W,n,m);
146 if(ret == 0 )
147 exit(0);
148 }
149 } else
150 exit(0);
151 return 0;
152 }