Banker's algorithm: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Perl 6}}: curly out of place) |
SqrtNegInf (talk | contribs) m (→{{header|Perl 6}}: replace loop/last, further tidying) |
||
Line 964: | Line 964: | ||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
⚫ | |||
<lang perl6># Reference: |
|||
[https://www.geeksforgeeks.org/program-bankers-algorithm-set-1-safety-algorithm/ here] |
|||
⚫ | |||
⚫ | |||
⚫ | |||
my |
my @allot = <1 2 2 1>, <1 0 3 3>, <1 2 1 0>; # Resources allocated to processes |
||
my \R = 4 ; # Number of resources |
|||
⚫ | |||
⚫ | |||
my @allot = <1 2 2 1>, <1 0 3 3>, <1 2 1 0>; # Resources allocated to processes |
|||
# Function to find the system is in safe state or not |
# Function to find the system is in safe state or not |
||
sub isSafe(\ |
sub isSafe(\work is copy, \maxm, \allot) { |
||
my |
my \P = allot.elems; # Number of processes |
||
my |
my \R = work.elems; # Number of resources |
||
my |
my \need = maxm »-« allot; # the need matrix |
||
my @ |
my @unfinished = True xx P; # Mark all processes as unfinished |
||
my @safe-sequence; |
|||
# While all processes are not finished |
# While all processes are not finished or system is not in safe state |
||
my $count = 0; |
my $count = 0; |
||
while $count < P { |
while $count < P { |
||
# can be satisfied with current @work resources. |
|||
my $found = False; |
my $found = False; |
||
for ^P -> \p { |
for ^P -> \p { |
||
# |
# Check if process now can be finished |
||
if @ |
if @unfinished[p] and all need[p] »≤« work { |
||
work »+=« allot[p;^R]; # Free the resources |
|||
say 'available resources: ' ~ work; |
|||
@safe-sequence.push: p; # Add this process to safe sequence |
|||
@unfinished[p] = False; # Mark this process as finished |
|||
$count += 1; |
|||
$found = True |
|||
if $satisfied == R - 1 { # If all needs of p were satisfied. |
|||
@work »+=« allot[p;^R]; # Free the resources |
|||
@safeSeq[$count] = p; # Add this process to safe sequence. |
|||
@finish[p] = 1; # Mark this p as finished |
|||
$count += 1; |
|||
$found = True |
|||
} |
|||
} |
} |
||
} |
} |
||
# If we could not find a next process in safe sequence |
# If we could not find a next process in safe sequence |
||
return False, "System is not in safe state." unless $found; |
return False, "System is not in safe state." unless $found; |
||
} |
} |
||
# If system is in safe state then safe sequence will be as below |
# If system is in safe state then safe sequence will be as below |
||
return True, "Safe sequence is: " ~ @ |
return True, "Safe sequence is: " ~ @safe-sequence |
||
} |
} |
||
# Check system is in safe state |
# Check if system is in a safe state |
||
my ($safe-state,$status-message) = isSafe @avail, @maxm, @allot; |
my ($safe-state,$status-message) = isSafe @avail, @maxm, @allot; |
||
say "Safe state? $safe-state"; |
say "Safe state? $safe-state"; |
||
say "Message: $status-message";</lang> |
say "Message: $status-message";</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre>available resources: 4 3 3 3 |
||
available resources: 5 3 6 6 |
|||
available resources: 6 5 7 6 |
|||
Safe state? True |
|||
Message: Safe sequence is: 0 1 2</pre> |
Message: Safe sequence is: 0 1 2</pre> |
||