Banker's algorithm: Difference between revisions
→{{header|M2000 Interpreter}}: Fixed Algorithm and added two examples.
(→{{header|M2000 Interpreter}}: Fixed Algorithm and added two examples.) |
|||
Line 739:
=FromWhere(What$ + "_max")-FromWhere(What$)-Many>=0
}
\\ code for sub can be found from parent module/function (here parent as in code, not as in call)
Def Ok As Boolean=True▼
M=Each(Where)▼
While M {▼
}▼
Inventory System ▼
\\ Recource, Max, Available▼
ApplyResources(System, "A", 6, 3,"B", 5,1,"C", 7, 1, "D", 6, 2)▼
Function NewProcess {
Inventory Process
ApplyResources(Process) ' sub need more arguments and read from current stack
=Process
}
▲ Inventory System, Processes
▲ \\ Recource, Max, Available
▲ ApplyResources(System, "A", 6, 3,"B", 5,1,"C", 7, 1, "D", 6, 2)
\\ Recource, Max, Available
Append Processes, "P2":=NewProcess("A", 1, 1, "B", 2, 0, "C", 3, 3, "D", 4,3)
Append Processes, "P3":=NewProcess("A", 1, 1, "B", 3, 2, "C", 5, 1, "D", 0,0)
Line 769 ⟶ 762:
RequestResource("P3", "C", 1) ' display Safe State
Status()
\\ Second Example
Clear System, Processes
ApplyResources(System, "A", 10, 3)
Append Processes, "P1":=NewProcess("A", 9, 3)
Append Processes, "P2":=NewProcess("A", 4, 2)
Append Processes, "P3":=NewProcess("A", 7, 2)
Status(True) ' show all process, available resource and max
Print "Current Status"
RequestResource() ' display Safe State
\ Third Example
Clear System
ApplyResources(System, "A", 10, 2)
Return Processes, "P1":=NewProcess("A", 9,4)
Status(True) ' show all process, available resource and max
Print "Current Status"
RequestResource() ' display UnSafe State
Sub Respond()
If SafeState Then {
Pen 15 {Print "Safe State"}
} Else Pen 13 {Print "Unsafe State"}
Sub WaitForKey()
End Sub
Sub RequestResource(ProcessName$="" )
SafeState=True
If ProcessName$="" Then CheckNewState(&SafeState) : Respond() : Print : WaitForKey():Exit Sub
Local pro=Processes(ProcessName$), ResourceName$, many as long
ClearAllRequest(pro)
Line 793 ⟶ 805:
}
} Else Print "Too many Recources for System" : Skip=True
}
If skip Else CheckNewState(&SafeState) : Respond()
Print ' just a new line
End Sub
Sub ApplyResources(Where as Inventory, What$, MaxValue, InitialValue)
Line 811 ⟶ 825:
If Instr(Eval$(M, M^),"_")=0 Then {
Return Where, Eval$(M,M^)+"_Request":=0
▲ }
}▼
While M {▼
If Instr(Eval$(M, M^),"_")=0 Then {▼
}
}
Line 826 ⟶ 832:
While M {
If Instr(Eval$(M, M^),"_")=0 Then Print Eval$(M, M^)+"="+Eval$(M),
}▼
}
Print
Line 848 ⟶ 847:
Print "Available Resources in System"
PrintResources(System)
If Not Ok Then WaitForKey(): Exit Sub
Local M=Each(Processes)
While M {
Line 858 ⟶ 857:
End Sub
Sub CheckNewState(&Ok)
local M=Each(Processes), M1, count=len(Processes), alive(0 to count-1)=1
Local Z, Recource$, safe as boolean=false
▲ }
Recource$=Eval$(M1, M1^)
If Instr(Recource$,"_")=0 Then {
Return System, Recource$+"_Request":= System(Recource$+"_Request") + Z(Recource$) + Z(Recource$+"_Request")
Return Z, Recource$+"_Request":=0
}
▲ }
}
}
▲ M1=Each(Z)
▲ While M1 {
▲ Recource$=Eval$(M1, M1^)
▲ If Instr(Recource$,"_")=0 Then {
▲ Return System, Recource$+"_Request":= System(Recource$+"_Request") + Z(Recource$) + Z(Recource$+"_Request")
▲ Return Z, Recource$+"_Request":=0
▲ }
▲ }
▲ } Else ClearAllRequest(Z)
}
ClearAllRequest(System)
End Sub
}
BankerAlgo</lang>
=={{header|Phix}}==
|