Fundamentos da Computação

Última atualização: 29 Janeiro, 2024
Última atualização: 29 Janeiro, 2024
Escrito por Lambda

1. Introdução

Ao inicializar nosso computador, nos deparamos com uma variedade de programas em execução, desde a interface gráfica até aplicativos de usuário como navegador, Office, Música, Fotos e outros. Cada um desempenha funções específicas, sendo essenciais para a experiência do usuário. Este artigo explora a diversidade de programas, seu papel no sistema operacional e como o poder computacional evoluiu, permitindo a execução simultânea de múltiplas tarefas. Em particular, destacamos o papel crucial da memória RAM e dos processadores, abordando o impacto dessa evolução, especialmente em setores como jogos, onde o processamento paralelo proporciona experiências mais realistas.

2. Tipos de programas de computadores

Os programas de computador são diversificados, abrangendo desde simples utilitários até sistemas operacionais robustos. Cada categoria desempenha um papel específico, moldando a experiência do usuário e fornecendo funcionalidades cruciais para o funcionamento do sistema. Desde editores de texto até navegadores web e ferramentas de design, os programas são o coração pulsante da computação moderna.

Esses programas variam desde simples aplicativos até sistemas operacionais complexos, desempenhando papéis específicos que atendem às necessidades e exigências dos usuários. Vamos explorar detalhadamente alguns desses tipos de programas e entender como cada um contribui para a riqueza da computação contemporânea.

2.1 Aplicativos de Produtividade

Estes programas são projetados para auxiliar em tarefas diárias e profissionais. Incluem editores de texto, planilhas, apresentações e ferramentas de gerenciamento de projetos. São comumente chamados de aplicativos Desktop's, que permite uma grande interatividade do usuário por meio de componentes como: Botões, tabelas, campos de texto, Abas, Menus, Janelas Modais e outros.
Exemplos populares incluem o Microsoft Office (Word, Excel, PowerPoint), Google Workspace e LibreOffice.

Essenciais para a exploração online, os navegadores web permitem a navegação na internet, a visualização de páginas da web e a execução de aplicativos web. Os navegadores se tornaram fundamental na proliferação da internet.
Exemplos notáveis incluem Google Chrome, Mozilla Firefox, Microsoft Edge e Safari.

2.3 Sistemas Operacionais

Fundamentais para o funcionamento do computador, os sistemas operacionais é definido como o conjunto de programas que gerenciam recursos, processadores, armazenamento, dispositivos de entrada e saída e dados da máquina e seus periféricos e interfaces para interação do usuário. 

Eles são responsáveis por gerenciar todos os outros programas e disponibilizar para o usuário uma interface mais simples e usual, permitindo que até mesmo aqueles mais leigos consigam utilizar um computador em seu dia a dia.
Exemplos abrangem o Windows, MacOS, Linux e Android.

2.4 Programas de Design Gráfico

Criados para profissionais criativos, esses programas oferecem ferramentas avançadas para edição de imagens, design e produção gráfica. São programas complexos que envolve o conceito de computação paralela e concorrente. Adobe Photoshop, Illustrator e CorelDRAW são referências nesse domínio. 

Essas ferramentas não apenas capacitam profissionais criativos, mas também democratizam a expressão visual, permitindo que indivíduos de diversos níveis de habilidade explorem e materializem sua criatividade digital. Há também programas de modelagem 3D como o Blender, Unit, que são utilizados amplamente no desenvolvimento de personagens e cenários de jogos. Podem ser utilizados para modelar desde projetos de construção até simulações.

2.5 Ferramentas de Desenvolvimento

