#include <stdio.h>
#include <stdbool.h>
#define MAX_PROCESSES 10
#define MAX_RESOURCES 10
int n, m;
int Available[ MAX_RESOURCES] ;
int Max[ MAX_PROCESSES] [ MAX_RESOURCES] ;
int Allocation[ MAX_PROCESSES] [ MAX_RESOURCES] ;
int Need[ MAX_PROCESSES] [ MAX_RESOURCES] ;
void calculateNeed( ) {
for ( int i = 0 ; i < n; i++ )
for ( int j = 0 ; j < m; j++ )
Need[ i] [ j] = Max[ i] [ j] - Allocation[ i] [ j] ;
}
bool isSafe( ) {
int Work[ MAX_RESOURCES] ;
bool Finish[ MAX_PROCESSES] ;
int safeSequence[ MAX_PROCESSES] ;
int count = 0 ;
for ( int j = 0 ; j < m; j++ )
Work[ j] = Available[ j] ;
for ( int i = 0 ; i < n; i++ )
Finish[ i] = false ;
while ( count < n) {
bool found = false ;
for ( int i = 0 ; i < n; i++ ) {
if ( ! Finish[ i] ) {
bool canAllocate = true ;
for ( int j = 0 ; j < m; j++ ) {
if ( Need[ i] [ j] > Work[ j] ) {
canAllocate = false ;
break ;
}
}
if ( canAllocate) {
for ( int j = 0 ; j < m; j++ )
Work[ j] += Allocation[ i] [ j] ;
safeSequence[ count] = i;
Finish[ i] = true ;
count++;
found = true ;
}
}
}
if ( ! found) {
printf ( "System is not in a safe state.\n " ) ; return false ;
}
}
printf ( "System is in a safe state.\n Safe sequence: " ) ; for ( int i = 0 ; i < n; i++ )
printf ( "P%d " , safeSequence
[ i
] ) ; return true ;
}
void requestResources( int process, int Request[ ] ) {
for ( int j = 0 ; j < m; j++ ) {
if ( Request[ j] > Need[ process] [ j] ) {
printf ( "Error: Request exceeds maximum need for process P%d.\n " , process
) ; return ;
}
}
for ( int j = 0 ; j < m; j++ ) {
if ( Request[ j] > Available[ j] ) {
printf ( "Resources not available. Process P%d must wait.\n " , process
) ; return ;
}
}
for ( int j = 0 ; j < m; j++ ) {
Available[ j] -= Request[ j] ;
Allocation[ process] [ j] += Request[ j] ;
Need[ process] [ j] -= Request[ j] ;
}
if ( isSafe( ) ) {
printf ( "Request granted for process P%d.\n " , process
) ; } else {
for ( int j = 0 ; j < m; j++ ) {
Available[ j] += Request[ j] ;
Allocation[ process] [ j] -= Request[ j] ;
Need[ process] [ j] += Request[ j] ;
}
printf ( "Request denied for process P%d. System would be unsafe.\n " , process
) ; }
}
int main( ) {
printf ( "Enter number of processes: " ) ; printf ( "Enter number of resource types: " ) ;
printf ( "Enter Available resources (for %d resource types):\n " , m
) ; for ( int j = 0 ; j < m; j++ ) {
scanf ( "%d" , & Available
[ j
] ) ; }
printf ( "Enter Max matrix (%d processes x %d resources):\n " , n
, m
) ; for ( int i = 0 ; i < n; i++ )
for ( int j = 0 ; j < m; j++ ) {
printf ( "Max[P%d][R%d]: " , i
, j
) ; }
printf ( "Enter Allocation matrix (%d processes x %d resources):\n " , n
, m
) ; for ( int i = 0 ; i < n; i++ )
for ( int j = 0 ; j < m; j++ ) {
printf ( "Allocation[P%d][R%d]: " , i
, j
) ; scanf ( "%d" , & Allocation
[ i
] [ j
] ) ; }
calculateNeed( ) ;
for ( int i = 0 ; i < n; i++ ) {
for ( int j = 0 ; j < m; j++ )
}
printf ( "\n Allocation Matrix:\n " ) ; for ( int i = 0 ; i < n; i++ ) {
for ( int j = 0 ; j < m; j++ )
printf ( "%d " , Allocation
[ i
] [ j
] ) ; }
for ( int i = 0 ; i < n; i++ ) {
for ( int j = 0 ; j < m; j++ )
}
printf ( "\n Available Resources: " ) ; for ( int j = 0 ; j < m; j++ )
isSafe( ) ;
int process;
printf ( "\n Enter process number for resource request (0 to %d): " , n
- 1 ) ; int Request[ MAX_RESOURCES] ;
printf ( "Enter Request vector for P%d (for %d resources):\n " , process
, m
) ; for ( int j = 0 ; j < m; j++ ) {
scanf ( "%d" , & Request
[ j
] ) ; }
requestResources( process, Request) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CgojZGVmaW5lIE1BWF9QUk9DRVNTRVMgMTAKI2RlZmluZSBNQVhfUkVTT1VSQ0VTIDEwCgppbnQgbiwgbTsKaW50IEF2YWlsYWJsZVtNQVhfUkVTT1VSQ0VTXTsKaW50IE1heFtNQVhfUFJPQ0VTU0VTXVtNQVhfUkVTT1VSQ0VTXTsKaW50IEFsbG9jYXRpb25bTUFYX1BST0NFU1NFU11bTUFYX1JFU09VUkNFU107CmludCBOZWVkW01BWF9QUk9DRVNTRVNdW01BWF9SRVNPVVJDRVNdOwoKdm9pZCBjYWxjdWxhdGVOZWVkKCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCiAgICAgICAgICAgIE5lZWRbaV1bal0gPSBNYXhbaV1bal0gLSBBbGxvY2F0aW9uW2ldW2pdOwp9Cgpib29sIGlzU2FmZSgpIHsKICAgIGludCBXb3JrW01BWF9SRVNPVVJDRVNdOwogICAgYm9vbCBGaW5pc2hbTUFYX1BST0NFU1NFU107CiAgICBpbnQgc2FmZVNlcXVlbmNlW01BWF9QUk9DRVNTRVNdOwogICAgaW50IGNvdW50ID0gMDsKCiAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKICAgICAgICBXb3JrW2pdID0gQXZhaWxhYmxlW2pdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgRmluaXNoW2ldID0gZmFsc2U7CgogICAgd2hpbGUgKGNvdW50IDwgbikgewogICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBpZiAoIUZpbmlzaFtpXSkgewogICAgICAgICAgICAgICAgYm9vbCBjYW5BbGxvY2F0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgICAgICAgICAgICAgIGlmIChOZWVkW2ldW2pdID4gV29ya1tqXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYW5BbGxvY2F0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2FuQWxsb2NhdGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKICAgICAgICAgICAgICAgICAgICAgICAgV29ya1tqXSArPSBBbGxvY2F0aW9uW2ldW2pdOwogICAgICAgICAgICAgICAgICAgIHNhZmVTZXF1ZW5jZVtjb3VudF0gPSBpOwogICAgICAgICAgICAgICAgICAgIEZpbmlzaFtpXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICBwcmludGYoIlN5c3RlbSBpcyBub3QgaW4gYSBzYWZlIHN0YXRlLlxuIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcHJpbnRmKCJTeXN0ZW0gaXMgaW4gYSBzYWZlIHN0YXRlLlxuU2FmZSBzZXF1ZW5jZTogIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICBwcmludGYoIlAlZCAiLCBzYWZlU2VxdWVuY2VbaV0pOwogICAgcHJpbnRmKCJcbiIpOwogICAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgcmVxdWVzdFJlc291cmNlcyhpbnQgcHJvY2VzcywgaW50IFJlcXVlc3RbXSkgewogICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICBpZiAoUmVxdWVzdFtqXSA+IE5lZWRbcHJvY2Vzc11bal0pIHsKICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogUmVxdWVzdCBleGNlZWRzIG1heGltdW0gbmVlZCBmb3IgcHJvY2VzcyBQJWQuXG4iLCBwcm9jZXNzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgIGlmIChSZXF1ZXN0W2pdID4gQXZhaWxhYmxlW2pdKSB7CiAgICAgICAgICAgIHByaW50ZigiUmVzb3VyY2VzIG5vdCBhdmFpbGFibGUuIFByb2Nlc3MgUCVkIG11c3Qgd2FpdC5cbiIsIHByb2Nlc3MpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICAgQXZhaWxhYmxlW2pdIC09IFJlcXVlc3Rbal07CiAgICAgICAgQWxsb2NhdGlvbltwcm9jZXNzXVtqXSArPSBSZXF1ZXN0W2pdOwogICAgICAgIE5lZWRbcHJvY2Vzc11bal0gLT0gUmVxdWVzdFtqXTsKICAgIH0KCiAgICBpZiAoaXNTYWZlKCkpIHsKICAgICAgICBwcmludGYoIlJlcXVlc3QgZ3JhbnRlZCBmb3IgcHJvY2VzcyBQJWQuXG4iLCBwcm9jZXNzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICAgICAgQXZhaWxhYmxlW2pdICs9IFJlcXVlc3Rbal07CiAgICAgICAgICAgIEFsbG9jYXRpb25bcHJvY2Vzc11bal0gLT0gUmVxdWVzdFtqXTsKICAgICAgICAgICAgTmVlZFtwcm9jZXNzXVtqXSArPSBSZXF1ZXN0W2pdOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlJlcXVlc3QgZGVuaWVkIGZvciBwcm9jZXNzIFAlZC4gU3lzdGVtIHdvdWxkIGJlIHVuc2FmZS5cbiIsIHByb2Nlc3MpOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIHByaW50ZigiRW50ZXIgbnVtYmVyIG9mIHByb2Nlc3NlczogIik7CiAgICBzY2FuZigiJWQiLCAmbik7CiAgICBwcmludGYoIkVudGVyIG51bWJlciBvZiByZXNvdXJjZSB0eXBlczogIik7CiAgICBzY2FuZigiJWQiLCAmbSk7CgogICAgcHJpbnRmKCJFbnRlciBBdmFpbGFibGUgcmVzb3VyY2VzIChmb3IgJWQgcmVzb3VyY2UgdHlwZXMpOlxuIiwgbSk7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgIHByaW50ZigiUmVzb3VyY2UgJWQ6ICIsIGopOwogICAgICAgIHNjYW5mKCIlZCIsICZBdmFpbGFibGVbal0pOwogICAgfQoKICAgIHByaW50ZigiRW50ZXIgTWF4IG1hdHJpeCAoJWQgcHJvY2Vzc2VzIHggJWQgcmVzb3VyY2VzKTpcbiIsIG4sIG0pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICAgICAgcHJpbnRmKCJNYXhbUCVkXVtSJWRdOiAiLCBpLCBqKTsKICAgICAgICAgICAgc2NhbmYoIiVkIiwgJk1heFtpXVtqXSk7CiAgICAgICAgfQoKICAgIHByaW50ZigiRW50ZXIgQWxsb2NhdGlvbiBtYXRyaXggKCVkIHByb2Nlc3NlcyB4ICVkIHJlc291cmNlcyk6XG4iLCBuLCBtKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7CiAgICAgICAgICAgIHByaW50ZigiQWxsb2NhdGlvbltQJWRdW1IlZF06ICIsIGksIGopOwogICAgICAgICAgICBzY2FuZigiJWQiLCAmQWxsb2NhdGlvbltpXVtqXSk7CiAgICAgICAgfQoKICAgIGNhbGN1bGF0ZU5lZWQoKTsKCiAgICBwcmludGYoIlxuTWF4IE1hdHJpeDpcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBNYXhbaV1bal0pOwogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KCiAgICBwcmludGYoIlxuQWxsb2NhdGlvbiBNYXRyaXg6XG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCiAgICAgICAgICAgIHByaW50ZigiJWQgIiwgQWxsb2NhdGlvbltpXVtqXSk7CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQoKICAgIHByaW50ZigiXG5OZWVkIE1hdHJpeDpcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykKICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBOZWVkW2ldW2pdKTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CgogICAgcHJpbnRmKCJcbkF2YWlsYWJsZSBSZXNvdXJjZXM6ICIpOwogICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspCiAgICAgICAgcHJpbnRmKCIlZCAiLCBBdmFpbGFibGVbal0pOwogICAgcHJpbnRmKCJcbiIpOwoKICAgIGlzU2FmZSgpOwoKICAgIGludCBwcm9jZXNzOwogICAgcHJpbnRmKCJcbkVudGVyIHByb2Nlc3MgbnVtYmVyIGZvciByZXNvdXJjZSByZXF1ZXN0ICgwIHRvICVkKTogIiwgbiAtIDEpOwogICAgc2NhbmYoIiVkIiwgJnByb2Nlc3MpOwogICAgaW50IFJlcXVlc3RbTUFYX1JFU09VUkNFU107CiAgICBwcmludGYoIkVudGVyIFJlcXVlc3QgdmVjdG9yIGZvciBQJWQgKGZvciAlZCByZXNvdXJjZXMpOlxuIiwgcHJvY2VzcywgbSk7CiAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgIHByaW50ZigiUmVxdWVzdFtSJWRdOiAiLCBqKTsKICAgICAgICBzY2FuZigiJWQiLCAmUmVxdWVzdFtqXSk7CiAgICB9CgogICAgcmVxdWVzdFJlc291cmNlcyhwcm9jZXNzLCBSZXF1ZXN0KTsKCiAgICByZXR1cm4gMDsKfQ==