La biforcazione ricorsiva è considerata un anti-modello?

6

Sto iniziando a armeggiare con il processo di forking, solo per averne un'idea. Ho pensato di scrivere un esempio in cui il lavoro è distribuito tra i processi figli e i risultati restituiti al genitore; in questo modo, potrebbe essere eseguito in parallelo su diversi processori.

Nel mio primo tentativo, sto biforcando in un ciclo, il che significa che ogni volta, tutti i processi esistenti (l'originale, i bambini, i nipoti, ecc.) producono un altro fork.

Questo mi sta causando problemi (consumo di memoria, crescita rapida del numero di processi, tracciamento dei tubi per riportare i dati sulla catena, ecc.) e mi chiedo se sono inciampato in un anti- modello. I potrebbe semplicemente posizionare N figli direttamente dal genitore.

Mi rendo conto che è comune eseguire fork ed exec più volte; per esempio, terminal forchetta una shell e la shell forca un editor. Ma è considerata una cattiva pratica dare una forchetta "ricorsivamente" quando i bambini sono tutti dello stesso tipo?

    
posta Nathan Long 24.12.2011 - 17:30
fonte

2 risposte

7

Il biforcazione incontrollato è decisamente un anti-modello. Come hai scoperto, è relativamente facile consumare tutte le risorse disponibili e poi continuare a consumarle fino al punto in cui tutto macina fino all'arresto completo.

Chiedi al apprendista stregone .

Come ogni problema che riguarda la ricorsione, devi capire chiaramente le tue condizioni di chiusura. Se il tuo algoritmo potenzialmente non termina mai, la ricorsione è completamente inadatta poiché non hai il controllo di quanto può essere profondo lo stack.

Naturalmente, alcune attività potrebbero "scoprire" altre attività, quindi potrebbe anche non essere mai possibile avviare tutto direttamente dal processo principale.

Una strategia spesso utilizzata per semplificare una soluzione consiste nel creare un qualche tipo di processo del task manager e farlo consumare una coda di attività in sospeso. L'attività principale, o qualsiasi bambino, può aggiungere compiti alla coda man mano che li trovano. Il task manager quindi esegue il numero di processi necessari per elaborare le attività.

In questo modo, il task manager può tenere un conteggio del numero totale di processi in esecuzione e lanciare un nuovo processo solo se lo ritiene necessario e l'hardware può farcela.

Esiste il rischio di bloccare con questo, ovviamente: alcune attività richiedono il risultato di un'altra attività prima che possa continuare, eppure quell'altra attività è in coda e non verrà mai eseguita perché tutte le attività in esecuzione stanno bloccando l'attesa per attività che non sono ancora state avviate ...

È possibile risolvere questo problema con attività separate il cui compito è quello di consumare risultati e gestirli attraverso un task manager separato. In questo modo, i calcoli non possono mai essere completamente bloccati: qualcosa farà sempre progressi.

    
risposta data 25.12.2011 - 11:32
fonte
0

Se si desidera distribuire più processi, l'obiettivo è ridurre al minimo il tempo di elaborazione. È necessario definire cosa si vuole minimizzare. Di solito si tratta di un vicino più prossimo o di una funzione geometrica o di una funzione 2d f (x) = y. Una ricorsione non è una funzione del genere, ma per esempio è possibile esaminare un codice in grigio per attraversare una funzione f (x) = y. Può aiutarti a fare la differenza tra il bit di sinistra e quello di destra.

    
risposta data 25.12.2011 - 10:49
fonte

Leggi altre domande sui tag