As ferramentas de desenvolvimento desempenham um papel central no ciclo de vida do software, fornecendo ambientes integrados e recursos que simplificam o processo de criação, depuração e implementação de aplicações. Essas ferramentas variam desde IDEs (Ambientes de Desenvolvimento Integrado) até compiladores e depuradores. Alguns pontos-chave sobre ferramentas de desenvolvimento incluem:

  • IDEs (Ambientes de Desenvolvimento Integrado): Ambientes como Visual Studio, Eclipse e IntelliJ oferecem uma suíte completa de recursos para desenvolvedores, incluindo editores de código, depuradores e ferramentas de compilação.
  • Compiladores: Ferramentas como GCC e Clang traduzem o código-fonte escrito pelos desenvolvedores para linguagem de máquina, permitindo a execução eficiente dos programas.
  • Depuradores: GDB, WinDbg e Xcode são exemplos de depuradores que auxiliam os desenvolvedores na identificação e resolução de erros no código, facilitando o processo de correção de bugs.
  • Controle de Versão - Git: Ferramentas de controle de versão, como Git, rastreiam alterações no código-fonte, permitindo colaboração eficiente entre desenvolvedores e a reversão para versões anteriores se necessário.
  • Ferramentas de Automação - Jenkins e Travis CI: Utilizadas para automação de compilação e testes, essas ferramentas ajudam a manter a integridade do código e acelerar o ciclo de desenvolvimento.
  • Editores de Texto - Sublime Text e Visual Studio Code: Oferecem recursos avançados de edição de código, além de suporte para diversas linguagens de programação, proporcionando flexibilidade aos desenvolvedores.
  • Ferramentas de Perfis - Profilers: Ferramentas como VisualVM e Perf auxiliam na identificação de gargalos de desempenho, permitindo otimizações no código.

Essas ferramentas são essenciais para maximizar a eficiência dos desenvolvedores, acelerando o processo de criação de software, melhorando a qualidade do código e facilitando a colaboração em projetos de desenvolvimento de software.

2.6 Antivírus e Segurança

Essenciais para proteger o sistema contra ameaças, programas antivírus e de segurança oferecem varreduras em tempo real e proteção contra malware.
McAfee, Norton, Avast e Malwarebytes são alguns representantes.

2.7 Programas de Comunicação

Facilitando a comunicação online, esses programas incluem clientes de e-mail, mensageiros instantâneos e softwares de videoconferência.
Outlook, Gmail, WhatsApp e Zoom são exemplos comuns.

Cada tipo de programa desempenha um papel vital na experiência do usuário, desde simplificar tarefas diárias até possibilitar a criação de conteúdo avançado e a segurança do sistema. A compreensão dessa diversidade digital é crucial para explorar e aproveitar ao máximo as capacidades do mundo digital em constante evolução.

3. Processos, Threads, Arquivos, Memoria RAM

No âmago do funcionamento eficiente de sistemas operacionais, encontramos os conceitos de processos e fluxos(threads), componentes cruciais que possibilitam a execução concorrente de tarefas e a otimização dos recursos do sistema. Vamos mergulhar a fundo nesse universo para compreender como processos e fluxos colaboram para criar uma experiência de computação ágil e responsiva.

3.1 Processos

Um processo é uma instância em execução de um programa. Cada processo tem sua própria área de memória, recursos e estado de execução independente. Os sistemas operacionais gerenciam processos, alocando recursos e permitindo a execução simultânea de diferentes aplicativos. 

Quando o usuário clica em um ícone de um programa em sua área de trabalho, o sistema operacional irá carregar o código daquele programa para a memória RAM e irá fazer uma chamada ao método principal que iniciará o programa. Ao fazer isso uma instancia do programa e registrado no sistema operacional que ira gerenciar recursos que o o programa precisar, como alocação de memória, acesso a arquivos e outros. 

As principais características de uma implementação baseada em processos nos sistemas operacionais são:

  • Permite o paralelismo e uso otimizado do processador
  • São controlados usando tabelas de processos
  • Possuem estados: Bloqueado, Em Execução, Pronto
  • Possuem Hierarquia

Exemplos de processos podem incluir navegadores, editores de texto e aplicativos de design, cada um operando de forma independente.

3.2 Threads

