DEADLOCK
7.1 Kebutuhan
Untuk dapat menjalankan modul ini, anda memerlukan sebuah komputer dengan operasi
Linux. Dalam praktikum ini tidak ada batasan untuk distribusi sistem operasi linux apa yang
ingin dipakai.
(a) (b)
Gambar 7.1 (a) Resource Alocation Graph Tanpa Deadlock (b) Resource Alocation Graph
Dengan Deadlock
Hal penting yang perlu diperhatikan dalam penggunaan algoritma banker adalah tentang
penyusunan matriks, terdapat beberapa matriks yang perlu dikuasi berkaitan dengan algoritma
banker :
1. Jumlah resource (sumber daya) dari setiap proses yang mungkin diminta disebut dengan
request
2. Jumlah resource (sumber daya) dari setiap proses yang dibutuhkan disebut matriks max
3. Jumlah sisa resource yang masih dimiliki oleh sistem, disebut dengan matriks available
4. Jumlah resource yang telah dialokasikan disebut dengan matriks allocation
Resource hanya boleh/bisa diberikan untuk dipakai pada suatu proses jika:
1. request max, jumlah permintaan (request) tidak lebih banyak dari jumlah maksimum
resource.
2. request available, jumlah request tidak boleh lebih banyak dari jumlah resource yang
tersedia. jika tidak proses harus menunggu hingga resource yang diminta ada.
7.4 Percobaan
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 {
17 int reqmat[1][10];
18 int i;
19 printf("\n Enter additional request :- \n");
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);
27 }
28
29 for(i=0;i<m;i++)
30 if(reqmat[0][i] > AV[0][i]){
31 printf("\n Resources unavailable.\n");
32 exit(0);
33 }
34
35 for(i=0;i<m;i++){
36 AV[0][i]-=reqmat[0][i];
37 A[pid][i]+=reqmat[0][i];
38 N[pid][i]-=reqmat[0][i];
39 }
40 }
41
42 //Safety algorithm
43 int safety(int A[][10],int N[][10],int AV[1][10],int n,int m,int a[]){
44
45 int i,j,k,x=0;
46 int F[10],W[1][10];
47 int pflag=0,flag=0;
48 for(i=0;i<n;i++)
49 F[i]=0;
50 for(i=0;i<m;i++)
51 W[0][i]=AV[0][i];
52
53 for(k=0;k<n;k++){
54 for(i=0;i<n;i++){
55 if(F[i] == 0){
56 flag=0;
57 for(j=0;j<m;j++){
58 if(N[i][j] > W[0][j])
59 flag=1;
60 }
61 if(flag == 0 && F[i] == 0){
62 for(j=0;j<m;j++)
63 W[0][j]+=A[i][j];
64 F[i]=1;
65 pflag++;
66 a[x++]=i;
67 }
68 }
69 }
70 if(pflag == n)
71 return 1;
72 }
73 return 0;
74 }
75
76 //Banker's Algorithm
77 void accept(int A[][10],int N[][10],int M[10][10],int W[1][10],int *n,int *m){
78 int i,j;
79 printf("\n Enter total no. of processes : ");
80 scanf("%d",n);
81 printf("\n Enter total no. of resources : ");
82 scanf("%d",m);
83 for(i=0;i<*n;i++){
84 printf("\n Process %d\n",i+1);
84 for(j=0;j<*m;j++){
86 printf(" Allocation for resource %d : ",j+1);
87 scanf("%d",&A[i][j]);
88 printf(" Maximum for resource %d : ",j+1);
89 scanf("%d",&M[i][j]);
90 }
91 }
92 printf("\n Available resources : \n");
93 for(i=0;i<*m;i++){
94 printf(" Resource %d : ",i+1);
95 scanf("%d",&W[0][i]);
96 }
97
98 for(i=0;i<*n;i++)
99 for(j=0;j<*m;j++)
100 N[i][j]=M[i][j]-A[i][j];
101
102 printf("\n Allocation Matrix");
103 print(A,*n,*m);
104 printf("\n Maximum Requirement Matrix");
105 print(M,*n,*m);
106 printf("\n Need Matrix");
107 print(N,*n,*m);
108
109 }
110
111 int banker(int A[][10],int N[][10],int W[1][10],int n,int m){
112 int j,i,a[10];
113 j=safety(A,N,W,n,m,a);
114 if(j != 0 ){
115 printf("\n\n");
116 for(i=0;i<n;i++)
117 printf(" P%d ",a[i]);
118 printf("\n A safety sequence has been detected.\n");
119 return 1;
120 }else{
121 printf("\n Deadlock has occured.\n");
122 return 0;
123 }
124 }
125
126 int main(){
127 int ret;
128 int A[10][10];
129 int M[10][10];
130 int N[10][10];
131 int W[1][10];
132 int n,m,pid,ch;
133 printf("\n DEADLOCK AVOIDANCE USING BANKER'S ALGORITHM\n");
134 accept(A,N,M,W,&n,&m);
135 ret=banker(A,N,W,n,m);
136 if(ret !=0 ){
137 printf("\n Do you want make an additional request ?
138 (1=Yes|0=No)");
139 scanf("%d",&ch);
140 if(ch == 1){
141 printf("\n Enter process no. : ");
142 scanf("%d",&pid);
143 res_request(A,N,W,pid-1,m);
144 ret=banker(A,N,W,n,m);
145 if(ret == 0 )
146 exit(0);
147 }
148 }else
149 exit(0);
150 return 0;
}
7.5 TUGAS
Setelah anda berhasil melakukan kompilasi program lakukan percobaan dengan langkah-
langkah berikut :