Prévia do material em texto
SISTEMAS OPERACIONAIS AULA 1 Prof. André Roberto Guerra CONVERSA INICIAL Computadores são dispositivos eletrônicos criados para auxiliar nas tarefas do cotidiano das pessoas. São máquinas incríveis, com grande poder de processamento e capacidade de armazenamento. Os denominados sistemas de computação são compostos basicamente pelo hardware (dispositivos físicos) e software (tarefas e rotinas previamente programadas) de forma dependente, ou seja, só funcionam juntos, sendo praticamente inúteis sozinhos. Essa interdependência é inicialmente comprovada pela necessidade de gerenciar os componentes do hardware para funcionar corretamente, pois, quando ligados, os circuitos eletrônicos ficam disponíveis para receber instruções ou tarefas, mas, se não forem enviadas, tornam- se apenas uma peça decorativa. Os sistemas computacionais eram a princípio grandes mainframes ou desktops, mas atualmente, com o advento da internet das coisas (internet of things – IoT), eles estão presentes em quase todos os dispositivos que utilizamos, como smartphones, tablets, smartwatches, smartTVs, consoles de jogos, entre outros. Mesmo tão presentes no cotidiano das pessoas, poucos sabem que, para que todos esses equipamentos nos auxiliem nas tarefas a que se propõem, são necessárias rotinas de gestão e controle, implementadas em software e denominadas sistemas operacionais. Eles são responsáveis pela inicialização do hardware pelo kernel, e também pelo controle e gestão segura dos dispositivos, dos processadores (CPU), das memórias e da entrada e saída de dados. Também é responsável pela gestão e pelo controle do armazenamento e do uso de arquivos, escalonamento de tarefas e gerenciamento de processos e recursos. Em síntese, é um grande gestor das atividades do computador que interage com o usuário. É importante conhecer e entender essas tarefas de gestão e seus conceitos relacionados para compreendermos o que é necessário para escolher, instalar, configurar e administrar sistemas operacionais, desde a inicialização até a utilização pelo usuário final. Nesta disciplina, além de desenvolver as competências necessárias para essas atividades, apresentaremos e definiremos diversas outras rotinas. O conteúdo previsto contempla inicialmente os conceitos e as definições de sistema operacional, numa visão geral, com um breve histórico e evolução, apresentando seus objetivos e funções. Também apresentaremos sua classificação pela arquitetura e pelos tipos e exemplos de sistemas operacionais. Seguindo a definição de gestão apresentada, nesta disciplina veremos a gerência: De processador e de processos; De memória; De dispositivos de entrada e saída; De arquivos; De proteção de usuários. E os temas desta aula são: 1. Conceitos e definições de sistema operacional – visão geral; 2. Histórico e evolução; 3. Objetivos e funções; 4. Arquitetura e classificação; 5. Tipos e exemplos. Aproveite o conteúdo e bons estudos! TEMA 1 – CONCEITOS E DEFINIÇÕES INICIAIS – VISÃO GERAL Segundo Tanenbaum e Bos (2016), sistema operacional é um programa que, do ponto de vista do programador, acrescenta uma variedade de novas instruções e características acima e além do que o nível ISA fornece. Normalmente, o sistema operacional é implementado, em grande parte, em software, mas não há nenhuma razão teórica para não ser colocado em hardware, como acontece com os microprogramas (quando estão presentes). Para abreviar, chamamos o nível que ele implementa de operating system machine (OSM), ou seja, “nível de máquina de sistema operacional”. Stallings (2017) define sistema operacional como um programa que gerencia os recursos do computador, fornece serviços para os programadores e estabelece uma ordem de execução de outros programas. É essencial certo conhecimento sobre sistemas operacionais para entender os mecanismos pelos quais a CPU controla o computador – em particular, o efeito das interrupções e o gerenciamento da hierarquia de memória. Sistema operacional é o software que controla a execução de programas num processador e gerencia os recursos do computador. Diversas funções desempenhadas pelo sistema operacional, incluindo as duas mais relevantes para estudar a arquitetura e organização de computadores – escalonamento de processos e gerenciamento de memória –, só podem ser executadas de modo rápido e eficiente se ele dispuser de um suporte adequado do hardware do processador. Quase todos os processadores dispõem desse suporte, em maior ou menor extensão, incluindo hardware de gerenciamento de memória virtual e de gerenciamento de processos. Isso inclui registradores de propósito especial e áreas de armazenamento temporário, além de um conjunto de circuitos para tarefas básicas de gerenciamento de recursos. assim, um sistema de computação é constituído basicamente de dois elementos interdependentes: o hardware e o software. O primeiro é basicamente composto de circuitos eletrônicos internos: CPU (processador), memórias (primárias e secundárias), portas de comunicação (entrada/saída), entre outros, como os periféricos externos (teclado, mouse, monitor, câmera, microfone, dispositivos USB etc.). O segundo, por sua vez, é composto basicamente de duas categorias: 1. Software de aplicação, representado por programas destinados ao usuário do sistema, que constitui a razão final de seu uso (exemplo: editores de texto, multimídia players, editores de imagem, jogos etc.); 2. Software de sistema, que está entre os aplicativos e o hardware. Trata-se de uma camada de software multifacetada e complexa, denominada genericamente de sistema operacional, como ilustra a Figura 1. Figura 1 – Sistema operacional Fonte: I000S_Pixels; Hani Suwaryo; Crystal Eye Studio; Marisha; Den Rozhnovsky; Weera.OTP; DND_Project; Nerthuz/Shutterstock. A Figura 1 apresenta o sistema operacional como uma fronteira, uma interface entre o hardware e os aplicativos. É ele que gerencia e orienta a fantástica transformação de pulsos elétricos do hardware (representados pelos binários 0 e 1) nas mais diversas aplicações. São essenciais para o funcionamento de todos os sistemas de computação, desde os smartphones aos supercomputadores. Mesmo sendo muitos os sistemas operacionais existentes, eles têm e seguem as mesmas regras e princípios. Devido à sua complexidade e ao seu tamanho, o aprendizado de sistemas operacionais é tido como algo reservado a especialistas ou hackers, contudo, é na verdade essencial para todos os profissionais de computação, pois as ferramentas implementadas nos algoritmos dos sistemas operacionais afetam diretamente o comportamento e o desempenho das aplicações. São também responsáveis pelos serviços de rede e pela segurança do sistema e dos utilizadores. TEMA 2 – HISTÓRIA E EVOLUÇÃO A primeira geração de computadores – também chamada de Geração 0 – foi a geração dos computadores mecânicos, acionados por engrenagens e manivelas, dependendo totalmente do usuário – o operador do sistema. Todas as tarefas eram manuais, e ainda não havia recursos para automatizá-las eletronicamente. Descrever a história e a evolução dos sistemas operacionais e dos computadores é muito conveniente pois, até a 3ª geração dos computadores (1965-1980), descrita pelo cientista Robert Noyce na integração de circuitos – o chip –, os computadores dependiam exclusivamente do conhecimento e da habilidade de seus operadores – os usuários. Foi somente na 3ª geração que os sistemas operacionais iniciaram seu desenvolvimento, como descreveremos aqui. Os computadores têm sua história descrita e apresentada em 6 gerações. As 3 primeiras são de computadores sem sistemas operacionais. Eram as seguintes: 0. Mecânicos (1642-1945); 1. Válvulas (1945-1955); 2. Transistores (1955-1965). As 3 gerações seguintes são as de computadores com sistemas operacionais: 3. Integração (1965-1980); 4. Muita integração (1980-?); 5. Computadores invisíveis (atualmente). 2.1GERAÇÃO 0 (MECÂNICOS) (1642-1945): MÁQUINAS SEM SISTEMA OPERACIONAL Surgiram no século XVII e eram compostos exclusivamente de elementos mecânicos, com grande rigidez nos programas a executar. Hoje são chamadas de máquina dedicadas. As Figuras 2, 3 e 4 ilustram alguns exemplos dessa geração: Figura 2 – Calculadora de Pascal (1642) Crédito: © CC-20/Edal Anton Lefterov. Figura 3 – Máquina diferencial Babbage (1823) Crédito: © CC-20/GFDL CC-BY-SA. Figura 4 – Máquina Hollerith (1886) Crédito: © CC-20/Adam Schuster. A geração dos mecânicos tem como marco histórico a máquina de Turing. Colossus: o primeiro computador, mas ainda considerado mecânico, foi criado em 1946 por Allan Turing, semelhante a um autômato finito, com memória ilimitada e irrestrita. Era capaz de fazer tudo que um computador real faz, entretanto não resolvia certos problemas. O modelo de Turing usava uma fita infinita como memória, tendo uma cabeça de fita que podia se mover, ler e escrever símbolos. Inicialmente, a fita continha apenas a entrada, e todo o restante estava em branco. Para armazenar informação, escrevia sobre a fita, e para ler informação escrita, movia a cabeça para a posição em que a informação era escrita, continuando a computar até produzir uma saída. As saídas “aceite” e “rejeite” eram obtidas entrando em estados designados de aceitação e rejeição. Se não entrasse em estado de aceitação ou rejeição, continuava para sempre, sem parar. 2.2 GERAÇÃO 1 (VÁLVULAS) (1945-1955): COMPUTADORES ELETRÔNICOS, AINDA SEM SISTEMA OPERACIONAL Essa é a primeira geração de computadores modernos. As válvulas necessitavam de muito tempo para aquecer e consumiam muita energia elétrica. Eram grandes, porém frágeis, sua manutenção era cara, e sua programação, feita com a ligação de fios ou cartões. Seus circuitos eram interligados por quilômetros de fios instalados manualmente, atingindo velocidades na ordem de milissegundos (1/1.000). John Mauchley (1907-1980) e Presper Eckert (1919-1995) construíram o Eniac em 1946, o 1º computador eletrônico. Figura 5 – Eniac Crédito: Everett Historical/Shutterstock. Ele tinha 18 mil válvulas e 1,5 mil relés, pesava 30 toneladas e tinha 20 registradores. Consumia 140 quilowatts, e sua programação era feita em 6 mil chaves (Figura 6). Figura 6 – Operação do Eniac Crédito: © CC-20/U.S. Army Photo. O matemático John von Neumann (1903-1957) foi colaborador do projeto Eniac, cujo aperfeiçoamento foi o IAS, referência ao local onde foi desenvolvido – o Institute for Advanced Studies, da universidade de Princeton. Credita-se a von Newmann a definição de uma arquitetura de computadores com programa armazenado, utilizado até hoje. A Figura 7 ilustra essa definição: Figura 7 – Arquitetura de von Neumann Fonte: Guerra, 2020. Ele é considerado o “pai” do computador, pois em sua arquitetura utiliza aritmética binária e a organização em quatro unidades: 1. Memória; 2. Unidade aritmética e lógica; 3. Unidade de controle; 4. Parte de E/S. A arquitetura de von Neumann apresenta computadores de programa armazenado, armazenando dados e programas na memória, e com ciclo de instrução repetitivo, executando cada instrução com base numa sequência de etapas programadas. As características básicas do IAS o apresentam como fundamental no estudo de arquitetura de computadores. Suas especificações continuam válidas até hoje e têm memória com mil posições, denominadas palavras, cada uma com valor de 40 bits. Seu dados e suas instruções são representadas em binários e gravadas (memória); 21 instruções de 20 bits, com 2 campos de 8 bits (código de operação); e outro com 12 bits (endereço) para localizar cada uma das mil palavras, com endereços de 000 a 999. 2.3 GERAÇÃO 2 – TRANSISTORES (1955-1965): OS PRIMEIROS PROJETOS DE SISTEMA OPERACIONAL John Bardeen (1908-1991), Walter Brattain (1902-1987) e William Shockley (1910-1989), funcionários da AT&T, criaram o transistor. Com as mesmas funções das válvulas, mas com custo menor, consumem menos energia, são mais rápidos e confiáveis, sendo utilizados até hoje. Nessa geração foram criados os barramentos, um conjunto de fios paralelos usados para conectar os componentes de um computador. Trata-se de uma ruptura importante em relação à arquitetura da máquina IAS, centrada na memória e, desde então, foi adotada pela maioria dos computadores de pequeno porte. Foi apenas em 1953 que se iniciou o desenvolvimento do primeiro sistema operacional – por sua simplicidade, chamado de monitor –, desenvolvido pelos usuários do computador IBM 701, do Centro de Pesquisas da General Motors, para tentar automatizar tarefas até então manuais. Posteriormente, esse sistema seria reescrito para um computador IBM 704, pelo grupo de usuários da IBM (Weizer, 1981). Em 1961, o pesquisador Fernando Corbató, do Massachusetts Institute of Technology (MIT), com seu grupo de pesquisa, anunciou o desenvolvimento do compatible time-sharing system (CTSS), o primeiro sistema operacional com compartilhamento de tempo (Corbató; Daggett; Daley, 1962). 2.4 GERAÇÃO 3 – INTEGRAÇÃO (1965-1980): INÍCIO DOS SISTEMAS OPERACIONAIS Essa foi a geração das “famílias de computadores”: mesmo tipo de máquina, com diferentes capacidades e preços. Tinham uma unidade de controle com microprogramação e multiprogramação, e vários programas compartilhavam a memória e dividiam CPU. Com alta capacidade de processamento, utilizavam 32 bits e instrução de 250 nanossegundos, com memória de 16 Mbytes. Sua memória principal era orientada a byte, com um conjunto de programas gerenciadores de recursos de hardware – o sistema operacional. Essa geração tornou-se muito importante pois, além do sistema operacional, integrou os circuitos pelo chip. Em 1968, Robert Noyce e Gordon Moore fundaram a Intel Corporation, criadora do chip de memória de 1 KB e da lei de Moore: a integração de transistores em circuito integrado dobra a cada 24 meses, mantendo-se os custos. Em 1965, a IBM lançou o OS/360, um sistema operacional avançado, com compartilhamento de tempo e um excelente suporte a discos. No mesmo ano, um projeto conjunto entre MIT, General Electric (GE) e Bell Labs definiu o multiplexed information and computing service (Multics), que por décadas influenciou vários outros sistemas operacionais. Em 1969, Ken Thompson e Dennis Ritchie, pesquisadores da Bell Labs, desenvolveram a primeira versão do Unix. 2.5 GERAÇÃO 4 – MUITA INTEGRAÇÃO (1980-?): POPULARIZAÇÃO DOS COMPUTADORES E DOS SISTEMAS OPERACIONAIS Marcian Hoff Junior, engenheiro da Intel, criou o Intel 4004, um microprocessador de 4 bits e 108 KHz, que tinha 2.300 transistores, velocidade de 60 mil operações/s e preço inicial de US$ 200. Desde 1980, a miniaturização dos componentes internos e os avanços se relacionaram à escala de integração dos circuitos integrados. A partir daqui, os sistemas operacionais ganharam destaque e tiveram sua importância reconhecida. É nessa geração que famosas empresas foram fundadas e conceitos foram criados. Acompanhe. O primeiro destaque é o lançamento do sistema operacional da empresa Microsoft, o MS-DOS, em 1981. Três anos após, em 1984, a Apple lançou o Mac OS 1.0, desenvolvido para os computadores da linha Macintosh, o primeiro sistema operacional a ter uma interface gráfica incorporada ao sistema. No ano seguinte, a Microsoft lançou o aplicativo com interface gráfica MS-Windows 1.0. Em 1987, Andrew S. Tanenbaum, professor de computação e autor de vários best-sellers, desenvolveu o Minix, um sistema operacional didático simplificado, baseado na API do Unix. No mesmo ano, a IBM e a Microsoft apresentaram a primeira versão de um sistema multitarefa destinado a substituir o MS-DOS e o Windows: o OS/2. A parceria foi rompida em seguida, e a IBM deu sequência ao OS/2, enquanto a Microsoft investiu no Windows. 2.6 GERAÇÃO 5 (ATUAL): COMPUTADORES INVISÍVEIS Tanenbaum e Bos (2016) definem nossa atual geração como a geração dos computadores invisíveis.Foi dado esse nome porque antigamente se falava que, no futuro (que é hoje), os computadores estariam por toda parte, embutidos nos mais diversos locais, executando inusitadas funções, como abertura de portas, acendimento de luzes, enfim, escondidos nos componentes (invisíveis). Em 1991, um estudante de graduação em ciência da computação, Linus Torvalds (aluno de Tanenbaum), utilizou o Minix como base para iniciar o desenvolvimento do Linux. Figura 8 – Logotipo do Linux Fonte: Rose Carson/Shutterstock. A Microsoft só retornou em 1993, com o lançamento do Windows NT, o primeiro sistema 32 bits da empresa. No mesmo ano, houve o lançamento dos Unix de código aberto – FreeBSD e NetBSD –, e a Apple lançou o Newton OS, considerado o primeiro sistema operacional móvel, com gestão de energia e suporte para tela de toque. Nos anos seguintes, muitos novos sistemas operacionais surgiram. Listamos alguns a seguir: 1995: Windows 95; 1996: Windows NT 4.0; Mac OS 7.6 (first officially-named Mac OS); 1998: Windows 98; Novell NetWare 5; 2000: Windows Millennium Edition; Windows 2000; 2001: Windows XP; Mac OS X Cheetah (v. 10.0) – o novo SO da Apple, com arquitetura distinta de suas versões anteriores, derivada da família Unix BSD; 2006: Windows Vista; 2007: iPhone OS 1 – lançamento do sistema operacional iOS, derivado do sistema operacional Darwin; 2008: Android 1.0 – SO baseado em Linux para dispositivos móveis; 2009: Windows 7; 2011: Solaris 11 11/11; 2012: Windows 8; Windows Phone 8; 2013: Windows CE 8.0; BlackBerry 10; 2015: Windows 10; 2017: Windows 10 Mobile Fall Creators Update; 2018: Windows Server 2019; iOS 13.1 – iPadOS 13.1; 2019: macOS Catalina (v10.15); 2020: Linux 5.6; NetBSD 9.0; Android 11. Apresentamos o registro histórico de apenas alguns destaques. Sugerimos que você consulte a bibliografia para conhecer muitas outras datas e sistemas operacionais. TEMA 3 – OBJETIVOS E FUNÇÕES Agora veremos os objetivos básicos do sistema operacional, como ele é estruturado para alcançá-los e quais desafios ele deve resolver. Existe uma grande distância entre circuitos eletrônicos, dispositivos de hardware e os programas aplicativos em software. Os circuitos são complexos, acessados por interfaces de baixo nível (geralmente usando as portas de entrada/saída do processador), e muitas vezes suas características e seu comportamento dependem da tecnologia usada em sua construção (Maziero, 2019). Por exemplo, a forma de acessar dados em disco (HD ou SSD) via hardware de baixo nível (Sata III) é muito diferente do acesso a dados semelhantes em cartão de memória ou leitores de discos óticos (DVD ou blu-ray). Toda essa grande diversidade de hardware pode tornar-se uma grande dificuldade para quem o utiliza (como desenvolvedores de aplicativo). Então é desejável que todas essas características e diferenças tecnológicas sejam abstraídas e se tornem invisíveis aos aplicativos e aos utilizadores do sistema computacional. É aqui que entra em cena o sistema operacional. Trata-se de uma camada de software que opera entre o hardware e os aplicativos, como vimos no Tema 1 e conforme a Figura 10. É um software de estrutura ampla e complexa que incorpora aspectos de baixo nível (como drivers de dispositivos e gerência de memória física) e de alto nível (como softwares utilitários e interface gráfica). Figura 10 – Estrutura típica de sistema operacional (Android) Fonte: Guerra, 2020. Stallings (2017) descreve que o sistema operacional é um programa que controla a execução de aplicativos e age como interface entre o usuário e o hardware do computador. Tem basicamente dois objetivos: 1. Conveniência: um sistema operacional visa tornar mais conveniente o uso do computador; 2. Eficiência: um sistema operacional permite uma utilização mais eficiente dos recursos do sistema. Os objetivos básicos de um sistema operacional, descritos por Maziero (2019), podem ser sintetizados em duas palavras-chave: abstração e gerência. Vejamos em detalhes seus principais aspectos. Abstração de recursos: acessar os recursos de hardware de um sistema de computação pode ser uma tarefa complexa, devido às características específicas de cada dispositivo físico e à complexidade de suas interfaces. Assim, o sistema operacional deve definir interfaces abstratas para os recursos do hardware, visando atender os seguintes objetivos: Prover interfaces de acesso mais simples que as de baixo nível, para simplificar a construção de aplicativos. Por exemplo: para ler dados de um disco rígido, um programador de aplicação usa o conceito de arquivo, que implementa uma visão abstrata do disco rígido, acessível por operações como open, read e close. Se tivesse que acessar o disco diretamente, seria necessário manipular portas de entrada/saída e registradores com comandos para o controlador de disco (sem falar na dificuldade de localizar os dados desejados dentro do disco); Tornar os aplicativos independentes do hardware. Ao definir uma interface abstrata de acesso a um dispositivo de hardware, o sistema operacional desacopla o hardware dos aplicativos e permite que ambos evoluam de forma mais autônoma. Por exemplo, o código de um editor de textos não deve depender da tecnologia de discos utilizada no sistema; Definir interfaces de acesso homogêneas para dispositivos com tecnologias distintas. Com suas abstrações, o sistema operacional permite aos aplicativos usar a mesma interface para dispositivos diversos. Por exemplo, um aplicativo acessa dados em disco por meio de arquivos e diretórios, sem precisar se preocupar com a estrutura real de armazenamento dos dados, que podem estar num disquete, num disco Sata, numa máquina fotográfica digital conectada à porta USB, num CD ou mesmo num disco remoto, compartilhado pela rede. O hardware e o software usados para fornecer aplicações aos usuários podem ser vistos sob a forma de uma organização hierárquica (ou em camadas), conforme a Figura 11. Figura 11 – Camadas e visões de um sistema de computação Fonte: Stallings, 2017. O usuário final – que vai utilizar essas aplicações – geralmente não se interessa pela arquitetura do computador nem pelos detalhes do hardware. Ele vê o sistema de computação como uma aplicação, pois os aplicativos são a última camada entre o sistema e o usuário, trazendo assim a interface entre eles. Os softwares de aplicação (apps) são desenvolvidos numa linguagem de programação por um analista/desenvolvedor. Se fossem escritos usando o conjunto de instruções do processador e, além disso, tivessem também que controlar o hardware do computador, a tarefa de desenvolver programas seria extremamente complexa, quase impossível. Para facilitar essa tarefa, existe um conjunto de programas de sistema. Alguns desses programas são conhecidos como utilitários, que implementam funções usadas frequentemente e criam programas, gerenciam arquivos e controlam dispositivos de E/S. Um programador usa esses recursos para desenvolver uma aplicação que, ao ser executada, invoca os utilitários para desempenhar certas funções. O software de sistema mais importante é o sistema operacional, que esconde os detalhes do hardware do programador, fornecendo uma interface conveniente para o uso do sistema. Ele age como um mediador, facilitando o acesso e o uso de aplicativos e serviços para o programador. O sistema operacional tipicamente fornece serviços para as seguintes atividades, que descrevem algumas de suas funções: Criação de programas: o sistema operacional apresenta uma variedade de recursos e serviços para auxiliar o programador a desenvolver programas, como editores e depuradores. Esses serviços tipicamente são oferecidos na forma de programas utilitários, que na verdade não são parte do sistema operacional, mas podem ser acessados por ele; Execução de programas: várias tarefas precisam ser cumpridas para um programa ser executado. Instruções e dados devem ser carregados na memória principal. Dispositivosde E/S e arquivos precisam ser inicializados, e outros recursos devem ser preparados. O sistema operacional cumpre todas essas tarefas para o usuário; Acesso a dispositivos de E/S: cada dispositivo de E/S tem seu próprio conjunto peculiar de instruções ou sinais de controle para operação. O sistema operacional cuida dos detalhes do uso de cada dispositivo, de modo que o programador possa pensar apenas em termos de operações simples de leitura e de escrita; Acesso controlado aos arquivos: no caso de arquivos, o controle deve incluir não apenas um entendimento sobre a natureza do dispositivo de E/S (unidade de disco ou de fita), mas também sobre o formato dos arquivos no meio de armazenamento. Mais uma vez, o sistema operacional cuida dos detalhes. Além disso, no caso de sistemas usados simultaneamente por vários usuários, ele fornece mecanismos de proteção para controlar o acesso aos arquivos; Acesso ao sistema: no caso de sistemas compartilhados ou públicos, o sistema operacional controla o acesso ao sistema como um todo e a recursos específicos também. A função de acesso deve proteger o sistema contra o uso não autorizado, tanto para recursos quanto para dados de usuários, e resolver conflitos em caso de contenção de um recurso; Detecção e reação aos erros: diversos erros podem ocorrer durante a operação de um sistema de computação, incluindo erros de hardware internos e externos, como erro de memória e falha, ou mau funcionamento de dispositivo, além de vários erros de software, como overflow em operação aritmética, tentativa de endereçar uma área de memória não permitida e a impossibilidade de o sistema operacional atender à requisição de uma aplicação. Em cada caso, o sistema operacional deve reagir no sentido de eliminar a condição de erro, com o menor impacto possível sobre as aplicações em execução. Essa reação pode variar, desde terminar a execução do programa que causou o erro até tentar executar novamente a operação ou, simplesmente, relatar a ocorrência do erro à aplicação; Monitoração: um bom sistema operacional mantém estatísticas de uso de vários recursos e monitora parâmetros de desempenho, como o tempo de resposta. Em qualquer sistema, essa informação é útil para antecipar a necessidade de futuros melhoramentos e para a sintonia do sistema, aumentando seu desempenho. Num sistema multiusuário, essa informação também pode ser usada para tarifação, pela utilização de recursos. 3.1 SISTEMA OPERACIONAL COMO GERENTE DE RECURSOS – UM OBJETIVO E UMA FUNÇÃO Os aplicativos utilizam o hardware para atingir seus objetivos e tarefas, como criar, editar e imprimir documentos, tocar músicas, exibir vídeos e imagens, ler e armazenar arquivos de dados e informações, conectar-se à internet, entre outros. Num sistema com várias atividades simultâneas (multitarefas), podem ocorrer conflitos na utilização do hardware, quando duas ou mais tarefas precisam dos mesmos recursos para ser executadas. Uma das funções do sistema operacional é definir políticas para gerenciar o uso dos recursos de hardware pelos aplicativos e resolver eventuais disputas e conflitos. O sistema operacional é o responsável por gerenciar o uso desses recursos. Portanto, é o sistema operacional que controla o processamento, o armazenamento e a transferência de dados, pois, gerenciando os recursos do computador, o sistema detém o controle das suas funções básicas. Esse controle é exercido de maneira curiosa. Normalmente, pensamos no mecanismo de controle como algo externo ao que é controlado ou, pelo menos, como algo que é uma parte distinta e separada do que é controlado (por exemplo, um sistema de aquecimento residencial é controlado por um termostato, que é completamente distinto do sistema de geração de calor e do aparato de distribuição de calor). Não é o caso do sistema operacional que, como mecanismo de controle, é incomum em dois aspectos: O sistema operacional é um software como outro qualquer, sendo executado pelo processador, e o sistema operacional frequentemente renuncia ao controle do processador para, em seguida, obter o controle novamente; nada mais é do que um programa de computador. Semelhante a outros softwares, ele contém instruções para o processador; a diferença-chave está na intenção do programa. O sistema operacional direciona o processador no uso dos recursos do sistema, assim como na execução de outros programas. Mas, para que o processador execute outros programas, ele deve interromper a execução do sistema operacional. Dessa maneira, ele libera o controle ao processador, para que ele possa executar algum trabalho “útil”, e então retoma o controle por tempo suficiente para preparar o processador e executar uma próxima tarefa. A Figura 12 apresenta os principais recursos gerenciados pelo sistema operacional: Figura 12 – Camadas e visões de um sistema de computação Fonte: Stallings, 2017. Uma parte do sistema operacional reside na memória principal (RAM). Essa parte inclui o núcleo (kernel), que contém as funções mais usadas pelo sistema operacional, além de outras partes do sistema operacional em uso naquele momento. Outros dados e programas de usuário ocupam o restante da memória principal (RAM). Então, a gestão da memória é feita com a alocação controlada, em conjunto, pelo sistema operacional e pelo hardware de gerenciamento de memória da CPU. A gestão de recursos (dispositivos) de E/S é outra tarefa do sistema operacional, que decide quando um dispositivo de E/S pode (ou não) ser usado pelo programa em execução, controlando o acesso e o uso de arquivos. A seguir, apresentamos exemplos de gestão de recursos do hardware. A concorrência pela utilização do tempo de CPU (que futuramente estudaremos) é essencial para que ocorra um grande número de tarefas pelo mesmo computador, que normalmente tem mais tarefas a processar do que a quantidade de processadores disponíveis, complementando o conceito de redução da ociosidade da CPU. O gerenciamento de recursos é fundamental para balancear sua utilização, com distribuição justa entre os aplicativos e para que cada um deles seja executado na velocidade adequada, cumprindo suas funções sem prejudicar as demais. No caso de um sistema de computação com múltiplos processadores, essa decisão se estende a todos eles. Essa função é a gerência do processador – também conhecida como gerência de processos, de tarefas ou de atividades –, que visa distribuir a capacidade de processamento de forma justa entre as aplicações, evitando que uma aplicação monopolize esse recurso, respeitando, assim, as prioridades definidas pelos usuários. O sistema operacional provê a ilusão de que existe um processador independente para cada tarefa, o que facilita o trabalho dos programadores de aplicações e permite construir sistemas mais interativos. Também faz parte da gerência de atividades fornecer abstrações para sincronizar atividades interdependentes e prover formas de comunicação entre elas. O mesmo ocorre com a memória RAM, que também deve ser distribuída de forma justa entre as aplicações. Aqui é descrita então a gerência de memória, cujo objetivo é fornecer a cada aplicação uma área de memória própria, independente e isolada das demais aplicações, inclusive do sistema operacional. O isolamento das áreas de memória das aplicações melhora a estabilidade e segurança do sistema como um todo, pois impede aplicações com erros (ou aplicações maliciosas) de interferir no funcionamento das demais aplicações. Além disso, caso a memória RAM existente seja insuficiente para as aplicações, o sistema operacional pode aumentá-la de forma transparente às aplicações, usando o espaço disponível num meio de armazenamento secundário (como um disco rígido). Uma importante abstração construída pela gerência de memória (com o auxílio do hardware) é a noção de memória virtual, que desvincula os endereços de memória vistos por cada aplicação dos endereços acessados pelo processador na memória RAM. Com isso, umaaplicação pode ser carregada em qualquer posição livre da memória, sem que seu programador se preocupe com os endereços de memória em que ela irá executar. A gerência de dispositivos, por sua vez, recebe destaque, pois cada periférico do computador tem suas particularidades; assim, o procedimento de interação com uma placa de rede é completamente diferente da interação com um disco rígido Sata. Todavia, existem muitos problemas e abordagens em comum para o acesso aos periféricos. Por exemplo, é possível criar uma abstração única para a maioria dos dispositivos de armazenamento, como cartão de memória, SSD, CD-ROMs etc., na forma de um vetor de blocos de dados. A função da gerência de dispositivos (também conhecida como gerência de entrada/saída) é implementar a interação com cada dispositivo por meio de drivers e criar modelos abstratos que permitam agrupar vários dispositivos similares sob a mesma interface de acesso. Outro recurso em que o acesso deve ser mutuamente exclusivo (apenas um aplicativo por vez) é a impressão. O sistema operacional resolve essa questão utilizando o recurso de spooling (que estudaremos futuramente), além de definir uma fila de trabalhos a imprimir (print jobs), normalmente executados de forma sequencial (first in, first out). A gerência de arquivos é construída sobre a gerência de dispositivos e visa criar arquivos e diretórios, definindo sua interface de acesso e as regras para seu uso. É importante observar que os conceitos abstratos de arquivo e diretório são tão importantes e difundidos que muitos sistemas operacionais costumam usá-los para permitir o acesso a recursos que nada têm a ver com armazenamento. Exemplos disso são as conexões de rede (nos sistemas Unix e Windows, cada socket TCP é visto como um descritor de arquivo, com o qual pode-se ler ou escrever dados) e as informações internas do sistema operacional (como o diretório Proc do Unix). A gerência de proteção de dados e usuários é outra importante tarefa de gestão de recursos. Com computadores conectados em rede e compartilhados por vários usuários, é importante definir claramente os recursos que cada usuário pode acessar, as formas de acesso permitidas (leitura, escrita etc.), além de garantir que essas definições sejam cumpridas. Por exemplo, a proteção contra os ataques de negação de serviço (denial of service – DoS ), comuns na internet. É responsabilidade do sistema operacional do servidor detectar e impedir ataques como esses, em que todos os recursos do sistema são monopolizados por um único usuário. Para proteger os recursos do sistema contra acessos indevidos, é necessário: Definir usuários e grupos de usuários; Identificar os usuários que se conectam ao sistema por procedimentos de autenticação; Definir e aplicar regras de controle de acesso aos recursos, relacionando todos os usuários, recursos e formas de acesso, aplicando essas regras por procedimentos de autorização; Registrar o uso dos recursos pelos usuários, para fins de auditoria e contabilização. Assim, um sistema operacional visa abstrair o acesso e gerenciar os recursos de hardware, provendo aos aplicativos um ambiente de execução abstrato, no qual o acesso aos recursos se faz por interfaces simples, independentes das características e detalhes de baixo nível, minimizando os conflitos no uso do hardware (Maziero, 2019). As principais funções dos sistemas operacionais estão diretamente ligadas aos objetivos, pois, para cumprir os objetivos de abstração e gerência, eles devem atuar em várias frentes. Cada um dos [1] recursos do sistema tem suas particularidades, que impõem exigências específicas para gerenciá-los e abstraí-los. Essas são as principais funcionalidades implementadas por um sistema operacional típico. Além dessas funcionalidades básicas oferecidas pela maioria dos sistemas operacionais, várias outras se agregam aos sistemas modernos, para cobrir aspectos complementares, como a interface gráfica, suporte de rede, fluxos multimídia, fontes de energia etc. As funcionalidades do sistema operacional geralmente são interdependentes: por exemplo, a gerência do processador depende de aspectos da gerência de memória, assim como a gerência de memória depende da gerência de dispositivos e da gerência de proteção. TEMA 4 – ARQUITETURA: CLASSIFICAÇÃO É essencial conhecer as diferenças entre as arquiteturas dos sistemas operacionais para escolher o mais adequado a cada situação. Algumas características básicas diferenciam os vários tipos de sistemas operacionais, que são classificados, segundo a arquitetura, quanto ao tempo de resposta e à entrada de dados em sistema operacional, em lote (batch), interativos, tempo real e híbridos. Essas características envolvem dois aspectos independentes. O primeiro especifica se o sistema de computação é interativo ou é se um sistema de processamento em lotes (batch). Num sistema interativo, o programador/usuário interage diretamente com o computador, normalmente com um teclado e um monitor de vídeo, para requisitar a execução de tarefas (jobs) ou efetuar transações. Além disso, ele pode, dependendo da natureza da aplicação, comunicar-se com o computador durante a execução de uma tarefa. Num sistema de processamento em lotes (batch), ocorre o oposto. O programa de um usuário é agrupado com programas de outros usuários, e esse lote de programas é submetido à execução por um operador de computador. Quando a execução do programa termina, os resultados são impressos para ser entregues ao usuário. Hoje em dia são raros os sistemas que fazem processamento exclusivamente em lotes, no entanto, é útil examiná-los brevemente para entendermos melhor os sistemas operacionais atuais. O batch não exige interação com o usuário. A entrada de dados é feita por um dispositivo, geralmente arquivos em disco, processamento de cálculos, compilações, ordenações e backups. Os sistemas interativos – também conhecidos como sistemas de tempo compartilhado – geralmente permitem a interação com usuário por meio de terminais, vídeo, teclado e mouse. Com os sistemas de processamento em tempo real, o tempo de resposta é o fator principal do sistema, utilizado em monitoramentos, controle de tráfego aéreo, de usinas nucleares etc. Os sistemas híbridos são uma combinação de sistema batch com sistemas interativos. Quanto à execução de tarefas, os sistemas operacionais são classificados como sistemas monotarefa, multitarefa e multiprocessamento. Trata-se de outro aspecto independente, que especifica se o sistema de computação emprega multiprogramação ou não. A multiprogramação é uma tentativa de deixar o processador ocupado o maior tempo possível, mantendo-o trabalhando em mais de um programa de cada vez. Diversos programas são simultaneamente carregados na memória, e o tempo do processador é dividido entre eles. A alternativa para esse tipo é um sistema de monoprogramação (uniprogramação), que executa apenas um programa de cada vez. Os sistemas monotarefa executam uma única aplicação de cada vez; já nos sistemas multitarefa várias tarefas concorrem pelos recursos de processamento. Os sistemas multiprocessados têm duas ou mais CPUs interligadas, trabalhando em conjunto e fortemente ou fracamente acopladas. Os sistemas com multiprocessadores fortemente acoplados têm duas ou mais CPUs, que compartilham uma única memória e são controladas por um único sistema operacional. Os fracamente acoplados têm duas ou mais CPUs, cada uma com sua memória, sendo controladas por sistemas operacionais independentes. Quanto à estrutura, os sistemas operacionais são classificados basicamente como monolíticos, em camadas, máquinas virtuais e cliente servidor. Os sistemas operacionais ainda são classificados como sistemas operacionais de computadores de grande porte, servidores, computadores pessoais e sistemas operacionais embarcados. Os embarcados são sistemas que controlam dispositivos móveis ou que não são computadores, como micro-ondas, geladeiras,PDAs etc. Os sistemas operacionais modernos se dividem em várias camadas, e cada uma prova serviços à camada superior mais próxima, protegendo a camada mais inferior, o núcleo do sistema (ou kernel) do sistema operacional. Os recursos do kernel são acessados por chamadas de sistema (system calls) de forma protegida para não danificar o sistema. As instruções que têm o poder de comprometer o sistema são conhecidas como instruções privilegiadas (modo kernel), enquanto as instruções não privilegiadas não oferecem perigo. Chamadas de sistema são os comandos de acesso às funções do sistema operacional e podem ser divididos em chamadas: para gerenciar processos, para sinalização, para gerenciar arquivos, manipular diretórios, proteger e gerenciar o tempo. TEMA 5 – TIPOS E EXEMPLOS Já classificados e denominados, os sistemas operacionais passam então a dividir-se em grupos especializados, sendo mais indicados a certas demandas e menos a outras. A seguir, apresentamos alguns tipos de sistemas operacionais. Muitos se encaixam em mais de um deles. Vejamos: Batch (de lote): os sistemas operacionais mais antigos trabalhavam “por lote”, ou seja, todos os programas a executar eram colocados numa fila, com seus dados e demais informações para a execução. O processador recebia os programas e os processava sem interagir com os usuários, o que permitia um alto grau de utilização do sistema. Atualmente, esse conceito se aplica a sistemas que processam tarefas sem interação direta com os usuários, como os sistemas de processamento de transações bancárias. Além disso, o termo “em lote” também é usado para designar um conjunto de comandos que deve ser executado em sequência, sem interferência do usuário. Exemplos: os clássicos IBM OS/360 e o VAX/VMS, entre outros; De rede: um sistema operacional de rede deve ter suporte à operação em rede, ou seja, a capacidade de oferecer às aplicações locais recursos localizados em outros computadores conectados à rede, como arquivos e impressoras. Ele também deve disponibilizar seus recursos locais aos demais computadores de forma controlada. A maioria dos sistemas operacionais atuais oferece esse tipo de funcionalidade, dispensando exemplos; Distribuído: num sistema operacional distribuído, os recursos de cada computador estão disponíveis a todos que estejam conectados à rede, de forma transparente aos usuários. Ao lançar uma aplicação, o usuário interage com sua interface, mas não sabe onde está executando ou armazenando seus arquivos: o sistema é quem decide, de forma transparente ao usuário. Sistemas operacionais distribuídos já existem há muito tempo (como o Amoeba) (Tanenbaum et al., 1991); recentemente, os ambientes de computação em nuvem têm implementado esse conceito. Numa aplicação cloud (nuvem), o usuário interage com a interface da aplicação num computador ou telefone, mas não tem uma visão clara das máquinas em que seus dados estão sendo processados e armazenados. Exemplo: AWS (Amazon Web Services) e Docker; Multiusuário: um sistema operacional multiusuário deve suportar a identificação do “dono” de cada recurso dentro do sistema (arquivos, processos, áreas de memória, conexões de rede) e impor regras de controle de acesso para impedir o uso desses recursos por usuários não autorizados. Essa funcionalidade é fundamental para a segurança dos sistemas operacionais de rede e distribuídos. Grande parte dos sistemas atuais são multiusuários; Servidor: um sistema operacional servidor deve permitir a gestão eficiente de muitos recursos (disco, memória, processadores), impondo prioridades e limites sobre o uso dos recursos pelos usuários e seus aplicativos. Normalmente um sistema operacional servidor também tem suporte à rede e aos multiusuários. Exemplos: Windows Server 2019 e Oracle Linux Server; Desktop: um sistema operacional “de mesa” é voltado ao atendimento do usuário doméstico ou corporativo para atividades corriqueiras, como editar textos e gráficos, e reproduzir mídia. Suas principais características são a interface gráfica, o suporte à interatividade e a operação em rede. Exemplos de desktops: Windows 10, Linux e macOS X; Móvel: um sistema operacional móvel é usado em equipamentos de uso pessoal compactos, como smartphones e tablets. Nesse contexto, as principais prioridades são a gestão eficiente da energia (bateria), a conectividade nos diversos tipos de rede (wi-fi, GSM, bluetooth, NFC etc.) e a interação com uma grande variedade de sensores (GPS, giroscópio, luminosidade, tela de toque, leitor de digitais etc.). Android e iOS são exemplos dessa categoria; Embarcado: um sistema operacional é dito embarcado (embutido ou embedded) quando é construído para operar sobre um hardware com poucos recursos de processamento, armazenamento e energia. Aplicações típicas desse tipo de sistema aparecem em sistemas de automação e controladores automotivos, equipamentos eletrônicos de uso doméstico (leitores de DVD, TVs, micro-ondas, centrais de alarme etc.). Muitas vezes um sistema operacional embarcado se apresenta na forma de uma biblioteca a ser ligada ao programa da aplicação durante sua compilação. LynxOS, TinyOS, Contiki e VxWorks são exemplos de sistemas operacionais embarcados; Tempo real: são sistemas em que o tempo é essencial. Ao contrário da ideia usual, um sistema operacional de tempo real não precisa ser necessariamente ultrarrápido; sua característica essencial é ter um comportamento temporal previsível, ou seja, seu tempo de resposta deve ser previsível no melhor e no pior caso de operação. A estrutura interna de um sistema operacional de tempo real deve ser construída de forma a minimizar esperas e latências imprevisíveis, como tempos de acesso a disco e sincronizações excessivas. Exemplos de sistemas operacionais de tempo real incluem o QNX, RT-Linux e VxWorks. Muitos sistemas embarcados têm características de tempo real, e vice-versa. Existem sistemas de tempo real críticos (hard real-time systems), nos quais a perda de um prazo pelo sistema pode perturbar seriamente o sistema físico sob seu controle, com graves consequências humanas, econômicas ou ambientais. Exemplos desse tipo de sistema são o controle de funcionamento de uma turbina de avião ou um freio ABS. Por outro lado, nos sistemas de tempo real não críticos (soft real-time systems), a perda de um prazo é perceptível e degrada o serviço prestado, sem maiores consequências. Exemplos desse tipo de sistema são os softwares de reprodução de mídia: em caso de atrasos, podem ocorrer falhas na música que está sendo tocada. FINALIZANDO Nesta aula apresentamos os conteúdos iniciais de sistemas operacionais. No Tema 1, enfatizamos os conceitos e as definições por uma visão geral; no Tema 2, o histórico e a evolução dos sistemas operacionais, utilizando uma linha do tempo em paralelo à história e à evolução dos computadores, descritas em suas gerações, visualizando as gerações das máquinas e seus sistemas operacionais em cada período da história. No Tema 3, vimos os objetivos, funções e princípios fundamentais que estabelecem as atividades desenvolvidas pelos sistemas operacionais. O destaque desse tema é o item 3.1, que descreve o sistema operacional como gerente de recursos, seu principal objetivo e função, pois ele é responsável por gerenciar o uso dos recursos computacionais. As principais atividades de gestão foram descritas nesse tema e servirão como base para entendermos os temas das aulas seguintes, quando estudarmos os processos (tarefas) de gestão. Na sequência, definimos e apresentamos a classificação e a arquitetura dos sistemas operacionais para, em seguida, finalizar o conteúdo introdutório com a apresentação de tipos e exemplos atuais, permitindo o conhecimento suficiente para a escolha correta de sistemas operacionais adequados às necessidades de cada situação do cotidiano, nos mais diversos ambientes. Enfim, compreender esses conceitos é o princípio para entender as atividades desenvolvidaspelos sistemas computacionais. Assim, futuramente ampliaremos nosso conhecimento com os conceitos das principais atividades de gerência feitas pelos sistemas operacionais, individualmente apresentadas e descritas. REFERÊNCIAS ARPACI-DUSSEAU, R.; ARPACI-DUSSEAU, A. Operating systems: three easy pieces. Madison: Arpaci-Dusseau Books, 2014. CORBATÓ, F.; DAGGETT, M.; DALEY, R. An experimental time-sharing system. In: PROCEEDINGS OF THE SPRING JOINT COMPUTER CONFERENCE, 1., New York. Anais… New York: ACM, 1962. MACHADO, F. B.; MAIA, P. L. Arquitetura de sistemas operacionais. 4. ed. Rio de Janeiro: LTC, 2007. MAZIERO, C. Sistemas operacionais: conceitos e mecanismos. Curitiba: UFPR, 2019. SILBERSCHATZ, A.; GAGNE, G.; GALVIN, P. B. Operating system concepts. New Jersey: Wiley, 2018. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Sistemas operacionais com Java. 8. ed. Rio de Janeiro: Campus, 2016. STALLINGS, W. Operating systems: internals and design principles. 9. ed. London: Pearson, 2017. TANENBAUM, A. S.; BOS, H. Sistemas operacionais modernos. 4. ed. São Paulo: Pearson, 2016. TANENBAUM, A. S. et al. The Amoeba distributed operating system – a status report. Computer Communications, v. 14, p. 324-335, jul. 1991. TANENBAUM, A. S.; WOODHULL, A. S. Sistemas operacionais: projeto e implementação. 3. ed. Porto Alegre: Bookman, 2008. WEIZER, N. A history of operating systems. Datamation, [S.l.], p. 119-126, jan. 1981. Formas de ataque virtual que utilizam diversas técnicas para forçar um servidor de rede a dedicar seus recursos para atender um determinado usuário em detrimento dos demais. Por exemplo, ao abrir milhares de conexões simultâneas num servidor de e-mail, um atacante pode reservar para si todos os recursos do servidor (processos, conexões de rede, memória e processador), fazendo com que os demais usuários não sejam mais atendidos. [1]