Threads são unidades menores dentro de um processo que compartilham o mesmo espaço de memória. Elas executam tarefas específicas dentro do contexto do processo ao qual pertencem. A existência de threads possibilita a execução simultânea de diferentes partes de um programa, melhorando a eficiência e a capacidade de resposta. 

Imaginemos o seguinte exemplo: Um escritor está escrevendo um livro de 600 páginas em um editor de texto. Imaginemos que o editor de texto não utilizasse threads. Após o escritor terminasse de digitar e solicitasse ao programa fazer a formatação, o mesmo ficaria impedido de fazer algum ajuste em uma frase enquanto a formatação estivesse acontecendo - o programa iria congelar a tela até terminar a formatação. 

O editor de texto precisará formatar todas as 600 páginas, pois não sabe quais tiveram mudanças. Sabemos que os editores atuais são mais robustos e não travam enquanto são utilizados, essa experiência de conseguir realizar múltiplas tarefas dentro de um mesmo programa só é possível usando threads.

Agora imaginemos o mesmo cenário com o uso delas. Uma Thread seria responsável por fazer a interação com o usuário, sendo o fluxo principal do programa. Ela iria controlar todas as iterações em botões, caixa de texto, menus, cliques que o usuário fizesse. Uma segunda thread poderia ser responsável por fazer a formatação do livro em segundo plano, assim que a thread principal do programa notificar a segunda thread que o usuário parou de escrever, ela iniciaria a formatação. Isso não bloquearia o usuário de continuar a escrever, pois a formatação estará acontecendo em paralelo com a thread principal.

3.3 Multitarefa e Concorrência

A capacidade de executar múltiplos processos e threads simultaneamente é fundamental para a multitarefa e a concorrência. Os sistemas operacionais usam algoritmos de escalonamento para decidir qual processo ou thread receberá tempo de CPU, equilibrando eficiência e equidade.

Processos que usam muitas chamadas Entrada/Saída, principalmente de escrita ou leitura de algum dado no disco, como essas chamadas demoram muito do ponto de vista do processador, o processo precisa aguardar o retorno dessas chamadas, enquanto isso o processador sem o uso da concorrência e escalonamento ficaria ocioso esperando a chamada ser concluída. 

O sistema operacional para otimizar o tempo de uso do processador, faz o escalonamento de programas, ocupando o mesmo o máximo possível, assim enquanto um processo aguarda uma chamada E/S outros ganham permissão de usarem o processador. 

O escalonamento e feito muito rapidamente em questão de milissegundos, em processadores de um núcleo apenas, gera uma impressão de paralelismo virtual. Já em processadores com mais núcleos, o paralelismo e real e suportado pelo hardware.

3.4 Sincronização e Comunicação

Em ambientes multitarefa, a sincronização e comunicação entre threads tornam-se vitais para evitar conflitos e garantir que a execução ocorra de maneira ordenada. Mecanismos como semáforos, mutexes e variáveis de condição são utilizados para coordenar as atividades entre elas.

Lembrando que um programa pode realizar tarefas paralelas usando esse recurso, porem alguma dessas tarefas precisam ser coordenadas e sincronizadas. O exemplo do editor de texto que vimos pode ilustrar esse cenário: Onde a thread que formata o texto precisa avisar a thread principal que terminou.

3.5 Vantagens e Desafios

A utilização eficiente de processos e threads resulta em sistemas mais responsivos e eficazes. No entanto, é crucial lidar com desafios como condições de corrida e deadlock. A capacidade de escalar em sistemas multiprocessadores e multinúcleos amplifica ainda mais a utilidade desses conceitos. 

O deadlock é uma situação onde todos os fluxos concorrentes ficam travados esperando uma condição que nunca será atendida: A Thread 1 espera que a Thread 2 termine e a Thread 2 espere que a Thread 1 termine, ou seja, a condição nunca e atendida e os dois fluxos ficam travados esperando infinitamente.

