La differenza tra cooperativo e preventivo spiegata da Laurent Esnault al 4D Summit 2016

Tradotto automaticamente da Deepl

Laurent Esnault, VP of Engineering, spiega la differenza tra processi cooperativi e preemptive durante la sua Break Out Session sul Preemptive Multi-threading al 4D Summit 2016. Grazie al Preemptive Multi-threading, è possibile avere più processi paralleli e quindi aggiungere sempre più utenti, sia per le applicazioni desktop che per quelle web.

Se vi siete persi la sessione di Laurent al 4D Summit 2016, guardate questo video e godetevi un po’ di formazione personale da parte del maestro del multi-threading preemptive!

Differenza tra cooperativo e preemptive

Che cos’è la modalità cooperativa e che cos’è la modalità preemptive?

La modalità cooperativa è generalmente quella che utilizzate oggi con i vostri processi 4D. Cooperativa significa che i processi 4D cooperano (lavorano insieme) per condividere una singola CPU. A volte cooperano esplicitamente, come quando si usa il comando IDLE, e a volte cooperano implicitamente, come quando si usa la maggior parte degli altri comandi del linguaggio 4D. Questo perché, internamente, 4D utilizza il comando IDLE per assegnare la CPU a un altro processo. Di conseguenza, è possibile utilizzare un solo core della CPU alla volta.

Naturalmente, tutti voi conoscete i processi 4D che state utilizzando oggi. Sembra naturale utilizzare questi processi per accedere all’interfaccia utente. È possibile aprire una finestra, visualizzare una finestra di dialogo o un modulo, ecc. Ma in realtà non è affatto naturale per un sistema operativo. La maggior parte dei sistemi operativi proibisce l’accesso all’interfaccia utente da qualsiasi thread diverso da quello principale. Ma per i processi cooperativi, 4D gestisce internamente l’accesso all’interfaccia utente… anche in un thread secondario.

In modalità preemptive, non è necessario chiamare il comando IDLE, perché i processi 4D non hanno bisogno di cooperare per condividere la CPU: ci pensa il sistema operativo. Il sistema operativo assegna preventivamente la CPU a un thread o a un altro. Pertanto, se la macchina dispone di più CPU, è possibile eseguire più thread contemporaneamente. Il vantaggio è quindi quello di poter utilizzare tutti i core della macchina. Ma da un thread preemptive non è possibile accedere all’interfaccia utente.

blank

Si può notare come in modalità cooperativa i processi vengano eseguiti in sequenza, uno dopo l’altro e utilizzando una sola CPU, mentre in modalità preemptive il sistema operativo distribuisce i due processi su tutte le CPU (nell’esempio mostrato, sia la CPU 1 che la CPU 2).

Il vantaggio è evidente. Il tempo di esecuzione globale è più breve in modalità preemptive quando ci sono due CPU. Anche se il tempo di esecuzione di ogni singolo processo è lo stesso. La pianificazione preventiva non comporta un aumento delle prestazioni nel tempo di esecuzione di un processo. È il tempo di esecuzione globale di più task, eseguiti in più processi, a ridursi.

Dimostrazione

Ecco una dimostrazione molto semplice. Ogni pulsante crea quattro processi individuali.

blank

Il primo pulsante crea quattro processi cooperativi per eseguire alcuni calcoli senza senso (a scopo strettamente dimostrativo). Il tempo di esecuzione globale è di 643 ticks e il tempo di esecuzione di ogni singolo processo è di circa 150 ticks. In pratica, il tempo di esecuzione globale è solo la somma dei quattro tempi di esecuzione individuali.

Se eseguiamo lo stesso calcolo in quattro thread preemptive, vedrete che il tempo di esecuzione dei singoli processi è più o meno lo stesso (150 tick), ma il tempo di esecuzione globale è QUATTRO VOLTE più breve.

Scoprite il database di esempio utilizzato per la dimostrazione e le spiegazioni complementari nel post di Vanessa sui processi preemptive.