Categorias de programas de computador
- 6 minutos
Um programa de computador incorpora um algoritmo computacional e inclui declarações de variáveis, atribuições de variáveis, expressões e instruções de controle de fluxo, que normalmente são expressas em uma linguagem de programação de alto nível, como Java ou C++. Antes da execução, os programas normalmente são compilados e convertidos em instruções de computador/código que uma CPU (unidade de processamento central) pode executar sequencial ou simultaneamente. Um programa sequencial é executado na ordem programada (ou seja, na sequência de instruções original, especificada pelo programador).
Um programa simultâneo, por outro lado, é um conjunto de programas sequenciais que, durante a execução, compartilham uma ou mais CPUs ao mesmo tempo. Esse compartilhamento de tempo permite que vários programas alternem o uso de um recurso computacional. Por exemplo, considerando que uma CPU pode executar apenas um programa por vez, executar vários programas sequenciais em um processador exige que o SO (sistema operacional) empregue uma estratégia de agendamento, como round robin, para alocar o recurso a cada programa durante um intervalo especificado.

Figura 1: nossa taxonomia de programas
O termo geral aplicativo se refere, muitas vezes de maneira ambígua, tanto aos programas sequenciais quanto aos simultâneos, sendo os últimos, às vezes, chamados de programas paralelos. Um programa paralelo é um conjunto de programas sequenciais que se sobrepõem no tempo, sendo executados em CPUs separadas. Em sistemas multiprocessadores, como computadores com vários núcleos de chips, programas sequenciais relacionados em execução em núcleos diferentes constituem um programa paralelo. Por outro lado, programas sequenciais relacionados que compartilham apenas uma CPU no tempo representam um programa simultâneo. Para esta unidade, diferenciamos ainda mais um programa paralelo composto por vários programas sequenciais executados em computadores em rede distintos (em vez de núcleos diferentes em um computador) como um programa distribuído. A figura anterior ilustra essa taxonomia de programa.
Outro termo comum na programação paralela/distribuída é multitarefa, que se refere à sobreposição da computação de um programa com a de outro. Esse conceito é central para todos os sistemas operacionais modernos e descreve um mecanismo de agendamento que permite que um SO manipule vários programas ao mesmo tempo. O trabalho multitarefa se tornou tão útil que atualmente quase todas as linguagens de programação modernas dão suporte a ele por meio de constructos de multithreading.
O termo "thread" foi popularizado pelos Pthreads (threads POSIX)1, que são uma especificação de constructos de simultaneidade que foi amplamente adotada, especialmente em sistemas UNIX.2 Um thread de execução é a menor sequência de instruções que um SO pode gerenciar com seu agendador. Os threads estão intimamente relacionados com os processos: um thread é executado dentro do espaço de endereço de um processo, enquanto um processo é executado no próprio espaço de endereço. Sendo assim, um processo pode conter um ou mais threads e os threads não são unidades de trabalho autônomas. Em princípio, processos diferentes não compartilham memória, enquanto os threads dentro de um processo compartilham o espaço de endereço do pai.
Tarefa é outro termo que se refere a uma pequena unidade de trabalho e, nesta unidade, a usamos para significar "processo". Além disso, denotamos coletivamente tarefas (possivelmente apenas uma) que pertencem ao mesmo programa/aplicativo como um trabalho. Um aplicativo pode conter vários trabalhos. Por exemplo, um aplicativo de dinâmica de fluidos normalmente é composto por três trabalhos, que individualmente são responsáveis pelas análises estrutural, fluida e térmica. Além disso, cada trabalho pode realizar seu trabalho por meio de várias tarefas. A figura a seguir demonstra os conceitos de processos, threads, tarefas, trabalhos e aplicativos.

Figura 2: uma demonstração dos conceitos de processos, threads, tarefas, trabalhos e aplicativos
Referências
- Barney, Blaise (última atualização em 07/2019). Programação de threads POSIX Lawrence Livermore National Laboratory
- M. Ben-Ari (6 de março de 2006). Princípios da programação concorrente e distribuída Addison-Wesley