3.6 Aplicações Práticas

Em cenários práticos, como servidores web e aplicações de jogos, a implementação eficaz de processos e threads é essencial para lidar com várias solicitações simultâneas e manter a fluidez da experiência do usuário.

Compreender os nuances dos processos e threads é fundamental para arquitetar sistemas eficientes, explorando ao máximo o potencial de multitarefa oferecido pelos modernos sistemas operacionais. A harmonia entre esses componentes essenciais forma a base para a execução eficiente de operações computacionais em um mundo digital cada vez mais dinâmico.

3.7 Memória RAM

A Memória de Acesso Aleatório (RAM) é o espaço de armazenamento temporário que desempenha um papel vital na velocidade e na eficiência do computador. Ela armazena dados e instruções temporariamente em uso, proporcionando acesso rápido para o processamento.

Ícone de uma memoria RAM

Para ilustrar o papel fundamental da memória RAM, podemos imaginar ela como uma mesa de trabalho: Assim que uma tarefa é iniciada colocamos todas as ferramentas e materiais sobre a mesa para realizá-la. Na medida que usamos a ferramenta ou algum material, e o mesmo não é mais necessário, retiramos ele da mesa para liberar espaço de trabalho. Prosseguindo nesse exemplo, se a tarefa é concluída, limpamos totalmente a mesa para que esteja disponível a uma próxima atividade e todo o processo ocorra novamente.

Quando um programa é executado, suas instruções e dados são carregados na memória RAM a partir do armazenamento de longo prazo, como o disco rígido. O processador, por sua vez, não pode acessar diretamente o armazenamento de longo prazo, então ele busca as instruções e dados necessários na memória RAM.

A interação entre a memória RAM e o processador acontece da seguinte forma:

  • Carregamento de Dados:O processador solicita dados específicos à memória RAM.
    A memória RAM fornece esses dados ao processador.
  • Execução de Instruções:As instruções do programa são carregadas na memória RAM.
    O processador busca as instruções na memória RAM e as executa.
  • Armazenamento Temporário:Dados temporários usados ativamente, como variáveis e resultados intermediários, são armazenados na memória RAM para acesso rápido.
  • Rápido Acesso Aleatório:A memória RAM permite o acesso aleatório aos seus locais de armazenamento, o que significa que o processador pode recuperar qualquer byte de dados diretamente, sem ter que percorrer sequencialmente.

Essa interação é crucial para o desempenho geral do sistema, pois a capacidade de acesso rápido e aleatório da memória RAM permite que o processador execute tarefas de forma eficiente. Uma quantidade adequada de memória RAM é essencial para garantir que o sistema funcione sem interrupções, especialmente ao executar aplicativos exigentes ou várias tarefas simultaneamente.

3.8 Arquivos e Organização

Gif animado de arquivosArquivos de computador são unidades básicas de armazenamento de dados em sistemas computacionais. A organização eficaz de arquivos é um componente crucial para a usabilidade e a integridade dos dados. Sistemas operacionais utilizam métodos específicos para organizar e armazenar dados, oferecendo uma estrutura coesa para os usuários. 

Os arquivos em um computador são armazenados em dispositivos de armazenamento, como discos rígidos (HDDs), unidades de estado sólido (SSDs) ou outros meios de armazenamento. Cada arquivo é identificado por um nome único e é organizado dentro de uma estrutura de diretórios ou pastas. A organização em pastas facilita a categorização e localização de arquivos relacionados.

Estrutura de Arquivos

  • Nome do Arquivo: Cada arquivo possui um nome único que o identifica no sistema de arquivos.
  • Extensão: Alguns sistemas utilizam extensões de arquivo (por exemplo, .txt, .jpg) para indicar o tipo de arquivo e associar automaticamente um programa para abri-lo.
  • Cabeçalho: Contém metadados referentes ao arquivo.
  • Conteúdo: O conteúdo real do arquivo, que pode ser texto, imagens, código de programa, etc.

