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)
Function AllProcessEnd(Where as Inventory) {
Def Ok As Boolean=True
M=Each(Where)
While M {
If Instr(Eval$(M, M^),"_")=0 Then Ok = Ok And Where(Eval$(M, M^)+"_max")=Where(Eval$(M, M^)+"_Request")
}
=Ok
}
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
InventoryAppend Processes =, "P1":=NewProcess("A", 3, 1, "B", 3, 2, "C", 2, 2, "D", 2,1)
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"}
End }Sub
Sub WaitForKey()
Pen 11 {Print "Press a key"}
Whilelocal M {a$=key$
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 Then }exit
}
If skip Else CheckNewState(&SafeState) : Respond()
Print ' just a new line
M=EachWaitForKey(Where)
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
}
}
End Sub
Sub SetAllRequest(Where as Inventory)
Local M=Each(Where)
While M {
If Instr(Eval$(M, M^),"_")=0 Then {
Return Where, Eval$(M,M^)+"_Request":=Where(Eval$(M,M^))+Where(Eval$(M,M^)+"_Request")
}
}
Line 826 ⟶ 832:
While M {
If Instr(Eval$(M, M^),"_")=0 Then Print Eval$(M, M^)+"="+Eval$(M),
}
Print
Exit Sub
Sub PrintEstimatedResources(Where as Inventory)
Local M=Each(Where)
While M {
If Instr(Eval$(M, M^),"_")=0 Then Print Eval$(M, M^)+"="+Str$(Where(Eval$(M, M^)+"_Request"),""),
}
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
SetAllRequest(System)While count {
While M { safe=false
Z=Processes(While M^!) {
M1=Each If alive(ZM^) Then {
Ok=True Z=Processes(M^!)
While M1=Each(Z) {
Recource$ safe=Eval$(M1,True M1^)
If Instr(Recource$,"_")=0 Then While M1 {
Ok=Ok And RequestPreset(System, Recource$, Z(Recource$ + "_max") - Z(Recource$)-Z=Eval$(Recource$ +M1, "_Request")M1^)
If Instr(EvalRecource$(M, M^),"_")=0 Then {
Return System, safe=System(Recource$)+System(Recource$+"_Request":) >= SystemZ(Recource$ + "_Request_max") +- Z(Recource$) + -Z(Recource$ + "_Request")
Def Ok As Boolean=True}
If Instr(Recource$,"_")=0not safe Then {exit
}
}If safe Then {
Returnprint Z, Recourceformat$+("_Request":=Process {0} is executing", M^+1)
M1=Each alive(ZM^) =0
While M1 { count--
Recource$=Eval$(M1, M1^=Each(Z)
While MM1 {
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) }
}
}
}
}
ifIf Oksafe thenElse {exit
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)
}
If Ok Then Ok=AllProcessEnd(System)safe
ClearAllRequest(System)
End Sub
}
BankerAlgo</lang>
</lang>
 
=={{header|Phix}}==
404

edits