Article image

MC

Maria Castro06/04/2026 15:05
Share

Da Computação Sequencial ao Paralelismo: A Evolução do Processamento de Dados

    Iniciamos a análise do contexto histórico da computação no início do século XX, com máquinas de programação fixa projetadas para executar funções específicas, e que não podiam ser reprogramadas, como as calculadoras. Esse cenário muda por volta de 1945, quando surge a proposta de John Von Neumann, que introduziu a arquitetura em que programas e dados passam a ser armazenados no mesmo espaço de memória, o que permite que as instruções sejam manipuladas pela máquina. Isso trouxe maior flexibilidade à programação, mas usava o modelo de execução em sequência, no qual as instruções são executadas uma por vez, sequencialmente. Por essa característica, mesmo com melhorias como mais cache, mais memória ou componentes mais rápidos, não era possível aumentar o desempenho pois o programa ainda executa uma instrução por vez, evidenciando que a forma de processamento influencia diretamente o desempenho.

    A limitação que impedia o aumento de desempenho no modelo tradicional de Von Neumann, ficou conhecida posteriormente como Gargalo de Von Neumann. Isso evidenciou ainda mais a necessidade dessa preocupação com os métodos de processamento de instruções, o que possibilitou discussões teóricas acerca de concorrência e paralelismo. Nesse contexto, ocorre a formulação da Lei de Moore, quando Gordon Moore observou que o número de transistores em um chip dobraria aproximadamente a cada dois anos, enquanto seu tamanho diminuiria. Durante um período, essa lei se mostrou verdadeira e a evolução permitiu avanços significativos no desempenho dos computadores. No entanto, com o aumento da demanda computacional e o avanço das tecnologias, começaram a surgir limitações técnicas que dificultaram a continuidade desse ritmo de crescimento. Barreiras relacionadas ao consumo de energia, aquecimento e limites de miniaturização passaram a influenciar diretamente o desenvolvimento dos processadores.

    Foi possível observar que, especialmente a partir da década de 1960, com o uso da internet em sistemas corporativos e redes universitárias, houve um grande aumento do volume de dados, o que também ampliava significativamente a necessidade de capacidade de processamento em ambientes onde vários usuários utilizavam os sistemas simultaneamente, como universidades e centros de pesquisa. Diante dessas novas demandas, tornou-se necessário buscar diferentes estratégias para organizar e ampliar o processamento das informações, abrindo espaço para o desenvolvimento de abordagens como a concorrência e o paralelismo.

    Foi nesse período que os computadores passaram a contar com sistemas operacionais mais poderosos com a emergência do time-sharing, modelo que permitia que múltiplos usuários utilizassem o mesmo computador compartilhando o tempo de CPU e os terminais. Nesse sistema, o tempo de uso do processador é dividido em pequenos intervalos chamados quantum, e o escalonador do sistema operacional distribui esses intervalos entre as diferentes tarefas, buscando padronizar o tempo de execução de cada uma e reduzir o tempo de espera. Um dos primeiros sistemas a implementar esse modelo foi o CTSS (Compatible Time Sharing System), desenvolvido pelo Instituto de Tecnologia de Massachusetts. Posteriormente, surgiram outros sistemas como o Dartmouth College Basic System, desenvolvido pela Universidade de Dartmouth, o ATLAS, da Universidade de Manchester, e também o OS/360 da IBM.

    A solução de software encontrada para melhorar o desempenho dos computadores nesse cenário foi o que conhecemos como concorrência, em que o sistema operacional passa a gerenciar o uso do processador, escolhendo qual tarefa irá utilizá-lo em determinado momento e qual deve aguardar. Podemos observar essa situação quando utilizamos um editor de texto que, ao mesmo tempo, precisa formatar o conteúdo selecionado e verificar sua ortografia. Para o usuário, essas tarefas parecem acontecer simultaneamente, porém o que ocorre, na prática, é o gerenciamento rápido do tempo de CPU entre diferentes tarefas

    Dentro do conceito de concorrência, a solução de software geralmente utiliza threads (fios) como as menores unidades de execução. Um thread é uma parte de um processo que o sistema operacional pode gerenciar e executar, permitindo que diferentes partes do mesmo programa sejam executadas quase simultaneamente, otimizando o uso do processador, o que também é crucial para o paralelismo em múltiplos núcleos.

    Dessa forma, o sistema operacional pode suspender temporariamente a execução de uma tarefa que esteja aguardando dados externos ou algum evento e permitir que outra tarefa utilize o processador. Quando os dados necessários estiverem disponíveis, a tarefa suspensa pode ser retomada exatamente do ponto em que havia sido interrompida. Nesse modelo, mais de um programa permanece carregado na memória, permitindo que o sistema gerencie a alternância de execução entre eles.

    Esse processo é feito pelo escalonador de processos do sistema operacional, que cuida dessa lista de tarefas a serem executadas no processador. Usamos isso quando abrimos várias abas no navegador, o sistema operacional precisa gerenciar o tempo de execução de cada página, mantendo os dados da página em suspensão na memória, enquanto executa a página atual.

    Inicialmente buscou-se aumentar o desempenho acelerando o processamento em um único núcleo, utilizando técnicas que permitissem executar mais instruções dentro do mesmo processador. Uma dessas estratégias foi o uso de pipeline de instruções, técnica que divide o fluxo de execução em diferentes estágios. A Intel 80386, lançada em 1985 pela Intel, foi uma das CPUs que exploraram esse tipo de organização interna do processamento, permitindo que diferentes partes de múltiplas instruções fossem executadas simultaneamente em estágios distintos.

    Entretanto, essas estratégias ainda estavam limitadas ao processamento dentro de um único núcleo. Nesse contexto surge a computação paralela, que consiste na execução simultânea de partes de um mesmo problema utilizando múltiplas unidades de processamento, como diferentes núcleos de um processador ou vários processadores em um sistema. É a CPU que conhecemos atualmente, o principal componente responsável pelo processamento das instruções de um computador. Ela executa operações lógicas, matemáticas e instruções de programas. Essa abordagem permite reduzir o tempo de execução de tarefas complexas ao dividir o trabalho entre vários recursos computacionais. Um exemplo comum ocorre no processamento gráfico, onde várias operações de renderização são executadas ao mesmo tempo, e também em simulações científicas, nas quais diferentes partes de um modelo podem ser processadas simultaneamente por múltiplos processadores.

    Diante de todas essas mudanças, temos o cenário atual, no qual a necessidade de processamento aumentou drasticamente devido ao avanço da Inteligência Artificial, que depende da análise de grandes volumes de dados e da execução de inúmeras operações matemáticas em suas aplicações. Para lidar com essa demanda, tornou-se essencial o uso de estratégias de processamento como a computação paralela, pois elas permitem que diferentes partes de um mesmo problema sejam processadas simultaneamente por múltiplas unidades de processamento. Isso pode ser feito em CPUs com vários núcleos ou em GPUs, que são processadores que possuem centenas ou milhares de núcleos menores, capazes de executar muitas operações simples ao mesmo tempo. Originalmente projetadas para processamento gráfico, as GPUs são amplamente utilizadas em aplicações de machine learning, nas quais grandes quantidades de cálculos precisam ser executadas em paralelo.

    Além disso, sistemas baseados em Inteligência Artificial, como chatbots, frequentemente precisam atender múltiplas solicitações ao mesmo tempo. Nesse contexto, técnicas de concorrência permitem que diversas tarefas sejam gerenciadas simultaneamente dentro do sistema, possibilitando o processamento de várias requisições de usuários em assistentes virtuais, sistemas de recomendação ou serviços de reconhecimento de imagem.

    Portanto, o entendimento do funcionamento dessas máquinas e da forma como elas executam instruções permite compreender melhor os desafios enfrentados ao longo da evolução da computação e como surgiram estratégias como a concorrência e o paralelismo para melhorar o desempenho dos sistemas. Dessa forma, torna-se evidente a importância de compreender esses modos computacionais, uma vez que eles são fundamentais para o desenvolvimento de aplicações modernas, capazes de lidar com grandes volumes de dados e múltiplas requisições simultâneas, contribuindo para a criação de sistemas mais eficientes, escaláveis e adequados às demandas tecnológicas da atualidade.

    Share
    Comments (0)