Cabeçalho do Arquivo

  • Data de criação: Quando o arquivo foi criado.
  • Tamanho do arquivo: O espaço que o arquivo está ocupando na unidade de armazenamento.
  • Proprietário: Qual usuário do sistema é o proprietário do arquivo.
  • Permissões de acesso: Qual é a politica de permissão para acessar o arquivo

Organização em Pastas

  • Diretórios/Pastas: São containers para armazenar arquivos e outros diretórios. Cada pasta pode conter arquivos e subdiretórios.
  • Caminho do Arquivo: O caminho completo de um arquivo é a hierarquia de diretórios que leva até ele. Por exemplo, "C:\Documentos\Texto.txt" indica que o arquivo "Texto.txt" está localizado no diretório "Documentos", que está dentro da unidade "C:".
  • Facilitação de Organização: O uso de pastas facilita a organização lógica de arquivos, tornando mais fácil localizar e gerenciar conteúdos relacionados.
  • Permissões e Segurança: Em sistemas operacionais multiusuário, as pastas podem ter configurações de permissões que controlam quem pode acessar ou modificar os arquivos dentro delas.

Essa estrutura de arquivos e pastas é gerenciada pelo sistema operacional, que fornece interfaces gráficas ou de linha de comando para que os usuários possam interagir com seus arquivos de maneira eficiente e organizada.

4. Programas compilados, interpretados e híbridos

A escolha entre programas compilados e interpretados tem implicações significativas no modo como o código-fonte é executado. Programas compilados traduzem o código-fonte para linguagem de máquina antes da execução, enquanto os interpretados traduzem e executam linha por linha durante a execução.

Programas Compilados

  • Compilação: Em programas compilados, o código-fonte é traduzido integralmente para código de máquina ou código intermediário antes da execução.
  • Execução: O código compilado é executado diretamente pela CPU.
  • Vantagens: Geralmente, são mais rápidos em tempo de execução, pois a tradução já ocorreu.
  • Desvantagens: Requerem um passo de compilação antes da execução.
  • Exemplos: C, C++, Rust.

Programas Interpretados

  • Interpretação: Em programas interpretados, o código-fonte é traduzido linha por linha ou em blocos pequenos durante a execução.
  • Execução: Não há uma fase de compilação separada; o código é interpretado e executado ao mesmo tempo.
  • Vantagens: Facilidade de depuração e portabilidade, pois o código-fonte pode ser distribuído.
  • Desvantagens: Geralmente, são mais lentos em tempo de execução em comparação com os programas compilados.
  • Exemplos: Python, JavaScript, Ruby.

Programas Híbridos

  • Compilação Just-In-Time (JIT): Combina elementos de compilação e interpretação. O código-fonte é compilado em código de máquina ou código intermediário durante a execução.
  • Execução: Partes do código são compiladas sob demanda e podem ser interpretadas em tempo real.
    Vantagens: Pode combinar a eficiência de tempo de execução dos programas compilados com a flexibilidade dos interpretados.
  • Exemplos: Java (através da Máquina Virtual Java - JVM), C# (através da Common Language Runtime - CLR).

5. Conclusão

Ao explorar os alicerces da computação moderna, desde a diversidade dos programas até a harmonia dos processos e threads, somos imersos em um ecossistema digital vibrante. Os programas, multifacetados e essenciais, delineiam nossa experiência diária, enquanto processos e threads se entrelaçam para oferecer uma execução multitarefa eficiente.

A memória RAM e a organização de arquivos complementam esse cenário, garantindo a rápida manipulação de dados e a gestão eficaz de informações. 

Ao concluirmos esta jornada pelos bastidores digitais, reconhecemos que cada componente, apesar de muitas vezes invisível, contribui para a complexidade e vitalidade do nosso mundo digital. Cada linha de código, cada interação e cada processo representam os fundamentos que capacitam a exploração e inovação em uma era de constante evolução digital.