Trova il valore di p sapendo che ogni funzione deve/può calcolare solo una operazione algebrica alla volta
p = 2*(3 + 2) + (7 – 4) + [(2*3)*(5-1)] = 37
p = x + y + z
Cominciamo col disegnare il diagramma delle precedenze, tenendo conto del fattore operazione singola e della necessità di eseguire in parallelo più operazioni possibili.
Possiamo quindi passare al codice. Di regola teniamo presente che il ramo di destra di una biforcazione rappresenta sempre il figlio o il figlio relativo di una fork.
import os
import sys
'''
Trova il valore di p sapende che ogni funzione deve/può calcolare solo una operazione alla vota
p = 2*(3 + 2) + (7 - 4) - [(2*3)*(5-1)] = 37
p = x + y - z
'''
def calcolax():
x = 3 + 2
return x
def calcolay():
y = 7 - 4
return y
def calcolaz1():
z1 = 2 * 3
return z1
def calcolaz2():
z2 = 5 - 1
return z2
if __name__ == "__main__":
pid = os.fork()
if pid == 0:
print ("Sono il processo figlio Mio padre è ", os.getppid(),"Il mio pid figlio è ", os.getpid())
y = calcolay()
print (y)
os._exit(y)
else:
pid2= os.fork()
if pid2 == 0:
print ("sono il secondo figlio Mio padre è ", os.getppid(),"Il mio pid figlio è ", os.getpid())
'''
qui dovrei calcolare la z ma si può dividere
in due sottoprocessi z1 e z2
'''
pid3= os.fork()
if pid3 == 0:
print ("sono il lio Mio padre è ", os.getppid(),"Il mio pid figlio è ", os.getpid())
z2 = calcolaz2()
os._exit(z2)
else:
z1 = calcolaz1()
pid3,status = os.waitpid(pid3,0)
z2 = os.WEXITSTATUS(status)
z = z1*z2
os._exit(z)
else:
print ("Sono ancora il processo padre Il mio pid è ", os.getpid())
x = calcolax()
x = 2*x
'''
Devo introdurre la funzione che ricongiunge i tre rami padre/figli
e si chiama join
'''
pid,status = os.waitpid(pid,0)
y = os.WEXITSTATUS(status)
print (y)
pid2,status = os.waitpid(pid2,0)
z = os.WEXITSTATUS(status)
p = x + y + z
print ("p= ", p)
Ultima modifica 14 Gennaio 2022