#include <stdio.h>
int main( ) {
int n, r;
printf ( "Enter number of processes: " ) ; printf ( "Enter number of resource types: " ) ;
int max[ n] [ r] , alloc[ n] [ r] , need[ n] [ r] , avail[ r] ;
int finish[ n] , i, j, k;
// Input Max matrix
printf ( "Enter Max matrix:\n " ) ; for ( i = 0 ; i < n; i++ )
for ( j = 0 ; j < r; j++ )
// Input Allocation matrix
printf ( "Enter Allocation matrix:\n " ) ; for ( i = 0 ; i < n; i++ )
for ( j = 0 ; j < r; j++ )
scanf ( "%d" , & alloc
[ i
] [ j
] ) ;
// Input Available resources
printf ( "Enter Available resources:\n " ) ; for ( j = 0 ; j < r; j++ )
// Calculate Need matrix = Max - Allocation
for ( i = 0 ; i < n; i++ )
for ( j = 0 ; j < r; j++ )
need[ i] [ j] = max[ i] [ j] - alloc[ i] [ j] ;
// Initialize all processes as not finished
for ( i = 0 ; i < n; i++ )
finish[ i] = 0 ;
int done;
do {
done = 0 ;
for ( i = 0 ; i < n; i++ ) {
if ( finish[ i] == 0 ) {
int canRun = 1 ;
for ( j = 0 ; j < r; j++ ) {
if ( need[ i] [ j] > avail[ j] ) {
canRun = 0 ;
break ;
}
}
if ( canRun) {
for ( j = 0 ; j < r; j++ )
avail[ j] += alloc[ i] [ j] ;
finish[ i] = 1 ;
done = 1 ;
}
}
}
} while ( done) ;
// Check for deadlock
int deadlock = 0 ;
for ( i = 0 ; i < n; i++ ) {
if ( finish[ i] == 0 ) {
printf ( "Process P%d is in deadlock.\n " , i
) ; deadlock = 1 ;
}
}
if ( ! deadlock)
printf ( "No deadlock detected. System is in a safe state.\n " ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgbWFpbigpIHsKICAgIGludCBuLCByOwogICAgcHJpbnRmKCJFbnRlciBudW1iZXIgb2YgcHJvY2Vzc2VzOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKICAgIHByaW50ZigiRW50ZXIgbnVtYmVyIG9mIHJlc291cmNlIHR5cGVzOiAiKTsKICAgIHNjYW5mKCIlZCIsICZyKTsKCiAgICBpbnQgbWF4W25dW3JdLCBhbGxvY1tuXVtyXSwgbmVlZFtuXVtyXSwgYXZhaWxbcl07CiAgICBpbnQgZmluaXNoW25dLCBpLCBqLCBrOwoKICAgIC8vIElucHV0IE1heCBtYXRyaXgKICAgIHByaW50ZigiRW50ZXIgTWF4IG1hdHJpeDpcbiIpOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgICBmb3IgKGogPSAwOyBqIDwgcjsgaisrKQogICAgICAgICAgICBzY2FuZigiJWQiLCAmbWF4W2ldW2pdKTsKCiAgICAvLyBJbnB1dCBBbGxvY2F0aW9uIG1hdHJpeAogICAgcHJpbnRmKCJFbnRlciBBbGxvY2F0aW9uIG1hdHJpeDpcbiIpOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgICBmb3IgKGogPSAwOyBqIDwgcjsgaisrKQogICAgICAgICAgICBzY2FuZigiJWQiLCAmYWxsb2NbaV1bal0pOwoKICAgIC8vIElucHV0IEF2YWlsYWJsZSByZXNvdXJjZXMKICAgIHByaW50ZigiRW50ZXIgQXZhaWxhYmxlIHJlc291cmNlczpcbiIpOwogICAgZm9yIChqID0gMDsgaiA8IHI7IGorKykKICAgICAgICBzY2FuZigiJWQiLCAmYXZhaWxbal0pOwoKICAgIC8vIENhbGN1bGF0ZSBOZWVkIG1hdHJpeCA9IE1heCAtIEFsbG9jYXRpb24KICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgZm9yIChqID0gMDsgaiA8IHI7IGorKykKICAgICAgICAgICAgbmVlZFtpXVtqXSA9IG1heFtpXVtqXSAtIGFsbG9jW2ldW2pdOwoKICAgIC8vIEluaXRpYWxpemUgYWxsIHByb2Nlc3NlcyBhcyBub3QgZmluaXNoZWQKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgZmluaXNoW2ldID0gMDsKCiAgICBpbnQgZG9uZTsKICAgIGRvIHsKICAgICAgICBkb25lID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChmaW5pc2hbaV0gPT0gMCkgewogICAgICAgICAgICAgICAgaW50IGNhblJ1biA9IDE7CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRbaV1bal0gPiBhdmFpbFtqXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYW5SdW4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2FuUnVuKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHI7IGorKykKICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxbal0gKz0gYWxsb2NbaV1bal07CiAgICAgICAgICAgICAgICAgICAgZmluaXNoW2ldID0gMTsKICAgICAgICAgICAgICAgICAgICBkb25lID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gd2hpbGUgKGRvbmUpOwoKICAgIC8vIENoZWNrIGZvciBkZWFkbG9jawogICAgaW50IGRlYWRsb2NrID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoZmluaXNoW2ldID09IDApIHsKICAgICAgICAgICAgcHJpbnRmKCJQcm9jZXNzIFAlZCBpcyBpbiBkZWFkbG9jay5cbiIsIGkpOwogICAgICAgICAgICBkZWFkbG9jayA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghZGVhZGxvY2spCiAgICAgICAgcHJpbnRmKCJObyBkZWFkbG9jayBkZXRlY3RlZC4gU3lzdGVtIGlzIGluIGEgc2FmZSBzdGF0ZS5cbiIpOwoKICAgIHJldHVybiAwOwp9