Um sistema operacional (SO) constitui um software de sistema responsável pelo gerenciamento de recursos de hardware e software de computador, oferecendo simultaneamente serviços essenciais para vários programas de computador.
Um sistema operacional (SO) é um software de sistema que gerencia recursos de hardware e software de computador e fornece serviços comuns para programas de computador.
Os sistemas operacionais de compartilhamento de tempo são projetados para agendar tarefas, otimizando assim a utilização do sistema, e frequentemente incorporam software de contabilidade para facilitar a alocação de custos associados ao tempo do processador, armazenamento em massa, dispositivos periféricos e outros recursos computacionais.
No contexto das funções de hardware, incluindo operações de entrada/saída e alocação de memória, o sistema operacional serve como uma camada intermediária entre os programas aplicativos e o hardware do computador subjacente. Embora o código do aplicativo normalmente seja executado diretamente no hardware, ele geralmente inicia chamadas do sistema para funções do sistema operacional ou está sujeito a interrupções pelo sistema operacional. Os sistemas operacionais são difundidos, sendo parte integrante de vários dispositivos equipados com recursos de computação, desde telefones celulares e consoles de videogame até servidores web e supercomputadores.
Em novembro de 2025, o Android detinha a maior participação de mercado entre os sistemas operacionais com 38%, sucedido pelo Microsoft Windows com 33%, iOS e iPadOS coletivamente com 15%, macOS com 4% e Linux com 1%. Especificamente, Android, iOS e iPadOS são adaptados para dispositivos móveis como smartphones, enquanto Windows, macOS e Linux são projetados para ambientes de computação desktop. As distribuições Linux dominam notavelmente os domínios de servidores e supercomputação. Além disso, diversas classes de sistemas operacionais especializados, como sistemas embarcados e de tempo real, atendem a requisitos específicos de aplicações. Os sistemas operacionais focados na segurança também constituem uma categoria distinta. Os requisitos de sistema para sistemas operacionais variam consideravelmente; alguns, como distribuições leves do Linux, exigem recursos mínimos, enquanto outros necessitam de hardware mais robusto.
Certos sistemas operacionais necessitam de um processo de instalação formal ou podem ser pré-instalados em computadores recém-adquiridos através de acordos OEM. Por outro lado, outros sistemas operacionais são capazes de executar diretamente de várias mídias, como um live CD ou memória flash, exemplificado por um LiveUSB.
Definição e propósito
Definir com precisão um sistema operacional apresenta desafios; entretanto, foi caracterizado como “a camada de software que gerencia os recursos de um computador para seus usuários e seus aplicativos”. Os sistemas operacionais compreendem fundamentalmente o componente de software de execução perpétua conhecido como kernel, embora possam abranger software adicional. Além do kernel, duas outras categorias de programas operam em um computador: programas de sistema, que são afiliados ao sistema operacional, mas não necessariamente fazem parte do kernel, e aplicativos, que constituem todos os outros softwares.
Um sistema operacional atende a três objetivos principais:
- Os sistemas operacionais são responsáveis por alocar recursos entre diversas aplicações, determinando a distribuição do tempo da unidade central de processamento (CPU) e do espaço de memória. Nos ambientes contemporâneos de computação pessoal, os usuários frequentemente executam vários aplicativos simultaneamente. Para evitar que qualquer programa monopolize recursos de hardware finitos, o sistema operacional atribui a cada aplicativo uma parcela proporcional de recursos, sejam eles temporais (CPU) ou espaciais (memória). Além disso, o sistema operacional deve isolar os aplicativos para protegê-los contra erros e vulnerabilidades de segurança originados em outros códigos de aplicativos, ao mesmo tempo que facilita a comunicação controlada entre aplicativos distintos.
- Os sistemas operacionais fornecem uma interface que abstrai os detalhes intrincados do acesso ao hardware, incluindo o gerenciamento da memória física, simplificando assim o desenvolvimento para os programadores. A virtualização capacita ainda mais o sistema operacional para ocultar limitações nos recursos de hardware; por exemplo, a memória virtual pode apresentar a um programa a ilusão de um espaço de memória expansivo e virtualmente ilimitado que ultrapassa a capacidade real de memória física do computador.
- Os sistemas operacionais fornecem serviços padronizados, como interfaces para acesso à rede e a dispositivos de disco. Esse recurso permite que os aplicativos operem em configurações de hardware diferentes sem exigir uma extensa reengenharia. O conjunto específico de serviços integrados em um sistema operacional apresenta variação considerável, e esse escopo funcional normalmente constitui a parte predominante da base de código para a maioria dos sistemas operacionais.
Tipos de sistemas operacionais
Sistemas operacionais multicomputadores
Os sistemas multiprocessadores são caracterizados por múltiplas unidades centrais de processamento (CPUs) que compartilham uma arquitetura de memória comum. Por outro lado, um multicomputador ou computador cluster compreende múltiplas CPUs, cada uma possuindo sua memória dedicada. O surgimento dos multicomputadores resultou das complexidades de engenharia e dos custos proibitivos associados aos projetos de multiprocessadores em larga escala; sua prevalência em ambientes de computação em nuvem é atribuída à substancial escala computacional necessária. A comunicação entre CPUs muitas vezes necessita de troca de mensagens, exigindo que os sistemas operacionais dessas arquiteturas minimizem a cópia de pacotes para otimizar o desempenho. Os sistemas contemporâneos frequentemente empregam arquiteturas multifilas, segmentando grupos de usuários em filas distintas para mitigar os requisitos de cópia de pacotes e facilitar o aumento do suporte ao usuário simultâneo. O acesso remoto direto à memória (RDMA) representa uma abordagem alternativa, permitindo que CPUs individuais acessem diretamente a memória de outras CPUs. Os sistemas operacionais projetados para multicomputadores geralmente incorporam suporte para chamadas de procedimentos remotos, permitindo que uma CPU invoque procedimentos em outra CPU ou implemente memória compartilhada distribuída, onde o sistema operacional aproveita a virtualização para criar um espaço lógico de memória compartilhada que não possui uma contraparte física.
Sistemas Distribuídos
Um sistema distribuído consiste em uma coleção de computadores distintos em rede, cada um potencialmente operando com seu próprio sistema operacional e sistema de arquivos. Ao contrário dos multicomputadores, esses sistemas podem estar dispersos geograficamente em locais globais. Middleware, uma camada intermediária de software posicionada entre o sistema operacional e os aplicativos, é frequentemente empregada para melhorar a consistência do sistema. Apesar de suas semelhanças funcionais com um sistema operacional, o middleware não é classificado como um sistema operacional independente.
Sistemas Embarcados
Os sistemas operacionais incorporados são projetados especificamente para integração em sistemas de computadores incorporados, abrangendo dispositivos de Internet das Coisas (IoT) e aplicativos autônomos, fora da rede. Vários eletrodomésticos incorporam sistemas embarcados. Sua principal característica distintiva é a incapacidade de carregar software instalado pelo usuário. Esta característica elimina a necessidade de mecanismos de proteção entre aplicações, facilitando assim projetos arquitetônicos mais simples. Sistemas operacionais extremamente compactos podem operar com espaço de memória inferior a 10 kilobytes, com as versões mais pequenas projetadas para cartões inteligentes. Exemplos ilustrativos incluem Embedded Linux, QNX, VxWorks e os sistemas ultracompactos RIOT e TinyOS.
Sistemas em tempo real
Um sistema operacional em tempo real (RTOS) é caracterizado por sua garantia de processar eventos ou dados dentro ou por uma restrição temporal precisamente especificada. Sistemas rígidos em tempo real exigem precisão temporal absoluta e são predominantes em setores como manufatura, aviônica, aplicações militares e domínios comparáveis. Em contraste, os sistemas suaves de tempo real toleram prazos perdidos ocasionais; esta categoria normalmente abrange sistemas de áudio ou multimídia e smartphones. Para alcançar a exatidão temporal necessária, sistemas rígidos de tempo real são frequentemente implementados como bibliotecas sem proteção entre aplicações, exemplificadas pelos eCos.
Hipervisor
Um hipervisor funciona como um sistema operacional projetado especificamente para hospedar e gerenciar máquinas virtuais. Uma máquina virtual (VM) é um aplicativo que emula hardware, buscando replicar as características operacionais do hardware físico para o qual o sistema operacional convidado foi originalmente projetado. As VMs oferecem a capacidade de serem pausadas, salvas e retomadas, tornando-as inestimáveis para pesquisa, desenvolvimento e depuração em contextos de sistema operacional. Além disso, aumentam a portabilidade, facilitando a execução de aplicativos em um computador host, mesmo que esses aplicativos sejam incompatíveis com o sistema operacional base subjacente.
Sistemas operacionais de biblioteca
Um sistema operacional de biblioteca (libOS) fornece serviços convencionais de sistema operacional, como funcionalidades de rede, por meio de uma coleção de bibliotecas. Essas bibliotecas são então integradas a um aplicativo singular e seu código de configuração para formar um unikernel: uma imagem de máquina especializada com espaço de endereço único, construída pela extração e ligação apenas dos componentes essenciais do código das bibliotecas, projetada para implantação em nuvem ou ambientes incorporados.
O sistema operacional e o código do aplicativo dentro de um libOS não são executados em domínios de proteção separados, pois o modelo conceitual envolve um único aplicativo, negando assim o requisito de prevenção de interferência entre aplicativos. Os serviços do sistema operacional são acessados por meio de chamadas diretas de biblioteca, que podem ser incorporadas com base em otimizações do compilador, eliminando assim a sobrecarga típica associada às trocas de contexto, uma característica compartilhada com sistemas operacionais embarcados e de tempo real. Essa sobrecarga é substancial, abrangendo não apenas o custo direto da troca de modo, mas também a degradação indireta do desempenho causada pela 'poluição' de estruturas críticas do processador, como caches de CPU e o pipeline de instruções, impactando a execução no modo de usuário e no modo kernel.
Histórico
Os primeiros computadores, desenvolvidos no final das décadas de 1940 e 1950, eram programados diretamente usando plugboards ou código de máquina inserido por meio de mídias como cartões perfurados, anteriores ao advento de linguagens de programação ou sistemas operacionais. Após a introdução do transistor em meados da década de 1950, surgiram os computadores mainframe. Esses sistemas exigiam que operadores profissionais executassem manualmente tarefas agora realizadas por sistemas operacionais modernos, como agendamento de programas. No entanto, esses mainframes incorporaram sistemas operacionais rudimentares como o Fortran Monitor System (FMS) e o IBSYS. Durante a década de 1960, a IBM lançou o System/360, a série inaugural de computadores intercompatíveis. Todos os modelos System/360 operavam no OS/360, um sistema operacional composto por milhões de linhas de linguagem assembly e contendo milhares de defeitos. O OS/360 também foi pioneiro na multiprogramação, um recurso que permite à CPU processar outra tarefa enquanto um trabalho aguarda a conclusão de uma operação de entrada/saída (E/S). O gerenciamento de vários trabalhos simultâneos na memória exigia particionamento de memória sofisticado e medidas de proteção para evitar que um trabalho acessasse a memória atribuída a outro. Ao mesmo tempo, as teleimpressoras foram adotadas como terminais, permitindo o acesso simultâneo de vários usuários a um único computador. O sistema operacional MULTICS foi projetado para facilitar o acesso de centenas de usuários a um grande sistema de computação. Apesar da sua implantação restrita, o MULTICS é reconhecido como um precursor dos paradigmas contemporâneos de computação em nuvem. O sistema operacional UNIX evoluiu do MULTICS, inicialmente projetado para operação de usuário único. A disponibilidade do código-fonte do UNIX levou à sua adoção como base para vários outros sistemas operacionais, muitas vezes incompatíveis. Entre eles, o System V da ATT e o Berkeley Software Distribution (BSD) da Universidade da Califórnia alcançaram destaque significativo. Para melhorar a interoperabilidade, o IEEE estabeleceu o padrão POSIX para interfaces de programação de aplicativos (APIs) de sistemas operacionais, um padrão amplamente suportado pela maioria dos sistemas baseados em UNIX. MINIX, uma variante simplificada do UNIX desenvolvida em 1987 para fins educacionais, serviu de inspiração para o Linux, um sistema operacional de software livre disponível comercialmente. Desde 2008, o MINIX foi integrado aos controladores da maioria dos microchips Intel, enquanto o Linux é amplamente utilizado em data centers e smartphones Android.
Microcomputadores
O advento da tecnologia de integração em larga escala facilitou a produção de computadores pessoais, inicialmente denominados microcomputadores, começando por volta de 1980. Por aproximadamente cinco anos, o CP/M (Programa de Controle para Microcomputadores) dominou como o sistema operacional mais predominante para esses microcomputadores. Posteriormente, a IBM adquiriu um sistema operacional de disco da Microsoft, que a IBM comercializou como IBM PC DOS, enquanto a Microsoft o chamou de MS-DOS (MicroSoft Disk Operating System). Este sistema ganhou ampla adoção em microcomputadores compatíveis com IBM PC. As iterações subsequentes do MS-DOS exibiram maior sofisticação, em parte através da incorporação de recursos derivados do UNIX.
O Macintosh da Apple foi o primeiro computador amplamente adotado a apresentar uma interface gráfica de usuário (GUI). Essa GUI melhorou significativamente a facilidade de uso em comparação com as interfaces de linha de comando baseadas em texto, características dos sistemas operacionais anteriores. O sucesso da GUI motivou a Microsoft a desenvolver o Windows, uma sobreposição de GUI para MS-DOS. O Windows foi posteriormente reprojetado como um sistema operacional independente, o Windows NT, que incorporou vários recursos de outro sistema operacional, VAX/VMS, levando a um acordo legal substancial. No século 21, o Windows mantém sua popularidade em computadores pessoais, mas detém uma participação de mercado menor no domínio de servidores. Os sistemas operacionais baseados em UNIX, particularmente Linux, são predominantes em sistemas e servidores empresariais, e também são implantados em dispositivos móveis e várias outras plataformas de computação.
Inicialmente, o Symbian OS detinha uma posição dominante no mercado de dispositivos móveis, sendo posteriormente substituído pelo BlackBerry OS (lançado em 2002) e pelo iOS para iPhones (introduzido em 2007). Posteriormente, o sistema operacional Android de código aberto (lançado em 2008), que incorpora um kernel Linux e uma biblioteca C (Bionic) parcialmente derivada do código BSD, alcançou grande popularidade.
Componentes
Os componentes do sistema operacional são projetados para facilitar a operação coesa das diversas partes de um computador. Após a obsolescência efetiva do DOS, todo o software do usuário agora é obrigado a interagir com o sistema operacional para acessar recursos de hardware.
Kernel
O kernel serve como componente central de um sistema operacional, mediando a proteção entre diversos aplicativos e usuários. Esta função de proteção é crucial para aumentar a confiabilidade do sistema, isolando erros em programas individuais, reforçando a segurança através da restrição de capacidades de software malicioso e salvaguardando dados privados, e evitando que qualquer programa isolado monopolize os recursos do sistema. Normalmente, os sistemas operacionais operam em dois modos distintos: modo de usuário, onde o hardware impõe a execução apenas de instruções legítimas por software, e modo kernel, onde o kernel possui privilégios irrestritos e está isento de tal escrutínio em nível de hardware. Além disso, o kernel é responsável pelo gerenciamento de memória em vários processos e regula o acesso a dispositivos de entrada/saída.
Execução do programa
O sistema operacional serve como uma interface intermediária entre os programas aplicativos e o hardware do computador subjacente, permitindo assim que os aplicativos interajam com o hardware exclusivamente por meio da adesão às regras e procedimentos predefinidos do sistema operacional. Ao mesmo tempo, o sistema operacional oferece um conjunto de serviços projetados para agilizar o desenvolvimento e a execução de software aplicativo. A execução de um programa aplicativo normalmente começa com a criação de um processo pelo kernel do sistema operacional, o que envolve a alocação de espaço de memória e outros recursos necessários, estabelecendo uma prioridade de processo em ambientes multitarefa, carregando o código binário do programa na memória e, posteriormente, iniciando a execução do aplicativo, facilitando sua interação com usuários e dispositivos de hardware. No entanto, certos sistemas permitem que um aplicativo solicite ao sistema operacional que execute outro aplicativo dentro do processo idêntico, seja como uma sub-rotina ou dentro de um thread distinto, exemplificado pelas funcionalidades LINK e ATTACH encontradas no OS/360 e suas versões subsequentes.
Interrupções
Uma interrupção, também chamada de aborto, exceção, falha, sinal ou armadilha, constitui um mecanismo eficaz que permite que a maioria dos sistemas operacionais responda dinamicamente a eventos ambientais. Esses eventos solicitam que a unidade central de processamento (CPU) desvie seu fluxo de controle do programa atualmente em execução para um manipulador de interrupções, comumente conhecido como rotina de serviço de interrupção (ISR). Uma rotina de serviço de interrupção pode, por sua vez, acionar uma troca de contexto dentro da unidade central de processamento (CPU). Embora as metodologias específicas para processamento de interrupções sejam diferentes entre as arquiteturas de computador e o comportamento das rotinas de serviço de interrupção varie entre os sistemas operacionais, diversas funções centrais de interrupção são universalmente observadas. Normalmente, tanto a arquitetura do sistema quanto o sistema operacional são necessários para:
- transfira o controle para a rotina de serviço de interrupção designada.
- preservar o estado do processo atualmente em execução.
- restaurar o estado do processo após a interrupção do serviço.
Interrupção de software
Uma interrupção de software constitui uma notificação entregue a um processo, indicando a ocorrência de um evento específico. Este mecanismo difere de uma interrupção de hardware, que transmite uma mensagem diretamente para a unidade central de processamento (CPU) sobre um evento. Apesar desta distinção, as interrupções de software compartilham uma semelhança fundamental com as interrupções de hardware: ambas envolvem um desvio do processo atualmente em execução. Além disso, ambos os tipos de interrupções necessitam da execução de uma rotina de serviço de interrupção.
As interrupções de software podem originar-se de eventos do sistema que ocorrem rotineiramente. Por exemplo, a antecipação de um intervalo de tempo exige a execução de uma troca de contexto pelo kernel. Além disso, um programa de computador pode configurar um cronômetro para ser acionado após um período especificado, servindo como proteção se o volume excessivo de dados fizer com que um algoritmo exceda o tempo de execução esperado.
Por outro lado, interrupções de software também podem significar condições de erro, como a detecção de uma instrução de máquina malformada. No entanto, as condições de erro mais frequentemente encontradas incluem divisão por zero e tentativas de acessar um endereço de memória inválido.
Os usuários possuem a capacidade de transmitir mensagens ao kernel, influenciando assim o comportamento de um processo ativo. Por exemplo, dentro de uma interface de linha de comando, invocar o caractere de interrupção (normalmente Control-C) pode levar ao encerramento do processo atualmente em execução.
Para unidades de processamento central (CPUs) x86, a geração de interrupções de software é facilitada pela instrução em linguagem assembly INT. Sua sintaxe é INT X, onde X denota o número de deslocamento, expresso em formato hexadecimal, dentro da tabela de vetores de interrupção.
Sinal
Em sistemas operacionais do tipo Unix, a chamada de sistema kill(pid,signum) é empregada para gerar interrupções de software enviando um sinal para um processo especificado. Aqui, pid representa o identificador do processo do destinatário alvo. Por outro lado, signum especifica o número do sinal, normalmente fornecido em formato mnemônico, a ser transmitido. Historicamente, o termo kill foi adotado devido às suas implementações iniciais serem focadas exclusivamente no encerramento de processos.
Em sistemas operacionais do tipo Unix, sinais notificam os processos sobre ocorrências assíncronas. A comunicação assíncrona requer o uso de interrupções. Um cenário comum que requer comunicação assíncrona entre processos envolve uma variante do clássico problema do leitor/gravador. Nesse contexto, um processo gravador obtém um canal do shell, direcionando sua saída para o fluxo de entrada do leitor. Essa interação é exemplificada pela sintaxe da linha de comando alpha | bravo. Aqui, alpha grava no pipe ao completar seu cálculo e subsequentemente entra em estado de espera. Conseqüentemente, bravo faz a transição para a fila de prontos e prossegue com a leitura de seu fluxo de entrada designado. O kernel orquestra esse mecanismo de canalização por meio da geração de interrupções de software.
Sinais podem ser categorizados em sete tipos distintos, que incluem:
- Encerramento normal do processo.
- Ocorrência de uma exceção de erro de processo.
- Esgotamento de um recurso do sistema por um processo.
- Execução de uma instrução ilegal por um processo.
- Ativação de um evento de alarme por um processo.
- Processo de aborto iniciado no teclado.
- Geração de um alerta de rastreamento para fins de depuração.
Interrupção de hardware
Os dispositivos de entrada/saída (E/S) operam em velocidades significativamente mais baixas em comparação com a unidade central de processamento (CPU). Conseqüentemente, a espera direta da CPU pela conclusão de cada operação de E/S degradaria o desempenho geral do sistema. Para mitigar isso, os computadores geralmente empregam interrupções para conclusão de E/S, eliminando assim as ineficiências dos mecanismos de pesquisa ou espera ocupada.
Certos sistemas de computação necessitam de uma interrupção para cada caractere ou palavra processada, consumindo ciclos substanciais de CPU. O Direct Memory Access (DMA) representa um recurso arquitetônico que permite que os dispositivos ignorem a CPU e acessem diretamente a memória principal. Independentemente da arquitetura central, um dispositivo pode executar operações de acesso direto à memória de e para a memória principal, diretamente ou através de uma interface de barramento.
Entrada/Saída
Drivers de dispositivo
Os sistemas operacionais incorporam drivers de dispositivos para facilitar a interação com periféricos de entrada/saída.
E/S orientada a interrupções
Após uma entrada de teclado do usuário, o caractere correspondente normalmente é renderizado instantaneamente na tela. Da mesma forma, os movimentos do mouse resultam no reposicionamento imediato do cursor na tela. Cada pressionamento de tecla ou ação do mouse aciona uma interrupção, um mecanismo conhecido como E/S orientada por interrupção. Esta forma de E/S é caracterizada por um processo que gera uma interrupção para cada caractere ou palavra transmitida.
Acesso direto à memória
Dispositivos de alta velocidade, incluindo unidades de disco rígido, unidades de estado sólido e unidades de fita magnética, transferem dados a taxas que tornariam a intervenção da CPU para cada byte ou palavra extremamente demorada. Em vez disso, a transferência de dados entre esses dispositivos e a memória ocorre independentemente da CPU, facilitada por hardware especializado, como canais ou controladores de acesso direto à memória. Uma interrupção é gerada somente após a conclusão de toda a operação de transferência de dados.
Quando um programa de computador inicia uma chamada de sistema para uma operação de gravação de E/S de bloco, a chamada de sistema normalmente executa a sequência subsequente de instruções:
- Armazena o conteúdo dos registradores da CPU, incluindo o contador do programa, dentro do bloco de controle do processo.
- Gere uma entrada na tabela de status do dispositivo, que o sistema operacional utiliza para monitorar processos que aguardam dispositivos específicos. Um campo designado nesta tabela armazena o endereço de memória do bloco de controle do processo.
- Transfira todos os caracteres designados para o dispositivo para um buffer de memória dedicado.
- Atribuir o endereço de memória do buffer a um registro de dispositivo pré-especificado.
- Configure o tamanho do buffer (um valor inteiro) em um registro separado e pré-especificado.
- Inicie a operação de gravação executando a instrução de máquina relevante.
- Execute uma mudança de contexto para o processo subsequente que reside na fila de processos prontos.
Durante a operação de gravação, o sistema operacional realiza trocas de contexto de rotina para outros processos. Assim que o dispositivo completar sua tarefa de gravação, ele interromperá o processo atualmente em execução afirmando uma solicitação de interrupção. Ao mesmo tempo, o dispositivo coloca um valor inteiro no barramento de dados. Ao reconhecer esta solicitação de interrupção, o sistema operacional prossegue com as seguintes ações:
- Envia o conteúdo do registro do contador do programa, seguido pelo registro de status, para a pilha de chamadas.
- Armazena o conteúdo de todos os outros registros na pilha de chamadas. (Como alternativa, o conteúdo desses registros pode ser preservado em uma tabela do sistema.)
- O sistema lê um número inteiro do barramento de dados, que serve como deslocamento para a tabela de vetores de interrupção. Posteriormente, as instruções dentro da tabela de vetores iniciarão as seguintes ações:
- Acesse a tabela de status do dispositivo.
- Extraia o bloco de controle do processo relevante.
- Execute uma troca de contexto, devolvendo o controle ao processo de escrita.
Após a expiração do intervalo de tempo alocado para o processo de gravação, o sistema operacional executará as seguintes operações:
- Recupere todos os registros da pilha de chamadas, excluindo o registro de status e o contador do programa.
- Recupere o registro de status da pilha de chamadas.
- Extraia o endereço da instrução subsequente da pilha de chamadas e restaure-o no contador do programa.
Depois que o contador do programa for zerado, o processo interrompido anteriormente recomeçará sua execução dentro do intervalo de tempo alocado.
Gerenciamento de memória
Em um ambiente de multiprogramação, o kernel do sistema operacional é fundamentalmente responsável por gerenciar toda a memória do sistema utilizada ativamente por vários programas. Esse gerenciamento é fundamental para evitar que um programa interfira na memória alocada para outro. Dado que os programas compartilham o tempo do processador, cada um deve manter acesso independente às suas regiões de memória designadas.
Os primeiros sistemas operacionais frequentemente empregavam gerenciamento cooperativo de memória, que operava com a premissa de que todos os programas utilizariam voluntariamente o gerenciador de memória do kernel e adeririam estritamente aos limites de memória alocados. Essa abordagem de gerenciamento de memória está agora em grande parte obsoleta porque os programas geralmente contêm defeitos que podem levá-los a exceder a memória designada. Se um programa falhar, corre o risco de corromper ou substituir a memória utilizada por outras aplicações. Além disso, software malicioso ou vírus podem modificar intencionalmente a memória de outro programa ou interromper a funcionalidade do sistema operacional. Conseqüentemente, sob o gerenciamento cooperativo de memória, um único programa errôneo possui o potencial de desestabilizar todo o sistema.
Os mecanismos de proteção de memória capacitam o kernel a restringir o acesso de um processo à memória do computador. Diversas metodologias para proteção de memória estão disponíveis, abrangendo segmentação e paginação de memória. Todos esses métodos necessitam de um certo grau de suporte de hardware, exemplificado pela Unidade de Gerenciamento de Memória (MMU) 80286, que não está universalmente presente em todos os sistemas de computação.
Nas arquiteturas de segmentação e paginação, registros de modo protegido específicos determinam à Unidade Central de Processamento (CPU) quais endereços de memória um programa em execução pode acessar. Qualquer tentativa de acessar endereços não autorizados inicia uma interrupção, forçando a CPU a voltar ao modo supervisor, cedendo assim o controle ao kernel. Este evento é denominado violação de segmentação ou "Seg-V". Dada a dificuldade inerente em atribuir um resultado significativo a tal operação, e porque normalmente significa um programa com defeito, o kernel geralmente responde encerrando o programa agressor e registrando o erro.
As versões do sistema operacional Windows de 3.1 até Millennium Edition (ME) incorporaram um grau de proteção de memória; no entanto, os aplicativos poderiam facilmente contornar sua aplicação. Embora uma falha de proteção geral fosse gerada, sinalizando uma violação de segmentação, o sistema frequentemente travava de qualquer maneira.
Memória Virtual
A implementação do endereçamento de memória virtual, por meio de técnicas como paginação ou segmentação, permite que o kernel determine com precisão quais regiões de memória cada programa pode utilizar em qualquer momento específico. Esse recurso permite que o sistema operacional atribua os mesmos locais de memória física para múltiplas tarefas distintas.
Se um programa tentar acessar uma memória que não está acessível no momento, mas que foi alocada para ele, o kernel recebe uma interrupção. Esse tipo de interrupção é comumente chamado de falha de página.
Ao detectar uma falha de página, o kernel normalmente modifica o intervalo de memória virtual do programa inicial, concedendo assim acesso à memória solicitada. Esse mecanismo fornece ao kernel autoridade discricionária sobre o local de armazenamento da memória de um aplicativo e até mesmo sobre se essa memória foi alocada fisicamente.
Os sistemas operacionais contemporâneos geralmente armazenam temporariamente regiões de memória acessadas com menos frequência em um disco ou outra mídia de armazenamento. Esta ação libera esse espaço para utilização por outros programas. Este processo é denominado "troca", pois uma única área de memória pode ser compartilhada por vários aplicativos, com seu conteúdo sendo trocado ou trocado conforme necessário.
A memória virtual fornece aos programadores e usuários a ilusão de uma quantidade significativamente maior de memória de acesso aleatório (RAM) no computador do que a fisicamente presente.
Simultaneidade
A simultaneidade descreve a capacidade inerente do sistema operacional de gerenciar e executar diversas tarefas simultaneamente. Esse recurso é um recurso fundamental compatível com praticamente todos os sistemas operacionais contemporâneos.
Threads facilitam a decomposição da carga de trabalho de um processo em vários segmentos executáveis simultaneamente. A quantidade de threads não é limitada pelo número de processadores disponíveis. Caso a contagem de threads exceda a contagem de processadores, o kernel do sistema operacional gerencia o agendamento, suspensão e retomada de threads, regulando assim o tempo de execução de cada thread e a alocação de CPU. Durante uma troca de contexto, um thread ativo é suspenso, seu estado é preservado no bloco e na pilha de controle do thread e o estado de um novo thread é subsequentemente carregado. Historicamente, vários sistemas empregavam multitarefa cooperativa, em que um thread era executado até ceder voluntariamente o controle. No entanto, devido ao potencial de um único thread monopolizar o processador neste modelo, a maioria dos sistemas operacionais contemporâneos agora implementam multitarefa preemptiva, permitindo a interrupção do thread. Cada thread possui um ID de thread exclusivo, um contador de programa (PC), um conjunto de registros dedicado e sua própria pilha; entretanto, threads dentro do mesmo processo compartilham código, dados de heap e outros recursos do sistema. Conseqüentemente, a sobrecarga associada à criação de threads é consideravelmente menor do que a de iniciar um novo processo. Em arquiteturas de CPU única, a simultaneidade é obtida por meio da alternância de processos. Os sistemas de computação modernos frequentemente incorporam múltiplas CPUs, permitindo o paralelismo onde vários threads são executados simultaneamente em processadores distintos, acelerando potencialmente a execução do programa com base no grau de simultaneidade inerente.
Sistema de arquivos
Ao contrário da memória de acesso aleatório dinâmica volátil (DRAM), os dispositivos de armazenamento permanente predominantes nos sistemas de computação do século XXI mantêm a acessibilidade dos dados após falhas do sistema ou interrupções de energia. O armazenamento não volátil oferece um custo por byte significativamente menor, mas apresenta tempos de acesso, leitura e gravação várias ordens de magnitude mais lentos. As principais tecnologias neste domínio incluem unidades de disco rígido, que utilizam discos magnéticos, e memória flash, incorporada em unidades de estado sólido que armazenam dados através de circuitos elétricos. Embora a memória flash seja geralmente mais cara, ela oferece velocidade e durabilidade superiores.
Os sistemas de arquivos representam uma camada de abstração empregada pelos sistemas operacionais para simplificar a interação com o armazenamento permanente. Esses sistemas fornecem nomes de arquivos legíveis e metadados associados, melhoram o desempenho por meio da amortização de operações de acesso, mitigam o acesso simultâneo a regiões de memória compartilhada por vários threads e incorporam somas de verificação para verificação de integridade de dados. Estruturalmente, os sistemas de arquivos compreendem arquivos – coleções de dados nomeadas e de tamanho arbitrário – e diretórios (também conhecidos como pastas), que enumeram nomes de arquivos legíveis por humanos e outros diretórios. Um caminho de arquivo absoluto origina-se do diretório raiz, delineando subdiretórios separados por pontuação, enquanto um caminho relativo especifica a localização de um arquivo em relação a um diretório atual.
As chamadas de sistema, ocasionalmente encapsuladas por bibliotecas, capacitam os aplicativos a realizar operações fundamentais em arquivos, como criação, exclusão, abertura, fechamento, vinculação, leitura e gravação. O sistema operacional executa todas essas operações em nome do aplicativo solicitante. Para minimizar a latência, o sistema operacional emprega estratégias como armazenar em cache blocos de memória acessados recentemente e pré-buscar dados antecipados pelo aplicativo, mas ainda não solicitados explicitamente. Os drivers de dispositivo, que são componentes de software adaptados para dispositivos de entrada/saída (E/S) específicos, facilitam a operação contínua do sistema operacional em diversas configurações de hardware sem exigir modificações básicas.
Um componente integral dos sistemas de arquivos é uma estrutura de dicionário que correlaciona o nome e os metadados de um arquivo com o bloco de dados específico que contém seu conteúdo. A maioria dos sistemas de arquivos utiliza diretórios para traduzir nomes de arquivos legíveis em números de arquivos internos. Para saber o número do bloco correspondente, o sistema operacional consulta um índice, frequentemente estruturado em árvore. Além disso, um mapa de espaço livre, normalmente implementado como bitmap, é mantido para monitorar os blocos disponíveis. Embora qualquer bloco livre possa acomodar novos dados de arquivo, muitos sistemas operacionais se esforçam para colocar arquivos no mesmo diretório para otimizar o desempenho ou reorganizar arquivos periodicamente para mitigar a fragmentação.
Garantir a confiabilidade dos dados em meio a travamentos de computador ou falhas de hardware constitui uma consideração crítica. Os protocolos de gravação de arquivos são projetados com operações atômicas para evitar que o armazenamento permanente seja deixado em um estado parcialmente escrito e inconsistente caso ocorra uma falha no sistema durante o processo de gravação. A corrupção de dados é combatida por meio de mecanismos de armazenamento redundantes, como RAID (matriz redundante de discos baratos) e aplicação de somas de verificação para identificar dados comprometidos. Ao implementar múltiplas camadas de somas de verificação e manter backups de arquivos, um sistema pode recuperar vários problemas de hardware. Além disso, processos em segundo plano são frequentemente empregados para detectar e corrigir corrupção de dados.
Rede
Os sistemas operacionais contemporâneos normalmente integram uma pilha de rede, exemplificada pelo conjunto de protocolos TCP/IP.
Segurança
A segurança envolve proteger os usuários de outros usuários do sistema local e de entidades que tentam acesso remoto não autorizado à rede. A segurança do sistema operacional baseia-se na obtenção da tríade da CIA: confidencialidade, que impede o acesso não autorizado aos dados; integridade, que impede modificação não autorizada de dados; e disponibilidade, que garante a acessibilidade do sistema para usuários autorizados, mesmo durante ataques de negação de serviço. Consistente com as práticas de outros ambientes de computação, o isolamento dos domínios de segurança — especificamente o kernel, os processos e as máquinas virtuais nos sistemas operacionais — constitui um pré-requisito fundamental para uma segurança robusta. Estratégias adicionais para melhorar a segurança incluem simplicidade para minimizar a superfície de ataque, restrições padrão de acesso a recursos, verificações de autorização abrangentes para todas as solicitações, adesão ao princípio de autoridade mínima (concedendo apenas o privilégio mínimo essencial para uma tarefa), separação de privilégios e redução de dados compartilhados.
As arquiteturas de sistemas operacionais exibem vários graus de segurança inerente. As arquiteturas sem isolamento entre o kernel e os aplicativos demonstram a postura de segurança mais baixa, enquanto aquelas que empregam um kernel monolítico, característico da maioria dos sistemas operacionais de uso geral, permanecem suscetíveis a comprometimento se algum componente do kernel for violado. Por outro lado, os designs de microkernel oferecem segurança aprimorada ao distribuir privilégios de kernel em vários domínios de segurança distintos, mitigando assim o impacto de um comprometimento singular do kernel. Unikernels representam uma metodologia alternativa que aumenta a segurança por meio da minimização do kernel e da segregação específica do aplicativo de outras funcionalidades do sistema operacional.
O uso predominante de C ou C++ no desenvolvimento de sistemas operacionais introduz vulnerabilidades inerentes suscetíveis de exploração. Apesar das medidas de proteção, as vulnerabilidades frequentemente resultam de ataques de buffer overflow, facilitados pela ausência de verificação robusta de limites. Além disso, vulnerabilidades de hardware, ocasionalmente decorrentes de otimizações de CPU, também podem facilitar o comprometimento do sistema operacional. Existem casos documentados em que desenvolvedores de sistemas operacionais introduziram intencionalmente vulnerabilidades, incluindo backdoors.
A segurança do sistema operacional é prejudicada pela sua crescente complexidade e pela consequente inevitabilidade de defeitos de software. Dado que a verificação formal dos sistemas operacionais pode ser impraticável, os desenvolvedores empregam técnicas de proteção do sistema operacional, como randomização do layout do espaço de endereço, integridade do fluxo de controle e restrições de acesso, para mitigar vulnerabilidades. Os sistemas operacionais de código aberto operam sem restrições às contribuições de código, caracterizados por históricos de alterações transparentes e estruturas de governança distribuídas. Os desenvolvedores de código aberto se esforçam de forma colaborativa para identificar e erradicar vulnerabilidades de segurança por meio de rigorosa revisão de código e verificação de tipo para eliminar códigos maliciosos. Andrew S. Tanenbaum defende a divulgação pública de todo o código-fonte do sistema operacional, afirmando que esta prática desencoraja os desenvolvedores de confiar no sigilo e no princípio inerentemente não confiável de segurança pela obscuridade.
Interface do usuário
Uma interface de usuário (IU) serve como um componente crítico que facilita a interação humano-computador. As duas categorias predominantes de interfaces de usuário para sistemas de computação incluem:
- A interface de linha de comando, caracterizada pela entrada sequencial, linha por linha, de comandos textuais.
- A interface gráfica do usuário (GUI), que utiliza um ambiente visual, normalmente compreendendo uma combinação de elementos de janela, ícone, menu e ponteiro, chamados coletivamente de WIMP.
Em computadores pessoais, incluindo smartphones e tablets, bem como estações de trabalho, a entrada do usuário normalmente é facilitada por uma combinação de teclado, mouse, trackpad ou tela sensível ao toque, todos integrados ao sistema operacional por meio de software especializado. Os usuários de computadores pessoais não desenvolvedores frequentemente preferem GUIs para entrada e saída, e essas interfaces são amplamente suportadas na maioria das plataformas de computação pessoal. A infraestrutura de software subjacente necessária para GUIs é inerentemente mais complexa do que para entrada de linha de comando e saída de texto simples. Por outro lado, a saída de texto simples é frequentemente preferida pelos programadores e é comparativamente simples de implementar.
Desenvolvimento de sistema operacional amador
Um sistema operacional de hobby normalmente é caracterizado por código não derivado diretamente de um sistema operacional existente, possuindo uma base de usuários limitada e um pequeno número de desenvolvedores ativos.
O desenvolvimento amador pode envolver o suporte a dispositivos de computação customizados, como um computador básico de placa única utilizando um microprocessador 6502, ou pode ter como alvo arquiteturas já predominantes no mercado. A criação de sistemas operacionais neste contexto pode resultar de novas conceituações ou envolver a modelagem de sistemas existentes. Independentemente da abordagem, o hobbyista normalmente funciona como o único desenvolvedor ou colabora com um grupo pequeno, muitas vezes informal, de indivíduos que compartilham interesses semelhantes.
Exemplos notáveis de sistemas operacionais desenvolvidos por hobbyistas incluem Syllable e TempleOS.
Diversidade e portabilidade do sistema operacional
Quando um aplicativo é desenvolvido para um sistema operacional específico e subsequentemente portado para outro, as funcionalidades necessárias podem exibir implementações distintas em diferentes sistemas operacionais, incluindo variações nos nomes das funções e na semântica dos argumentos. Essa divergência exige adaptação, modificação ou manutenção contínua do aplicativo.
As despesas associadas à acomodação de diversos sistemas operacionais podem ser mitigadas pelo desenvolvimento de aplicativos para estruturas de software de plataforma cruzada, como Java ou Qt. Essas camadas abstratas já absorveram as complexidades de adaptação a vários sistemas operacionais e suas respectivas bibliotecas de sistema.
Uma estratégia alternativa envolve a adoção de protocolos padronizados pelos fornecedores de sistemas operacionais. Por exemplo, o POSIX e várias camadas de abstração do sistema operacional estabelecem pontos em comum que reduzem efetivamente as despesas associadas à portabilidade de software.
Sistemas operacionais proeminentes
Em outubro de 2025, o Android, que é baseado no kernel Linux, detinha a maior participação de mercado entre os sistemas operacionais, com 38%. É seguido pelo Microsoft Windows com 31%, iOS e iPadOS coletivamente com 15%, macOS com 7% e Linux com 1%. Notavelmente, Android, iOS e iPadOS são categorizados como sistemas operacionais móveis, enquanto Windows, macOS e Linux são utilizados principalmente como sistemas operacionais de desktop.
Sistema operacional Linux
Linux é um sistema de software livre distribuído sob a Licença Pública Geral GNU (GPL), que determina legalmente que todos os trabalhos derivados devem divulgar seu código-fonte. Seu design inicial, concebido por programadores para utilidade pessoal, priorizou simplicidade e consistência, incorporando um conjunto limitado de componentes fundamentais capazes de combinações virtualmente ilimitadas enquanto minimizava a redundância.
O design arquitetônico do Linux se assemelha ao de outros sistemas UNIX que não empregam um microkernel. Ele é implementado em C e utiliza a sintaxe UNIX System V, ao mesmo tempo que oferece suporte à sintaxe BSD. O Linux incorpora funcionalidades de rede padrão UNIX e o conjunto completo de ferramentas UNIX, juntamente com suporte para múltiplos usuários e a implementação de multitarefa preemptiva. Embora inicialmente concebido com um design minimalista, o Linux é um sistema altamente adaptável, capaz de operar com menos de 16 MB de RAM, mas permanece viável para sistemas multiprocessadores de grande escala. Consistente com outros sistemas UNIX, as distribuições Linux normalmente incluem um kernel, bibliotecas de sistema e utilitários de sistema. O Linux apresenta uma interface gráfica de usuário (GUI) que inclui um ambiente de área de trabalho, ícones de pastas e arquivos, e também oferece a opção de acesso de interface de linha de comando ao sistema operacional.
O Android é um sistema operacional parcialmente de código aberto derivado do Linux e emergiu como o sistema operacional mais prevalente em todo o mundo, principalmente devido à sua ampla adoção em smartphones e, em menor grau, em sistemas embarcados que exigem uma interface gráfica de usuário, como smartwatches, painéis automotivos, encostos de assentos de aviões, dispositivos médicos e eletrodomésticos. Em contraste com o Linux, uma parte significativa do Android é desenvolvida em Java e emprega um paradigma de design orientado a objetos.
Sistema operacional Microsoft Windows
O Windows é um sistema operacional proprietário amplamente implantado em vários dispositivos, incluindo computadores desktop, laptops, tablets, telefones, estações de trabalho, servidores corporativos e consoles Xbox. Seus objetivos iniciais de projeto incluíam segurança, confiabilidade, compatibilidade, alto desempenho, extensibilidade, portabilidade e suporte internacional. Posteriormente, a eficiência energética e o suporte dinâmico a dispositivos foram integrados como principais prioridades.
O Windows Executive opera por meio de objetos no modo kernel para gerenciar estruturas de dados críticas, como processos, threads e seções (por exemplo, arquivos mapeados na memória). O sistema operacional suporta paginação sob demanda para memória virtual, o que melhora significativamente o desempenho de E/S para vários aplicativos. Os drivers de dispositivo de entrada/saída utilizam o modelo de driver do Windows. O sistema de arquivos NTFS emprega uma tabela mestre de arquivos, onde cada arquivo é representado por um registro contendo seus metadados. Seu mecanismo de agendamento incorpora multitarefa preemptiva. O Windows integra vários recursos de segurança; particularmente significativa é a implementação de listas de controle de acesso e níveis de integridade. Cada processo recebe um token de autenticação e cada objeto recebe um descritor de segurança. Os lançamentos subsequentes aumentaram ainda mais seus recursos de segurança.
Notas
Referências
- A história do Multics e a história dos sistemas operacionais