Laurent Esnault, VP de Engenharia, explica a diferença entre processos cooperativos e preventivos durante a sua Sessão de Intervalo sobre Preemptive Multi-threading na Cimeira 4D de 2016. Graças à Preemptive Multi-threading, é possível ter mais processos paralelos, e assim adicionar cada vez mais utilizadores, quer para aplicações desktop, quer para aplicações web.
Se perdeu a sessão de Laurent na Cimeira 4D de 2016, veja este vídeo e desfrute de alguma formação pessoal pelo mestre da multi-tarefa preventiva!
Diferença entre cooperativo e preemptivo
Então o que é cooperativo e o que é preventivo?
O modo cooperativo é geralmente o que está a usar hoje com os seus processos 4D. Cooperativo significa que os processos 4D cooperam (trabalham em conjunto) para partilhar um único CPU. Por vezes cooperam explicitamente, como quando se usa o comando IDLE, e por vezes cooperam implicitamente, como quando se usa a maior parte de qualquer outro comando de linguagem 4D. Isto porque, internamente, o 4D usa o comando IDLE para dar o CPU a outro processo. Como consequência, apenas um núcleo de CPU pode ser utilizado de cada vez.
É claro que todos conhecem os processos 4D que estão a utilizar actualmente. E parece natural utilizar esses processos para aceder à interface do utilizador. Pode abrir uma janela, mostrar um diálogo ou um formulário, etc. Mas na verdade, não é de todo natural para um sistema operativo. A maioria dos sistemas operativos proíbe o acesso à interface de utilizador a partir de qualquer outro fio que não seja o fio principal. Mas para processos cooperativos, 4D gere internamente o acesso à interface de utilizador…mesmo num fio secundário.
No modo preventivo, não é necessário chamar o comando IDLE, porque os processos 4D não precisam de cooperar para partilhar o CPU: é feito pelo sistema operativo. O sistema operativo dá preemptivamente o CPU a um ou outro fio. Assim, se tiver várias CPUs na sua máquina, então várias linhas podem ser executadas ao mesmo tempo. Portanto, a vantagem é que pode utilizar todos os núcleos da sua máquina. Mas a partir de um fio preemptivo, não pode aceder à interface do utilizador.
Pode ver como no modo cooperativo, os processos são executados sequencialmente, um após o outro e utilizando apenas uma única CPU, enquanto que no modo preventivo, o sistema operativo despacha os dois processos em todas as CPUs (no exemplo mostrado, tanto a CPU 1 como a CPU 2).
O benefício é óbvio. O tempo de execução global é menor em modo preventivo quando se tem duas CPUs. Mesmo que o tempo de execução de cada processo individual seja o mesmo. A programação preventiva não resulta em ganho de desempenho no tempo de execução de um processo. É o tempo de execução global de múltiplas tarefas, em execução em múltiplos processos, que será reduzido.
Demonstração
Aqui está uma demonstração muito simples. Cada botão cria quatro processos individuais.
O primeiro botão está a criar quatro processos cooperativos para fazer alguns cálculos sem sentido (estritamente para fins de demonstração). O tempo de execução global é de 643 ticks e o tempo de execução de cada processo individual é de cerca de 150 ticks. Assim, basicamente, o tempo de execução global é apenas a adição dos quatro tempos de execução individuais.
Se fizermos exactamente o mesmo cálculo em quatro tempos de execução preventiva, verá que o tempo de execução dos processos individuais é aproximadamente o mesmo (150 ticks), no entanto, o tempo de execução global é QUATRO TEMPOS mais curto.
Descubra a base de dados de exemplo utilizada para a demonstração e explicações complementares no post da Vanessa sobre os processos preventivos.