Esercizio fork-join

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.

Grafo delle precedenze

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