Prévia do material em texto
INSTITUTO SUPERIOR POLITÉCNICA DO SOYO ISP-SOYO CURSO: ENGENHARIA INFORMÁTICA CADEIRA: SISTEMA OPERATIVO I DOCENTE: ENG. MENDES CASTANHEIRO Sistema Operativo I Eng. Mendes Castanheiro António Índice INTRODUÇÃO ............................................................................................................................ 3 1- COMPONENTES DE HARDWARE ................................................................................... 6 1.1- Processador ................................................................................................................... 6 1.2.1- CISC .......................................................................................................................... 7 1.2.2- RISC .......................................................................................................................... 7 1.3-Memória ........................................................................................................................... 8 1.3.1-Memória principal .................................................................................................. 8 1.3.2- Memória cache ....................................................................................................... 9 1.4 Periféricos ..................................................................................................................... 11 1.4.1- Dispositivos de entrada .................................................................................... 11 1.4.2- Dispositivos de saída ......................................................................................... 12 1- SISTEMAS OPERACIONAIS ............................................................................................ 13 2- ESTRUTURAS DE SISTEMAS DE COMPUTAÇÃO .................................................... 22 2.1-Operação do Sistema de Computação .................................................................. 22 2.2- Estrutura de I/O ........................................................................................................... 25 2.3-Estrutura de Armazenamento .................................................................................. 27 2.4-Buffering ........................................................................................................................ 31 2.5-Spooling ......................................................................................................................... 31 2.6-Reentrância ................................................................................................................... 32 4- ESTRUTURAS DE SISTEMA OPERACIONAL ............................................................. 33 4.1- Serviços do Sistema Operacional .......................................................................... 34 4.1.1-Funções de serviços do sistema operacional .............................................. 34 4.2- Chamadas de Sistema .............................................................................................. 38 4.2.1-Tipos de Chamadas de Sistema ....................................................................... 44 4.3- Programas de sistema ou utilitários ..................................................................... 46 4.4- Linguagem de máquina ............................................................................................ 48 5.PROCESSO ........................................................................................................................... 48 5.1 Conceito de Processo ................................................................................................ 49 5.2 - Estado do Processo ................................................................................................. 52 5.2.1-Bloco de Controle de Processo ....................................................................... 52 5.3-Escalonamento de Processos ................................................................................. 54 5.3.1 Objetivos do escalonamento............................................................................. 55 5.3.2 Níveis de escalonamento ................................................................................... 57 5.3 - Escalonamento preemptivo e não preemptivo ................................................. 58 Referências .............................................................................................................................. 62 ENG. MENDES CASTANHEIRO ANTÓNIO 3 SISTEMA OPERATIVO I INTRODUÇÃO Desde sua criacão, os computadores sempre foram sistemas de elevada sofisticaçãao em relação ao estágio tecnológico de suas épocas de desenvolvimento. Ao longo dos últimos 50 anos evoluíram incrivelmente e, embora tenham se tornado mais comuns e acessíveis, sua popularização ainda esconde sua tremenda complexidade interna. Neste sentido, os sistemas operacionais, em termos de suas origens e desenvolvimento, acompanharam a própria evolução dos computadores. Deitel nos traz a seguinte definição de sistema operacional: Vemos um sistema operacional como os programas, implementados como software ou firmware, que tornam o hardware utilizável. O hardware oferece capacidade computacional bruta. Os sistemas operacionais disponibilizam convenientemente tais capacidades aos usuários, gerenciando cuidadosamente o hardware para que se obtenha uma performance adequada (DEITEL., 1992). Nesta definição surgem alguns novos termos explicados a seguir. O hardware é o conjunto de dispositivos elétricos, eletrônicos, ópticos e eletromecânicos que compõe o computador, sendo a máquina física propriamente dita. O hardware, aparentemente identificável pelos dispositivos ou módulos que compõe um sistema computacional, determina as capacidades deste sistema. O software é o conjunto de todos os programas de computador em operação num dado computador. Já o firmware é representado por programas especiais armazenados de forma permanente no hardware do computador que permitem o funcionamento elementar e a realização de operações básicas em certos dispositivos do computador, geralmente associadas a alguns periféricos e a execução de outros programas também especiais. Na Figura 1.1 podemos identificar o hardware como sendo os dispositivos físicos, sua microprogramação e o firmware existente neste computador. Como exemplos de dispositivos existentes num sistema podemos citar os circuitos integrados de memória, as unidades de disco flexível ou rígido e o processador ENG. MENDES CASTANHEIRO ANTÓNIO 4 SISTEMA OPERATIVO I do sistema, sendo este último um dispositivo microprogramado. O firmware geralmente vem acondicionado em circuitos de memória não volátil (ROM, PROM ou EPROM) sendo os programas ali gravados escritos geralmente em linguagem de máquina e destinados a execução de operações especiais tal como a Auto verificação inicial do sistema (POST ou power on self test) e a carga do sistema operacional a partir de algum dispositivo adequado (bootstrap). O software deste sistema ou os programas do sistema são representados pelo sistema operacional e todos os seus componentes (bibliotecas de funções e programas utilitários) além de todos os outros programas acessórios do sistema, tais como editores de texto, programas gráficos, compiladores, interpretadores de comando (shells), aplicativos de comunicação e ferramentas de administração e manutenção do sistema. Os programas de aplicação são todos os demais softwares, desenvolvidos com finalidades particulares, que são utilizados num dado sistema computacional sob suporte e supervisão do sistema operacional, tais como planilhas eletrônicas, programas de correio eletrônico, navegadores (browsers), jogos, aplicações multimídia etc. Figura 1.1: Hardware,software, firmware e o SO Por só, o hardware do computador dificilmente poderia ser utilizado diretamente e mesmos assim, exigindo grande conhecimento e esforço para execução de tarefas muito simples. Neste nível, o computador somente é capaz de entender programas diretamente escritos em linguagem de máquina. Além disso, cada diferente tipo de computador possui uma arquitetura interna distinta que pode se utilizar de diferentes processadores que por sua vez requisitar˜ao diferentes linguagens de máquina, tornando penosa e cansativa a tarefa dos ENG. MENDES CASTANHEIRO ANTÓNIO 5 SISTEMA OPERATIVO I programadores. Desta forma, é adequada a existência de uma camada intermediária entre o hardware e os programas de aplicação que pudesse não apenas oferecer um ambiente de programação mais adequado mas também um ambiente de trabalho mais simples, seguro e eficiente. ENG. MENDES CASTANHEIRO ANTÓNIO 6 SISTEMA OPERATIVO I 1- COMPONENTES DE HARDWARE Podemos dizer que hardware e software são elementos vitais em um sistema de computação e que um não vive sem o outro. Em um sistema computacional temos um conjunto de hardware formado por processadores, memória, barramentos, registradores, monitores de vídeo, mouse, teclado, impressoras, discos magnéticos, entre outros dispositivos. Estes por sua vez manipulam dados de forma digital o que torna um sistema computacional confiável na representação e transmissão de dados. Um sistema computacional geralmente é formado pela composição de três subsistemas básicos (também conhecidos como unidades funcionais): processadores (UCP), memória principal (RAM) e dispositivos de entrada e saída (E/S). Estes itens compõem qualquer tipo de computador digital existente independente de fabricante, marca ou modelo (Pereira, Vissotto, & Franciscatto, 2015). 1.1- Processador O processador ou Unidade Central de Processamento (UCP) tem como função controlar e executar instruções presentes na memória principal (RAM) através de operações aritméticas (como somar, subtrair, multiplicar e dividir) e operações lógicas (comparações, movimentação de dados, etc.). Um processador é composto por alguns elementos básicos como a Unidade de Controle (UC), a Unidade Lógica e Aritmética (ULA) e os registradores. A UC gerencia as atividades de todos os dispositivos do computador, como por exemplo, a gravação de dados em discos, a busca de instrução em memória, entre outros. Já a ULA realiza as operações lógicas e aritméticas, conforme citado nos parágrafos anteriores. Os registradores por sua vez têm a função de guardar dados temporariamente, servindo como uma memória de alta velocidade interna do processador, porém com uma capacidade de ENG. MENDES CASTANHEIRO ANTÓNIO 7 SISTEMA OPERATIVO I armazenamento reduzida e um custo maior que a memória principal (Pereira, Vissotto, & Franciscatto, 2015). processador se dá através de um sinal de clock. Este sinal por sua vez, é gerado através de um pulso cíclico que altera variáveis de estado do processador. 1.2- Arquiteturas RISC e CISC Uma CPU em relação ao número de instruções de processamento que pode reconhecer classifica-se em: CISC e RISC. 1.2.1- CISC Um processador CISC reconhece mais de uma centena de instruções. Devido a esta característica, pode executar de modo direto a maioria das operações programadas pelos modernos softwares. Os processadores com arquitetura CISC possuem instruções complexas que são interpretadas por microprogramas. O núcleo de registradores é pequeno e qualquer instrução pode referenciar a memória principal. Os processadores são em sua grande maioria chips CISC. Quanto maior a quantidade de instruções que um microprocessador é capaz de identificar, mais lenta é a execução de cada uma delas. 1.2.2- RISC Um processador RISC reconhece um número limitado de instruções, sendo que em contrapartida, estas instruções são otimizadas para que sejam executadas com mais rapidez. ENG. MENDES CASTANHEIRO ANTÓNIO 8 SISTEMA OPERATIVO I A arquitetura RISC se caracteriza por possuir poucas instruções de máquina, que são executadas diretamente pelo hardware. Estas instruções, em sua maioria, não acessam a memória principal, trabalhando com registradores que neste tipo de processador se apresentam em grande número. Portanto, a arquitetura RISC reduz o conjunto de instruções ao mínimo indispensável: Quadro 1.1: Arquitetura RISC x Arquitetura CISC Fonte: Adaptado de Maia, 2007 1.3-Memória 1.3.1-Memória principal Um computador em seu interior possui vários tipos de memórias. A memória principal do computador é conhecida como memória RAM (Random Access Memory), ou memória de acesso aleatório. Ela é chamada de memória principal, pois é utilizada para manter os programas em execução, tanto dos usuários como do sistema operacional. A memória é composta por unidades de acesso denominadas de células. Cada uma das células possui um determinado número de bits. O acesso ao conteúdo de uma célula se dá pela especificação de um número denominado de endereço. O endereço nada mais é do que uma referência única que fazemos ENG. MENDES CASTANHEIRO ANTÓNIO 9 SISTEMA OPERATIVO I a uma célula de memória. Quando um programa deseja fazer operações de gravação e leitura em uma célula, este deverá antes especificar o endereço de memória desejado, para então realizar a operação. A quantidade de memória RAM disponível em um computador, exerce um grande efeito sobre o desempenho do mesmo, uma vez que sem memória RAM suficiente o sistema passa a utilizar a memória virtual, que é muito mais lenta que a memória RAM. Uma questão importante a ser lembrada é que a memória RAM é volátil, ou seja, todo o conteúdo se apaga quando o computador é desligado ou reiniciado. Assim, caso tenhamos programas em memória e tivermos uma queda de energia elétrica, se não tivermos um dispositivo como o no-break (que garanta a estabilidade de energia), perderemos os dados que estão nesta memória. Os chips de memória RAM são vendidos na forma de pentes de memória, com diferentes velocidades de funcionamento (atualmente na casa dos Gigahertz), tamanhos (01, 02, 04 GB, etc.) e tipos (DDR, DDR2, DDR3, etc.). 1.3.2- Memória cache A memória cache pode ser caracterizada como uma memória de alta velocidade, volátil e na grande maioria das vezes com pequena capacidade de armazenamento. Sua principal função é diminuir a disparidade existente entre a velocidade na qual o processador executa instruções, bem como a velocidade com que os dados são lidos e gravados em memória principal. O tempo de acesso a um dado presente na memória cache é muito menor que se o mesmo estivesse em memória principal. A memória cache guarda os dados mais solicitados. Dessa forma, cada vez que o processador necessita de determinado dado ele verifica se esta informação ENG. MENDES CASTANHEIRO ANTÓNIO 10 SISTEMA OPERATIVO I encontra-se na memória cache, caso contrário, ele faz uma busca em memória principal (o que aumenta o tempo de acesso à informação). A maioria dos processadores atuais apresentam um esquema de memória cache composto por múltiplos níveis. O funcionamento deste esquema tem por princípio que quanto menor a capacidade de armazenamento da memória cache, mais rápido é o acesso a um determinado dado. Para aumentar o desempenho no funcionamento das memórias caches a hierarquização em múltiplos níveis torna-se necessária. Nesse esquema, o nível mais alto de cache é chamado de L1 (Level 1), com baixa capacidade de armazenamento e com alta velocidade de acesso. O nível L2 (Level 2) possuimaior capacidade de armazenamento, porém velocidade de acesso inferior a L1. 1.3.3- Memória secundária A memória secundária é utilizada para guardar dados de forma permanente no computador. Este tipo de armazenamento não necessita de alimentação, diferentemente da memória principal que necessita estar energizada para manter suas informações. O acesso à leitura e gravação de dados na memória secundária é mais lento se comparado à memória principal, entretanto o custo é baixo e a capacidade de armazenamento é bastante superior. Quanto aos tempos de acesso, a memória secundária funciona na ordem de milissegundos (10-3), enquanto a memória principal trabalha na ordem de nanossegundos (10-9). Podemos citar como exemplo de memória secundária os seguintes dispositivos: • Discos magnéticos (discos rígidos – HD). • Discos ópticos (CD, DVD, Blu-Ray). ENG. MENDES CASTANHEIRO ANTÓNIO 11 SISTEMA OPERATIVO I • Memória flash (pen drives). Na Figura 1.1, é possível visualizar um comparativo entre os diferentes tipos de dispositivos de armazenamento na relação custo, velocidade e capacidade de armazenamento. Figura 1.1: Relação entre dispositivos de armazenamento Fonte: CTSM, adaptado de Maia, 2007 1.4 Periféricos Os periféricos ou dispositivos de entrada e saída, são componentes de um computador que permitem expandir as funcionalidades do mesmo. Os mesmos podem ser divididos em duas categorias principais: os utilizados como memória secundária e os que servem como interface usuário-máquina. Veremos alguns exemplos de dispositivos de entrada e saída de dados. 1.4.1- Dispositivos de entrada Os dispositivos de entrada ou periféricos de entrada têm a função de codificar os dados que entram no computador para que os mesmos possam ser processados pelo computador. São considerados dispositivos de entrada: ENG. MENDES CASTANHEIRO ANTÓNIO 12 SISTEMA OPERATIVO I Câmera digital. Câmera filmadora. Caneta ótica. Drive de Blu-Ray. Drive de CD/DVD-ROM. Joystick. Leitora de códigos de barra. Mesa gráfica. Microfone. Mouse. Pen drive. Scanner. Teclado. Tela sensível ao toque. 1.4.2- Dispositivos de saída Os dispositivos de saída têm a função de decodificar os dados gerados pelos dispositivos de entrada, para que estes possam ser entendidos pelo usuário. Em outras palavras, os dispositivos de saída permitem extrair e visualizar informações que estão no computador. Abaixo alguns exemplos de dispositivos de saída de dados: Caixas de som. Drive gravador de Blu-Ray. Drive gravador de CD-ROM/DVD-ROM. Impressora. Monitor de vídeo. Pen drive. Plotter. ENG. MENDES CASTANHEIRO ANTÓNIO 13 SISTEMA OPERATIVO I Projetores digitais. Cabe salientar que existem dispositivos que funcionam tanto como periféricos de entrada como de saída, nestes casos sendo classificados como dispositivos de entrada/saída de dados. Os dispositivos de entrada e saída são responsáveis pela interação da máquina com o homem. É por meio deles que os dados entram e saem do computador. 1- SISTEMAS OPERACIONAIS A essa altura, você já deve ter notado que o termo sistema operacional abrange muitos papéis e funções. Isso ocorre, pelo menos em parte, em razão dos inúmeros designs e usos dos computadores. Os computadores estão presentes dentro de torradeiras, carros, navios, espaçonaves, casas e empresas. Eles são a base das máquinas de jogos, reprodutores de música, sintonizadores de TV a cabo e sistemas de controle industrial. Embora os computadores tenham uma história relativamente curta, eles evoluíram rapidamente. A computação começou como um experimento para determinar o que poderia ser feito e migrou rapidamente para sistemas de finalidade específica de uso militar, como decifração de códigos e plotagem de trajetórias, e uso governamental, como no cálculo do censo. Esses computadores iniciais evoluíram para mainframes multifuncionais de uso geral, e foi então que nasceram os sistemas operacionais (Silberschatz, 2015). Nos anos 1960, a Lei de Moore previu que o número de transistores de um circuito integrado dobraria a cada dezoito meses, e essa previsão se confirmou. Os computadores aumentaram em funcionalidade e diminuíram em tamanho, levando a um vasto número de usos e a um vasto número e variedade de sistemas operacionais. ENG. MENDES CASTANHEIRO ANTÓNIO 14 SISTEMA OPERATIVO I 1.1-DEFININDO OS SISTEMAS OPERACIONAIS Um sistema operacional é um programa, ou conjunto de programas, especialmente desenvolvido para oferecer, da forma mais simples e transparente possível, os recursos de um sistema computacional aos seus usuários, controlando e organizando o uso destes recursos de maneira que se obtenha um sistema eficiente e seguro. Segundo Stallings (1992), ao tratar dos objetivos e funções dos sistemas operacionais, afirma que: Um sistema operacional ´e um programa que controla a execução dos programas de aplicação e atua como uma interface entre o usuário do computador o hardware do computador. Um sistema operacional pode ser pensado como tendo dois objetivos ou desempenhando duas funções: conveniência, pois faz o sistema computacional mais conveniente de usar; e eficiência, pois permite que os recursos do sistema computacional sejam usados de maneira eficiente. Silberschatz (2000) utiliza praticamente a mesma definição, indicando que um sistema operacional é um ambiente intermediário entre o usuário e o hardware do computador no qual programas podem ser executados de forma conveniente e eficiente. Objetivos de um sistema operacional A despeito do tipo, sofisticaçãoo ou capacidades do computador, um sistema operacional deve atender aos seguintes princípios: 1. Oferecer os recursos do sistema de forma simples e transparente; ENG. MENDES CASTANHEIRO ANTÓNIO 15 SISTEMA OPERATIVO I 2. Gerenciar a utilização dos recursos existentes buscando seu uso eficiente em termos do sistema; e 3. Garantir a integridade e a segurança dos dados armazenados e processados no sistema e também de seus recursos físicos. Além destes objetivos, um sistema operacional também deve proporcionar uma interface adequada para que ele possa ser utilizado pelos seus usuários. Historicamente as primeiras interfaces dos sistemas operacionais eram baseadas em um conjunto de palavras-chave (comandos) e mensagens de diálogo que permitiam a execucão de tarefas e a comunicação entre homem (o operador) e máquina. Estes comandos e mensagens definiam a Interface Humano-Computador (IHC) daquele sistema. Atualmente as interfaces baseadas em modo texto estão em desuso, sendo substituídas por interfaces gráficas mais modernas e simples que buscam facilitar a utilização do computador através de sua aparência atraente e uso intuitivo. 1.3 Tipos de sistemas operacionais Os sistemas operacionais evoluíram ao longo do tempo, muito pela contribuição da evolução do hardware e das aplicações suportadas por ele. Os sistemas operacionais são divididos basicamente em três tipos, conforme podemos visualizar na Figura 1.2. ENG. MENDES CASTANHEIRO ANTÓNIO 16 SISTEMA OPERATIVO I Figura 1.2: Tipos de sistemas operacionais Fonte: CTISM, adaptado de Maia, 2007 A estrutura apresentada na Figura 1.2, mostra os tipos de sistemas operacionais quanto a sua forma de operação. Estes dividem-se em: sistemas monoprogramáveis/monotarefa, sistemas multiprogramáveis/multitarefa e sistemas com múltiplos processadores. 1.3.1 Sistemas monoprogramáveis/monotarefa Os sistemas monoprogramáveis ou monotarefa, como o próprio nome já diz (mono, noção de um, deunidade) são sistemas voltados tipicamente para a execução de um único programa. Qualquer outra aplicação para ser executada, deve aguardar o término no programa corrente. Neste tipo de sistema, o processador, a memória e os demais periféricos permanecem exclusivamente dedicados à execução de um único programa (Pereira, Vissotto, & Franciscatto, 2015). Os sistemas monotarefa, estão tipicamente relacionados aos primeiros computadores da década de 1960. Os sistemas monoprogramáveis possuíam uma desvantagem muito clara, devido à limitação de tarefas (uma de cada vez) havia um grande desperdício de recursos de hardware. Como exemplo de ENG. MENDES CASTANHEIRO ANTÓNIO 17 SISTEMA OPERATIVO I sistema operacional monoprogramável/monotarefa temos o MS-DOS da Microsoft. 1.3.2 Sistemas multiprogramáveis/multitarefa Diferentemente dos sistemas monoprogramáveis/monotarefa, os sistemas multiprogramáveis/multitarefa permitem que os recursos computacionais sejam compartilhados entre os diversos usuários e aplicações. Neste caso, enquanto um programa espera pela ocorrência de um evento, outros programas podem estar em execução neste mesmo intervalo de tempo, permitindo assim o compartilhamento de recursos como processador, memória principal e dispositivos de entrada e saída. O sistema operacional fica incumbido de gerenciar o acesso concorrente aos seus diversos recursos de forma ordenada e protegida (Pereira, Vissotto, & Franciscatto, 2015). As vantagens na utilização destes tipos de sistemas operacionais são a redu- ção do tempo de respostas das aplicações, além dos custos computacionais reduzidos, devido ao compartilhamento dos recursos do sistema entre as diferentes aplicações. Os sistemas operacionais multiprogramáveis/multitarefa podem ser classificados em três subdivisões segundo características de como suas aplicações são gerenciadas. Estas categorias são: sistemas batch, de tempo compartilhado e de tempo real. 1.3.2.1 Sistemas batch Os sistemas batch foram implementados na década de 60. Os programas ou jobs, como eram conhecidos na época, eram submetidos para execução através da utilização de cartões perfurados, armazenados em discos ou fitas, para posteriormente serem executados (dependendo da disponibilidade da memória principal). Uma característica marcante dos sistemas batch era não exigir a interação do usuário com a aplicação. Exemplos de aplicações processadas ENG. MENDES CASTANHEIRO ANTÓNIO 18 SISTEMA OPERATIVO I em batch eram programas de cálculos numéricos, ordenações, compilações, backups, entre outros, onde não se fazia necessária a interação com o usuário. 1.3.2.2 Sistemas de tempo compartilhado Estes sistemas, também conhecidos como time-sharing (tempo compartilhado), permitem que diferentes programas sejam executados a partir da divisão do tempo do processador em pequenas fatias de tempo (conhecidas como time-slice). Caso a fatia de tempo seja pequena para as funções que o mesmo precisa realizar, ele aguarda uma nova fatia de tempo para que possa entrar em execução novamente. Nos sistemas de tempo compartilhado é criado, para cada usuário, um ambiente de trabalho próprio, simulando a ideia de que todo o sistema está dedicado exclusivamente a ele. Os sistemas de tempo compartilhado permitem aos seus usuários interagir com o sistema através dos dispositivos de entrada de dados e comandos especiais. A grande maioria das aplicações comerciais existentes atualmente utilizam este tipo de sistema, uma vez que oferecem tempo de resposta razoáveis e custos baixos, em função do compartilhamento dos recursos do sistema, entre os programas. 1.3.2.3 Sistemas de tempo real Também conhecidos como real-time (tempo real) possuem características semelhantes aos sistemas de tempo compartilhado, entretanto diferenciam-se pelo tempo exigido no processamento das aplicações. Nos sistemas de tempo real, quanto aos tempos de processamento, estes devem enquadrar-se em limites rígidos, para o êxito das operações realizadas, podendo comprometer a aplicação e seus resultados caso este limite de tempo não seja cumprido. Diferentemente dos sistemas de tempo compartilhado, nos sistemas de tempo real o processador permanece ocupado durante o tempo que for necessário a execução de determinado programa, cedendo lugar a outro programa que tenha uma prioridade maior no sistema. Outra característica destes sistemas ENG. MENDES CASTANHEIRO ANTÓNIO 19 SISTEMA OPERATIVO I é que a prioridade de execução de um programa é definida pela própria aplicação e não pelo sistema operacional. Exemplos destes sistemas, encontramos em aplicações de controle de processos, como controle de tráfego aéreo, usinas, refinarias, ou qualquer outra aplicação onde o tempo de processamento é fator fundamental para o sucesso. 1.3.3 Sistemas com múltiplos processadores Os sistemas de múltiplos processadores recebem este nome por possuírem dois ou mais processadores interligados trabalhando em conjunto. Como vantagem desta arquitetura está o fato de permitir que vários programas possam ser executados ao mesmo tempo ou que um programa possa ser dividido em partes, entre os vários processadores, executando-os de forma simultânea (Pereira, Vissotto, & Franciscatto, 2015). Um dos fatores fundamentais para o desenvolvimento de sistemas operacionais com múltiplos processadores está na forma de comunicação entre os processadores (CPU), o compartilhamento de memória principal (RAM) e os dispositivos de entrada e saída (E/S). Através dos sistemas com múltiplos processadores foi possível a criação de sistemas computacionais voltados para o desenvolvimento científico, aplicado em áreas como desenvolvimento aeroespacial, prospecção de petróleo, simulações, entre outros. As práticas e estudos voltados ao desenvolvimento de sistemas com múltiplos processadores adicionaram vantagens em tais sistemas como a escalabilidade, disponibilidade e balanceamento de carga. ENG. MENDES CASTANHEIRO ANTÓNIO 20 SISTEMA OPERATIVO I 1.4 Sistemas operacionais usuais A ideia desta seção é que possamos conhecer um pouco mais dos sistemas operacionais mais usuais e suas classificações, para que você possa testar, usar e começar a praticar em seu dia a dia, desde já. 1.4.1 Sistemas operacionais de computadores pessoais Os sistemas operacionais para computadores pessoais são amplamente usados no dia a dia em netbooks, notebooks, computadores de mesa, etc. Seu objetivo é fornecer uma boa interface, permitindo que o usuário realize as tarefas que necessita de forma prática e intuitiva. Estes sistemas operacionais são amplamente utilizados para pacotes de escritório (editores de texto, planilhas eletrônicas), internet e aplicativos em geral (Pereira, Vissotto, & Franciscatto, 2015). Alguns exemplos mais comuns destes sistemas operacionais para computadores pessoais são as distribuições Windows e Linux. Quanto às distribuições Windows para computadores pessoais, temos: Windows XP, Windows Vista, Windows Seven e Windows 8.1. Já as distribuições Linux para computadores pessoais, temos como os mais usuais: Ubuntu, Red Hat, Debian, Fedora, Mint, Mageia, OpenSuse, entre outros. As distribuições Windows são sistemas operacionais pagos, onde devemos escolher e adquirir as licenças para uso, conforme cada necessidade. Já os sistemas operacionais Linux, são caracterizados como softwares livres, ou seja, podem ser baixados livremente na internet, modificados, adaptados e distribuídos livremente independente do número de computadores onde iremos realizar a sua instalação e posterior utilização 1.4.2 Sistemas operacionais de servidores ENG. MENDES CASTANHEIRO ANTÓNIO 21 SISTEMA OPERATIVO I Diferentemente dos sistemasoperacionais para computadores pessoais, o objetivo dos sistemas operacionais para servidores é servir o maior número de usuários ao mesmo tempo, permitindo a eles compartilhar recursos de hardware e software. Os sistemas operacionais de servidores podem fornecer diferentes tipos de serviços, como por exemplo: servidor de arquivos, servidor web (hospedagem de site, e-mail, proxy, entre outros) servidor de autenticação, backup, compartilhamento, entre outros. Assim como acontece nos sistemas operacionais para computadores pessoais, os sistemas operacionais para servidores possuem suas distribuições específicas, uma vez que sua função é diferenciada e que necessita de um hardware específico para seu pleno funcionamento (na grande maioria dos casos). Dessa forma, as distribuições Windows e Linux (mais usuais) dispõem de vários sistemas operacionais para servidores, sendo que no Windows, podemos citar como exemplo: Windows 2003 Server, Windows 2008 server e Windows 2012 Server. Nas distribuições Linux, temos como exemplo de sistemas operacionais para servidores: Ubuntu Server, Mandriva, Slackware, Suse e Debian. 1.4.3 Sistemas operacionais embarcados Este tipo de sistema operacional tem crescido bastante nos últimos anos e podemos dizer que os mesmos são uma tendência cada vez maior. Quando nos referimos aos sistemas operacionais embarcados, estamos falando dos sistemas dos computadores de mão (smartphones, tablets, etc.). Os sistemas operacionais embarcados são executados diretamente nos dispositivos e já vêm instalados de fábrica nos mesmos, não permitindo a troca por outro sistema operacional, características de tais sistemas. Como diferença para os demais sistemas operacionais, apresentam restrições de tamanho, memória ENG. MENDES CASTANHEIRO ANTÓNIO 22 SISTEMA OPERATIVO I e consumo de energia, o que os fazem especiais (Pereira, Vissotto, & Franciscatto, 2015). Neste mercado, podemos citar como principais sistemas operacionais embarcados, os seguintes: Android, iOS, Windows Phone, entre outros. Para utilização de aplicativos diversos nestes sistemas, faz-se necessário realizar o download dos aplicativos que o usuário deseja no repositório oficial de cada sistema operacional em particular 2- ESTRUTURAS DE SISTEMAS DE COMPUTAÇÃO Antes que possamos explorar os detalhes de como os sistemas de computação funcionam, precisamos de um conhecimento geral da estrutura de um sistema de computação. Nesta seção, examinamos várias partes dessa estrutura. A seção é principalmente dedicada à organização do sistema de computação, portanto, você pode olhá-la superficialmente, ou saltá-la se já conhece os conceitos. 2.1-Operação do Sistema de Computação Um moderno sistema de computação de uso geral é composto por uma ou mais CPUs e vários controladores de dispositivos conectados por intermédio de um bus comum que dá acesso à memória compartilhada (Figura 1.2). Cada controlador de dispositivos é responsável por um tipo específico de dispositivo (por exemplo, drives de disco, dispositivos de áudio ou exibidores de vídeo). A CPU e os controladores de dispositivos podem operar concorrentemente, competindo por ciclos de memória. Um controlador de memória sincroniza o acesso à memória compartilhada para assegurar um acesso ordenado. ENG. MENDES CASTANHEIRO ANTÓNIO 23 SISTEMA OPERATIVO I Para que um computador comece a operar, por exemplo, quando é ligado ou reiniciado , ele precisa ter um programa inicial para executar. Esse programa inicial, ou programa bootstrap, tende a ser simples. Normalmente, ele é armazenado dentro do hardware do computador em memória somente de leitura (ROM) ou em memória somente de leitura eletricamente apagável e programável (EEPROM — electrically erasable programmable read-only memory), conhecida pelo termo geral firmware. Ele inicializa todos os aspectos do sistema, dos registradores da CPU aos controladores de dispositivos e conteúdos da memória. O programa bootstrap precisa saber como carregar o sistema operacional e iniciar sua execução. Para alcançar esse objetivo, o programa tem que localizar e carregar na memória o kernel do sistema operacional. Assim que o kernel é carregado e está em execução, ele pode começar a fornecer serviços para o sistema e seus usuários. Alguns serviços são fornecidos fora do kernel por programas do sistema que são carregados na memória em tempo de inicialização para se tornarem processos do sistema, ou daemons do sistema, que são executados durante todo o tempo em que o kernel é executado. No UNIX, o primeiro processo do sistema é “init”, e ele inicia muitos outros daemons. Quando essa fase é concluída, o sistema está totalmente inicializado e aguarda que algum evento ocorra. Geralmente, a ocorrência de um evento é indicada por uma interrupção proveniente do hardware ou do software. O hardware pode disparar uma interrupção a qualquer momento enviando um sinal à CPU, normalmente pelo bus do sistema. O software pode disparar uma interrupção executando uma operação especial denominada chamada de sistema (também conhecida como chamada de monitor). ENG. MENDES CASTANHEIRO ANTÓNIO 24 SISTEMA OPERATIVO I Figura 2.1:Um moderno sistema de computação. Quando a CPU é interrompida, ela para o que está fazendo e transfere imediatamente a execução para uma localização fixa. Normalmente, essa localização fixa contém o endereço inicial no qual se encontra a rotina de serviço da interrupção. A rotina de serviço da interrupção entra em operação; ao completar a execução, a CPU retoma a computação interrompida. Uma linha de tempo dessa operação é mostrada na Figura 2.2. Figura 2.2: Linha de tempo de interrupções para um processo individual gerando saídas. As interrupções são uma parte importante da arquitetura do computador. Cada projeto de computador tem seu próprio mecanismo de interrupção, mas diversas funções são comuns a todos. A interrupção deve transferir o controle para a rotina de serviço de interrupção apropriada. O método mais simples para a manipulação dessa transferência seria invocar uma rotina genérica que ENG. MENDES CASTANHEIRO ANTÓNIO 25 SISTEMA OPERATIVO I examinasse a informação de interrupção. A rotina, por sua vez, chamaria o manipulador de interrupções específico. Entretanto, as interrupções precisam ser manipuladas rapidamente. Já que só é permitida uma quantidade predeterminada de interrupções, uma tabela de ponteiros para rotinas de interrupção pode ser usada como alternativa para fornecer a velocidade necessária. A rotina de interrupção é chamada indiretamente pela tabela, sem necessidade de rotina intermediária. Geralmente, a tabela de ponteiros é armazenada na memória baixa (mais ou menos as 100 primeiras localizações). Essas localizações mantêm os endereços das rotinas de serviço de interrupção dos diversos dispositivos. Esse array de endereços, ou vetor de interrupções, é então indexado por um único número de dispositivo, fornecido com a solicitação de interrupção, de modo a que seja obtido o endereço da rotina de serviço de interrupção do dispositivo que a está causando. Sistemas operacionais tão diferentes como o Windows e o UNIX despacham as interrupções dessa maneira. A arquitetura de interrupções também deve salvar o endereço da instrução interrompida. Muitos projetos antigos simplesmente armazenavam o endereço interrompido em uma localização fixa ou em uma localização indexada pelo número do dispositivo. Arquiteturas mais recentes armazenam o endereço de retorno na pilha do sistema. Se a rotina de interrupção precisar modificar o estado do processador, por exemplo, modificando os valores dos registradores, ela deve salvar explicitamente o estado corrente e, então, restaurar esse estado antesde retornar. Após a interrupção ser atendida, o endereço de retorno salvo é carregado no contador do programa, e a computação interrompida é retomada como se a interrupção não tivesse ocorrido. 2.2- Estrutura de I/O O armazenamento é apenas um dos muitos tipos de dispositivos de I/O de um computador. Grande parte do código do sistema operacional é dedicada ao gerenciamento de I/O, tanto por causa de sua importância para a confiabilidade ENG. MENDES CASTANHEIRO ANTÓNIO 26 SISTEMA OPERATIVO I e o desempenho de um sistema quanto em razão da natureza variada dos dispositivos. A seguir, fornecemos uma visão geral do I/O. Um sistema de computação de uso geral é composto por CPUs e vários controladores de dispositivos conectados por um bus comum. Cada controlador de dispositivos é responsável por um tipo específico de dispositivo. Dependendo do controlador, pode haver mais de um dispositivo conectado. Por exemplo, sete ou mais dispositivos podem ser conectados ao controlador da interface de pequenos sistemas de computação (SCSI-small computer-systems interface). Um controlador de dispositivos mantém algum armazenamento em buffer local e um conjunto de registradores de uso específico. O controlador de dispositivos é responsável por movimentar os dados entre os dispositivos periféricos que controla e seu buffer de armazenamento local. Normalmente, os sistemas operacionais têm um driver de dispositivo para cada controlador de dispositivos. Esse driver entende o controlador de dispositivos e fornece uma interface uniforme entre o dispositivo e o resto do sistema operacional. Para iniciar uma operação de I/O, o driver do dispositivo carrega os registradores apropriados dentro do controlador do dispositivo. Este, por sua vez, examina o conteúdo dos registradores para determinar que ação tomar (tal como “ler um caractere a partir do teclado”). O controlador inicia a transferência de dados do dispositivo para o seu buffer local. Quando a transferência de dados é concluída, o controlador do dispositivo informa ao driver do dispositivo, por uma interrupção, que terminou sua operação. O driver do dispositivo retorna então o controle para o sistema operacional, possivelmente retornando os dados ou um ponteiro para os dados se a operação foi uma leitura. Para outras operações, o driver do dispositivo retorna informações de status. Esse tipo de I/O dirigido por interrupção é adequado para a movimentação de pequenas quantidades de dados, mas pode produzir um overhead alto quando usado na movimentação de dados de massa como no I/O de disco. Para resolver esse problema, é utilizado o acesso direto à memória (DMA). Após estabelecer os buffers, ponteiros e contadores para o dispositivo de I/O, o ENG. MENDES CASTANHEIRO ANTÓNIO 27 SISTEMA OPERATIVO I controlador do dispositivo transfere um bloco inteiro de dados diretamente da memória para o seu próprio buffer ou a partir dele para a memória, sem intervenção da CPU. Somente é gerada uma interrupção por bloco para informar ao driver do dispositivo que a operação foi concluída, em vez de uma interrupção por byte gerada para dispositivos de baixa velocidade. Enquanto o controlador do dispositivo está executando essas operações, a CPU está disponível para cumprir outras tarefas. Figura 2.3: Como um moderno sistema de computação funciona Alguns sistemas de topo de linha usam arquitetura baseada em switch e não em bus. Nesses sistemas, vários componentes podem conversar com outros componentes concorrentemente, em vez de competirem por ciclos em um bus compartilhado. Nesse caso, o DMA é ainda mais eficaz. A Figura 2.3 mostra a interação de todos os componentes de um sistema de computação. 2.3-Estrutura de Armazenamento A CPU só pode carregar instruções a partir da memória; portanto, para serem executados, os programas devem estar armazenados na memória. Computadores de uso geral executam a maioria de seus programas a partir de memória regravável, ou seja, a memória principal (também chamada ENG. MENDES CASTANHEIRO ANTÓNIO 28 SISTEMA OPERATIVO I de memória de acesso randômico ou RAM). Normalmente, a memória principal é implementada em uma tecnologia de semicondutor denominada memória de acesso randômico dinâmica (DRAM - dynamic random access memory). Os computadores também usam outros tipos de memória. Já mencionamos a memória somente de leitura (ROM) e a memória somente de leitura eletricamente apagável e programável (EEPROM). Como a ROM não pode ser alterada, somente programas estáticos, como o programa bootstrap descrito anteriormente, são nela armazenados. A imutabilidade da ROM é útil em cartuchos de jogos. A EEPROM pode ser alterada, mas não com frequência e, portanto, contém programas estáticos em sua maior parte.Por exemplo, os smartphones têm EEPROM para armazenar seus programas instalados de fábrica. Todos os tipos de memória fornecem um array de bytes. Cada byte tem seu próprio endereço. A interação é alcançada por intermédio de uma sequência de instruções load ou store para endereços de memória específicos. A instrução load move um byte ou palavra da memória principal para um registrador interno da CPU enquanto a instrução store move o conteúdo de um registrador para a memória principal. Além das cargas e armazenamentos explícitos, a CPU carrega automaticamente para execução instruções a partir da memória principal. Um típico ciclo instrução-execução, conforme realizado em um sistema com arquitetura von Neumann, traz primeiro uma instrução da memória e a armazena no registrador de instruções. A instrução é, então, decodificada e pode provocar a busca de operandos na memória e o seu armazenamento em algum registrador interno. Após a execução da instrução sobre os operandos, o resultado pode ser armazenado novamente na memória. Observe que a unidade de memória enxerga apenas um fluxo de endereços de memória. Ela não sabe como eles são gerados (pelo contador de instruções, por indexação, indiretamente, como endereços literais ou por algum outro meio) ou para que servem (instruções ou dados). Da mesma forma, podemos ignorar como um endereço de memória é gerado por um programa. Só estamos interessados na sequência de endereços de memória gerados pelo programa em execução. Idealmente, gostaríamos que os programas e dados residissem na memória principal de modo permanente. Esse esquema, geralmente, não é possível pelas duas razões a seguir: 1. A memória principal costuma ser muito pequena para armazenar permanentemente todos os programas e dados necessários. ENG. MENDES CASTANHEIRO ANTÓNIO 29 SISTEMA OPERATIVO I 2. A memória principal é um dispositivo de armazenamento volátil que perde seus conteúdos quando a energia é desligada ou quando ela falta por outro motivo. Portanto, a maioria dos sistemas de computação fornece memória secundária como uma extensão da memória principal. O principal requisito da memória secundária é que ela seja capaz de armazenar grandes quantidades de dados permanentemente. O dispositivo de memória secundária mais comum é o disco magnético, que fornece armazenamento tanto para programas quanto para dados. A maioria dos programas (de sistema e de aplicação) é armazenada em um disco até que seja carregada na memória. Por isso, muitos programas utilizam o disco tanto como fonte quanto como destino de seu processamento. Logo, o gerenciamento apropriado do armazenamento em disco é de importância capital para um sistema de computação. De modo geral, no entanto, a estrutura de armazenamento que descrevemos, constituída de registradores, memória principal e discos magnéticos , é apenas um dos muitos sistemas de armazenamento possíveis. Há ainda a memória cache, o CD-ROM, as fitas magnéticas etc. Cada sistema de armazenamentofornece as funções básicas de armazenamento e de manutenção de dados até que sejam recuperados mais tarde. As principais diferenças entre os vários sistemas de armazenamento residem na velocidade, no custo, no tamanho e na volatilidade. A ampla variedade de sistemas de armazenamento pode ser organizada em uma hierarquia (Figura 1.4), de acordo com a velocidade e o custo. Os níveis mais altos são caros, porém velozes. À medida que descemos na hierarquia, o custo por bit geralmente decresce, enquanto o tempo de acesso em geral aumenta. Essa desvantagem é razoável; se determinado sistema de armazenamento fosse ao mesmo tempo mais rápido e menos caro que outro ,sendo as demais propriedades idênticas, então não haveria razão para utilizar a memória mais lenta e mais dispendiosa. Na verdade, muitos dispositivos de armazenamento antigos, inclusive fita de papel e memórias de núcleo, foram relegados aos museus depois que a fita magnética e a memória semicondutora tornaram-se mais rápidas e mais baratas. Os quatro níveis mais altos de memória na Figura 1.4 podem ser construídos com o uso de memória semicondutora. Além de diferirem na velocidade e no custo, os diversos sistemas de armazenamento podem ser voláteis ou não voláteis. Como mencionado anteriormente, a memória volátil perde seus conteúdos quando a energia para o dispositivo é removida. Na ausência de dispendiosos sistemas de backup por bateria ou gerador, os dados devem ser gravados em memória não volátil, por ENG. MENDES CASTANHEIRO ANTÓNIO 30 SISTEMA OPERATIVO I segurança. Na hierarquia mostrada na Figura 1.4, os sistemas de armazenamento situados acima do disco de estado sólido são voláteis enquanto os que o incluem e estão abaixo dele são não voláteis. Figura 2.4 Hierarquia dos dispositivos de armazenamento. Há muitos tipos de discos de estado sólido, mas em geral eles são mais rápidos do que os discos magnéticos e são não voláteis. Um tipo de disco de estado sólido armazena dados em um extenso array DRAM durante a operação normal, mas também contém um disco rígido magnético oculto e uma bateria como energia de backup. Quando há interrupção da energia externa, o controlador do disco de estado sólido copia os dados da RAM no disco magnético. Quando a energia externa é restaurada, o controlador copia os dados novamente na RAM. Outro tipo de disco de estado sólido é a memória flash que é popular em câmeras e assistentes digitais pessoais (PDAs — personal digital assistants), em robôs e cada vez mais para armazenamento em computadores de uso geral. A memória flash é mais lenta que a DRAM, mas não precisa de energia para reter seus conteúdos. Mais um tipo de armazenamento não volátil é a NVRAM, que é a DRAM com energia de backup por bateria. Essa memória pode ser tão rápida quanto a DRAM e (enquanto a bateria durar) é não volátil. O projeto de um sistema de memória completo deve balancear todos os fatores que acabamos de discutir: só deve usar memória cara quando necessário e fornecer o máximo possível de memória barata e não volátil. Caches podem ser instalados para melhorar o desempenho quando existir grande disparidade no tempo de acesso ou na taxa de transferência entre dois componentes. ENG. MENDES CASTANHEIRO ANTÓNIO 31 SISTEMA OPERATIVO I 2.4-Buffering A técnica denominada de buffering consiste em utilizar uma área de memória principal, chamada buffer, criada e mantida pelo sistema operacional. Possui a finalidade de auxiliar a transferência de dados entre dispositivos de E/S e a memória. O buffer permite minimizar a disparidade de velocidade entre o processador e os dispositivos de E/S e, tem como objetivo principal, manter tantoos dispositivos de E/S como o processador, ocupados a maior parte do tempo (Pereira, Vissotto, & Franciscatto, 2015). O registro é a unidade de transferência do mecanismo de buffering. O buffer deve comportar o armazenamento de diversos registros, de forma que o processador tenha à sua disposição dados suficientes para processar sem ter que interromper o programa a cada leitura/gravação no dispositivo de E/S. Na Figura 3.3, é possível visualizar como as operações de entrada e saída utilizam o buffer. Figura 2.5: Operação de entrada e saída utilizando buffer Fonte: CTISM, adaptado de Maia, 2007 2.5-Spooling A técnica de spooling foi criada inicialmente para auxiliar a submissão de processos ao sistema, sendo os processos gravados em fita para posterior leitura e execução. Com o aparecimento dos terminais para acesso ao sistema, esta técnica teve sua função adaptada para armazenar o resultado da impressão dos programas em execução (Pereira, Vissotto, & Franciscatto, 2015). Isto é possível através da criação e manutenção, pelo sistema operacional de uma grande área em disco, com a finalidade de simular uma impressora. Assim, os usuários e seus programas imprimem, na verdade, para este ENG. MENDES CASTANHEIRO ANTÓNIO 32 SISTEMA OPERATIVO I arquivo em disco, liberando a associação dos dispositivos de impressão diretamente aos programas que estão executando. A Figura 2.6 demonstra a técnica de spooling de modo simplificado. Figura 2.6: Técnica de spooling Fonte: CTISM, adaptado de Maia, 2007 2.6-Reentrância Em sistemas multiprogramáveis, é normal que vários usuários utilizem os mesmos aplicativos simultaneamente, como editores de texto, compiladores, entre outros utilitários. Nestes casos, se cada usuário que fosse utilizar um destes aplicativos trouxesse o código executável para a memória haveria então diversas cópias de um mesmo programa ocupando espaço na memória, o que causaria um grande desperdício de espaço. A reentrância é a capacidade de um código executável (código reentrante) ser compartilhado por vários usuários, exigindo apenas uma cópia do programa em memória. Esta técnica permite que cada usuário esteja executando um trecho diferente do código reentrante, manipulando dados próprios, exclusivos de cada usuário (Pereira, Vissotto, & Franciscatto, 2015). Assim, a reentrância tem como objetivo geral promover o uso mais eficiente ENG. MENDES CASTANHEIRO ANTÓNIO 33 SISTEMA OPERATIVO I da memória e um desempenho maior do sistema. A Figura 2.7, ilustra o cenário da reentrância. Figura 2.7: Reentrância Fonte: CTISM, adaptado de Maia, 2007 4- ESTRUTURAS DE SISTEMA OPERACIONAL Um sistema operacional fornece o ambiente dentro do qual os programas são executados. Internamente, os sistemas operacionais variam muito em sua composição, já que estão organizados em muitas linhas diferentes. O projeto de um novo sistema operacional é uma tarefa de peso. É importante que os objetivos do sistema sejam bem definidos antes de o projeto começar. Esses objetivos formam a base das escolhas feitas entre vários algoritmos e estratégias (Silberschatz, 2015). Podemos considerar um sistema operacional segundo vários critérios. Um ENG. MENDES CASTANHEIRO ANTÓNIO 34 SISTEMA OPERATIVO I ponto de vista enfoca os serviços que o sistema fornece; outro, a interface que ele torna disponível para usuários e programadores; e um terceiro enfoca seus componentes e suas interconexões. Neste capítulo, exploramos todos os três aspetos dos sistemas operacionais, mostrando os pontos de vista de usuários, programadores e projetistas de sistemas operacionais. Consideramos os serviços que um sistema operacional fornece, como eles são fornecidos, como são depurados e que metodologias existem para o projeto desses sistemas. Para concluir, descrevemos como os sistemas operacionais são criados e como um computador inicia seu sistema operacional 4.1- Serviços do Sistema Operacional Um sistema operacional fornece um ambiente para a execução de programas. Elefornece certos serviços para programas e para os usuários desses programas. Os serviços específicos fornecidos diferem, obviamente, de um sistema operacional para outro, mas podemos identificar classes comuns. Esses serviços do sistema operacional são fornecidos visando à conveniência do programador, para tornar mais fácil a tarefa de programar. A Figura 4.1 mostra uma representação dos diversos serviços do sistema operacional e como eles estão relacionados (Silberschatz, 2015). Figura 4.1: uma visão dos serviços do sistema operacional. 4.1.1-Funções de serviços do sistema operacional ENG. MENDES CASTANHEIRO ANTÓNIO 35 SISTEMA OPERATIVO I Um conjunto de serviços do sistema operacional fornece funções que são úteis para o usuário. Interface de usuário. Quase todos os sistemas operacionais têm uma interface de usuário (UI- user interface). Essa interface pode assumir várias formas. Uma delas é a interface de linha de comando (CLI – command line interface) que usa comandos de texto e um método para sua entrada (digamos, um teclado para a digitação de comandos em um formato específico com opções específicas) (Silberschatz, 2015). Outra é a interface batch em que os comandos e suas diretivas de controle são inseridos em arquivos, e esses arquivos são executados. O mais comum é o uso de uma interface gráfica de usuário (GUI — graphical user interface). Nesse caso, a interface é um sistema de janelas com um dispositivo apontador para direcionar o I/O, selecionar a partir de menus e escolher opções e um teclado para entrada de texto. Alguns sistemas fornecem duas dessas variações ou as três. Execução de programas. O sistema deve ser capaz de carregar um programa na memória e executar esse programa. O programa deve ser capaz de encerrar sua execução, normal ou anormalmente (indicando o erro). Operações de I/O. Um programa em execução pode requerer I/O, e isso pode envolver um arquivo ou um dispositivo de I/O. Para dispositivos específicos, funções especiais podem ser desejáveis (como a gravação em um drive de CD ou DVD ou a limpeza de uma tela). Para eficiência e proteção, os usuários geralmente não podem controlar os dispositivos de I/O diretamente. Portanto, o sistema operacional deve fornecer um meio para executar I/O. Manipulação do sistema de arquivos. O sistema de arquivos é de especial interesse. É claro que os programas precisam ler e gravar arquivos e diretórios. Eles também precisam criar e excluí-los pelo nome, procurar um arquivo específico e listar informações de arquivos. ENG. MENDES CASTANHEIRO ANTÓNIO 36 SISTEMA OPERATIVO I Para concluir, alguns sistemas operacionais incluem o gerenciamento de permissões para permitir ou negar acesso a arquivos ou diretórios com base no proprietário dos arquivos. Muitos sistemas operacionais fornecem uma variedade de sistemas de arquivos, algumas vezes para permitir a escolha pessoal e, outras vezes, para fornecer recursos específicos ou características de desempenho. Comunicações. Há muitas situações em que um processo precisa trocar informações com outro processo. Essa comunicação pode ocorrer entre processos sendo executados no mesmo computador ou entre processos sendo executados emsistemas de computação diferentes, conectados por uma rede de computadores. As comunicações podem ser implementadas por memória compartilhada, em que dois ou mais processos leem e gravam em uma seção compartilhada da memória, ou por troca de mensagens, em que pacotes de informações em formatos predefinidos são transmitidos entre processos pelo sistema operacional. Deteção de erros. O sistema operacional precisa detetar e corrigir erros constantemente. Os erros podem ocorrer no hardware da CPU e da memória (como um erro de memória ou a falta de energia), em dispositivos de I/O (como um erro de paridade em disco, uma falha na conexão de rede ou a falta de papel na impressora) e no programa do usuário (como um overflow aritmético, uma tentativa de acessar uma locação ilegal na memória, ou o uso excessivo de tempo da CPU). Para cada tipo de erro, o sistema operacional deve tomar a medida apropriada para assegurar a computação correta e consistente. Em algumas situações, ele não tem escolha, a não ser interromper o sistema. Em outras, pode encerrar um processo causador de erro, ou retornar um código de erro ao processo para que este detecte o erro e, possivelmente, o corrija. Existe outro conjunto de funções do sistema operacional cujo objetivo não é ajudar o usuário, mas, sim, assegurar a operação eficiente do próprio ENG. MENDES CASTANHEIRO ANTÓNIO 37 SISTEMA OPERATIVO I sistema. Sistemas com múltiplos usuários podem ganhar eficiência compartilhando os recursos do computador entre os usuários. Alocação de recursos. Quando existem múltiplos usuários ou jobs ativos ao mesmo tempo, é necessário alocar recursos para cada um deles. O sistema operacional gerencia muitos tipos diferentes de recursos. Alguns (como os ciclos de CPU, a memória principal e o armazenamento em arquivos) podem ter um código especial de alocação, enquanto outros (como os dispositivos de I/O) podem ter um código muito mais genérico de solicitação e liberação. Por exemplo, para determinar a melhor forma de usar a CPU, os sistemas operacionais possuem rotinas de scheduling da CPU que levam em consideração a velocidade da CPU, os jobs que devem ser executados, o número de registradores disponíveis e outros fatores. Também podem existir rotinas de alocação de impressoras, drives de armazenamento USB e outros dispositivos periféricos. Contabilização. Queremos controlar que usuários utilizam que quantidade e que tipos de recursos docomputador. Essa monitoração pode ser usada a título de contabilização (para que os usuários possam ser cobrados) ou, simplesmente, para acumulação de estatísticas de uso. As estatísticas de uso podem ser uma ferramenta valiosa para pesquisadores que desejem reconfigurar o sistema para melhorar os serviços de computação. Proteção e segurança. Os proprietários de informações armazenadas em um sistema de computação multiusuário ou em rede podem querer controlar o uso dessas informações. Quando vários processos separados são executados concorrentemente, um processo não pode interferir nos outros ou no próprio sistema operacional. Proteção significa garantir que qualquer acesso a recursos do sistema seja controlado. A segurança do sistema contra invasores também é importante. Tal segurança começa com a exigência de que cada usuário se autentique junto ao sistema, geralmente por meio de uma senha, para obter acesso aos recursos do sistema. Ela se estende à defesa de dispositivos externos de I/O, incluindo adaptadores de rede, contra ENG. MENDES CASTANHEIRO ANTÓNIO 38 SISTEMA OPERATIVO I tentativas de acesso ilegal, e à gravação de todas essas conexões para a detecção de invasões. Para um sistema estar protegido e seguro, precauções devem ser tomadas em toda a sua extensão. A força de uma corrente se mede pelo seu elo mais fraco. 4.2- Chamadas de Sistema As chamadas de sistema fornecem uma interface com os serviços disponibilizados por um sistema operacional. Geralmente, essas chamadas estão disponíveis como rotinas escritas em C e C++, embora certas tarefas de baixo nível (por exemplo, tarefas em que o hardware deve ser acessado diretamente) possam precisar ser escritas usando instruções em linguagem de montagem (Silberschatz, 2015). Antes de discutirmos como um sistema operacional torna as chamadas de sistema disponíveis, vamos usar um exemplo para ilustrar como as chamadas de sistema são utilizadas: escrevendo um programa simples para ler dados em um arquivo e copiá-los em outro arquivo. A primeira entrada de que o programa precisará são os nomesdos dois arquivos: o arquivo de entrada e o arquivo de saída. Esses nomes podem ser especificados de muitas formas, dependendo do projeto do sistema operacional. Uma abordagem é aquela em que o programa solicita os nomes ao usuário. Em um sistema interativo, essa abordagem demandará uma sequência de chamadas de sistema, primeiro para exibir uma mensagem de alerta na tela e, em seguida, para ler a partir do teclado os caracteres que definem os dois arquivos. Em sistemas baseados em mouse e em ícones, é exibido, geralmente, um menu de nomes de arquivos em uma janela. O usuário pode, então, utilizar o mouse para selecionar o nome do arquivo de origem, e uma ENG. MENDES CASTANHEIRO ANTÓNIO 39 SISTEMA OPERATIVO I janela pode ser aberta para que o nome do arquivo de destino seja especificado. Essa sequência requer muitas chamadas de sistema de I/O. Uma vez que os dois nomes de arquivo tenham sido obtidos, o programa deve abrir o arquivo de entrada e criar o arquivo de saída. Cada uma dessas operações requer outra chamada de sistema. Condições de erro que podem ocorrer, para cada operação, podem requerer chamadas de sistema adicionais. Quando o programa tentar abrir o arquivo de entrada, por exemplo, pode descobrir que não há arquivo com esse nome, ou que o arquivo está protegido contra acesso. Nesses casos, o programa deve exibir uma mensagem no console (outra sequência de chamadas de sistema) e, então, terminar anormalmente (outra chamada de sistema). Se o arquivo de entrada existe, devemos criar um novo arquivo de saída. Podemos descobrir que já existe um arquivo de saída com o mesmo nome. Essa situação pode fazer com que o programa aborte (uma chamada de sistema), ou podemos excluir o arquivo existente (outra chamada de sistema) e criar um novo (mais uma chamada de sistema). Outra opção, em um sistema interativo, é perguntar ao usuário (por meio de uma sequência de chamadas de sistema para exibir a mensagem de alerta e para ler a resposta a partir do terminal) se deseja substituir o arquivo existente ou abortar o programa. Quando os dois arquivos estão definidos, entramos em um loop que lê o arquivo de entrada (uma chamada de sistema) e grava no arquivo de saída (outra chamada de sistema). Cada operação de leitura e gravação deve retornar informações de status referentes a várias condições de erro possíveis. Na entrada, o programa pode entender que o fim do arquivo foi alcançado ou que houve uma falha de hardware na leitura (como um erro de paridade). A operação de gravação pode encontrar vários erros, dependendo do dispositivo de saída (por exemplo, não há mais espaço em disco). Para concluir, após o arquivo inteiro ser copiado, o programa pode fechar os ENG. MENDES CASTANHEIRO ANTÓNIO 40 SISTEMA OPERATIVO I dois arquivos (outra chamada de sistema), exibir uma mensagem no console ou janela (mais chamadas de sistema) e, por fim, terminar normalmente (a última chamada de sistema). Essa sequência de chamadas de sistema é mostrada na Figura 2.5. Figura 4.2: Exemplo de como as chamadas de sistema são usadas. Como você pode ver, até mesmo programas simples podem fazer uso intenso do sistema operacional. Frequentemente, os sistemas executam milhares de chamadas de sistema por segundo. No entanto, a maioria dos programadores nunca vê esse nível de detalhe. Normalmente, os desenvolvedores de aplicações projetam programas de acordo com uma interface de programação de aplicações (API - application programming interface). A API especifica um conjunto de funções que estão disponíveis para um programador de aplicações, incluindo os parâmetros que são passados a cada função e os valores de retorno que o programador pode esperar. As três APIs mais comuns, disponíveis para programadores de aplicações, são a API Windows para sistemas Windows, a API POSIX para sistemas baseados em POSIX (que incluem virtualmente todas as versões do UNIX, Linux e Mac OS X) e a API Java para programas que são executados na máquina virtual Java. Um programador acessa uma API por ENG. MENDES CASTANHEIRO ANTÓNIO 41 SISTEMA OPERATIVO I meio de uma biblioteca de códigos fornecida pelo sistema operacional. No caso do UNIX e do Linux, para programas escritos na linguagem C, a biblioteca se chama libc. Observe que — a menos que especificado — os nomes das chamadas de sistema usados em todo este texto são exemplos genéricos. Cada sistema operacional tem seu próprio nome para cada chamada de sistema. Em segundo plano, as funções que compõem uma API invocam tipicamente as chamadas de sistema reais em nome do programador de aplicações. Por exemplo, a função Create Process ( ) do Windows (que, obviamente, é usada para criar um novo processo) na verdade invoca a chamada de sistema NT Create Process ( ) no kernel do Windows. Por que um programador de aplicações iria preferir programar de acordo com uma API em vez de invocar chamadas de sistema reais? Há várias razões para fazer isso. Um benefício está relacionado com a portabilidade dos programas. Um programador de aplicações, ao projetar um programa usando uma API, espera que seu programa seja compilado e executado em qualquer sistema que dê suporte à mesma API (embora, na verdade, diferenças de arquitetura frequentemente tornem isso mais difícil do que parece). Além do mais, as chamadas de sistema reais costumam ser mais detalhadas e difíceis de manipular do que a API disponível para um programador de aplicações. De qualquer forma, existe, com frequência, uma forte correlação entre uma função da API e a chamada de sistema associada a ela dentro do kernel. Na verdade, muitas das APIs POSIX e Windows são semelhantes às chamadas de sistema nativas fornecidas pelos sistemas operacionais UNIX, Linux e Windows (Silberschatz, 2015). EXEMPLO DE API PADRÃO ENG. MENDES CASTANHEIRO ANTÓNIO 42 SISTEMA OPERATIVO I Como exemplo de uma API padrão, considere afunção read ( ) que está disponível emsistemas UNIX e Linux. AAPI para essa função é o btida na página man invocando ocomando man read na linha de comando .Uma descrição dessa API é mostrada a seguir: Um programa que use a função read ( ) deve incluir o arquivo de cabeçalho unistd.h,já que esse arquivo define os tipos de dados ssize_tesize_t(entre outras coisas).Os parâmetros passados para read ( ) são os seguintes: int fd—o descritor dearquivo a ser lido void *buf—um buffer para o qual os dados serão lidos size_t count—o número máximo de bytes a serem lidosp arao buffer Em uma leitura bem-sucedida, o número de bytes lidos é retornado. Um valor de retorno igual a 0 indica fim de arquivo. Se ocorreum erro, read ( ) retorna- 1. Na maioria das linguagens de programação, o sistema de suporte ao tempo de execução (um conjunto de funções que faz parte das bibliotecas incluídas com o compilador) fornece uma interface de chamadas de sistema que serve como uma ponte para as chamadas de sistema disponibilizadas pelo ENG. MENDES CASTANHEIRO ANTÓNIO 43 SISTEMA OPERATIVO I sistema operacional. A interface de chamadas de sistema intercepta as chamadas de função da API e invoca as chamadas de sistema necessárias dentro do sistema operacional. Normalmente, um número é associado a cada chamada de sistema, e a interface de chamadas de sistema mantém uma tabela indexada de acordo com esses números. A interface de chamadas de sistema invoca, então, a chamada de sistema desejada no kernel do sistema operacional e retorna o status da chamada de sistema e quaisquer valores de retorno. O chamador não precisa saber coisa alguma sobre como a chamada de sistema é implementada ou o que ela faz durante a execução. Em vez disso, ele só precisa seguir a API e saber o que o sistema operacional fará como resultadoda execução dessa chamada de sistema. Portanto, a maioria dos detalhes da interface do sistema operacional é oculta do programador pela API e gerenciada pela biblioteca de suporte ao tempo de execução. O relacionamento entre uma API, a interface de chamadas de sistema e o sistema operacional é mostrado na Figura 2.6, que ilustra como o sistema operacional manipula uma aplicação de usuário invocando a chamada de sistema open (). As chamadas de sistema ocorrem de diferentes maneiras, dependendo do computador que estiver sendo usado. Geralmente, são necessárias mais informações do que simplesmente a identidade da chamada de sistema desejada. O tipo e o montante exatos das informações variam de acordo com a chamada e o sistema operacional específicos. Por exemplo, para obter entradas, podemos ter que especificar o arquivo ou dispositivo a ser usado como origem, assim como o endereço e o tamanho do buffer de memória para o qual a entrada deve ser lida. É claro que o dispositivo ou arquivo e o tamanho podem estar implícitos na chamada. Três métodos gerais são usados para passar parâmetros ao sistema operacional. A abordagem mais simples é passar os parâmetros em ENG. MENDES CASTANHEIRO ANTÓNIO 44 SISTEMA OPERATIVO I registradores. Em alguns casos, no entanto, pode haver mais parâmetros do que registradores. Nesses casos, os parâmetros são, em geral, armazenados em um bloco, ou tabela, na memória, e o endereço do bloco é passado como parâmetro em um registrador (Figura 2.7). Essa é a abordagem adotada pelo Linux e o Solaris. Os parâmetros também podem ser colocados ou incluídos na pilha pelo programa e extraídos da pilha pelo sistema operacional. Alguns sistemas operacionais preferem o método do bloco ou da pilha porque essas abordagens não limitam a quantidade ou o tamanho dos parâmetros que estão sendo passados. 4.2.1-Tipos de Chamadas de Sistema As chamadas de sistema podem ser agrupadas, grosso modo, em seis categorias principais: controle de processos, manipulação de arquivos, manipulação de dispositivos, manutenção de informações, comunicações e proteção (Silberschatz, 2015). Nas Seções 2.4.1 a 2.4.6, discutimos brevemente os tipos de chamadas de sistema que podem ser fornecidos por um sistema operacional. A maioria dessas chamadas de sistema dá suporte a, ou é suportada por conceitos e funções que são discutidos em capítulos posteriores. A Figura 2.8 resume os tipos de chamadas de sistema normalmente fornecidos por um sistema operacional. Como mencionado neste texto, quase sempre nos referimos às chamadas de sistema usando nomes genéricos. No decorrer do texto, no entanto, fornecemos exemplos de contrapartidas reais às chamadas de sistemas do Windows, UNIX e Linux. ENG. MENDES CASTANHEIRO ANTÓNIO 45 SISTEMA OPERATIVO I Figura 4.3 A manipulação de uma aplicação de usuário que invoca a chamada de sistema open (). Figura 4.4 Passagem de parâmetros como uma tabela. Tipos de chamadas de sistema. 1. Controle de processos encerrar, abortar carregar, executar criar processo, encerrar processo ENG. MENDES CASTANHEIRO ANTÓNIO 46 SISTEMA OPERATIVO I obter atributos do processo, definir atributos do processo esperar hora esperar evento, sinalizar evento alocar e liberar memória 2. Gerenciamento de arquivos criar arquivo, excluir arquivo abrir, fechar ler, gravar, reposicionar obter atributos do arquivo, definir atributos do arquivo 3. Gerenciamento de dispositivos solicitar dispositivo, liberar dispositivo ler, gravar, reposicionar obter atributos do dispositivo, definir atributos do dispositivo conectar oudesconectar dispositivos logicamente 4. Manutenção de informações obter a hora oua data, definir a hora oua data obter dados do sistema, definir dados do sistema obter atributos do processo, arquivo ou dispositivo definir atributos do processo, arquivo oudispositivo 5. Comunicações criar, excluir conexão de comunicações enviar, receber mensagens transferir informações de status conectar oudesconectar dispositivos remotos 4.3- Programas de sistema ou utilitários ENG. MENDES CASTANHEIRO ANTÓNIO 47 SISTEMA OPERATIVO I Os utilitários também são chamados comumente programas de sistema. Os SO mais modernos vêm aumentando a coleção desses tipos de programas. Você deve lembrar que há pouco tempo atrás você precisava de um programa específico para gravar arquivos em CDs e DVDs e para assistir um filme. Hoje estas funções estão embutidas no SO (Coutinho, 2010). Os programas de sistema fornecem um ambiente conveniente para a execução de uma série de tarefas de uso do computador ou de periféricos específicos. Alguns deles são simplesmente interfaces de usuário às chamadas ao sistema; outros são consideravelmente mais complexos. Podem ser divididos em categorias tais como: a) Gerência de arquivos - criam, excluem, copiam, renomeiam, imprimem, listam e geralmente manipulam arquivos e diretórios. Precisam trabalhar com diversos tipos de mídia: CD, DVD, HD, disquete, pendrive, etc; b) Informações de status - simplesmente pedem ao sistema informações relativas ao status da máquina ou de periféricos: data, hora, quantidade de memória ou espaço em disco disponível, número de usuários conectados, número de documentos aguardando impressão e outras informações semelhantes; c) Modificação de arquivo - vários editores de texto podem estar disponíveis para criar e modificar o conteúdo dos arquivos armazenados em disco, fita ou outro tipo de mídia; d) Comunicações - esses programas oferecem o mecanismo para criar conexões virtuais entre processos, usuários e diferentes sistemas de computação. Permitem aos usuários enviar mensagens às telas uns dos outros, navegar pelas páginas da web, efetuar logon remotamente ou transferir arquivos de uma máquina para outra; ENG. MENDES CASTANHEIRO ANTÓNIO 48 SISTEMA OPERATIVO I e) Spooling - permitem manipular a fila de impressão de documentos em uma ou mais impressoras ligadas ao sistema. 4.4- Linguagem de máquina Todos os programas, para serem processados, precisam estar em linguagem de máquina. Essa é a linguagem que o processador realmente consegue entender. Um programa em linguagem de máquina é totalmente codificado em formato binário, o que torna praticamente impossível o entendimento pelo usuário (Coutinho, 2010). O programa em linguagem de máquina pode ser diretamente processado pela unidade central de processamento (CPU) não requerendo qualquer tipo de tradução ou relocação. Um programa em linguagem de máquina não pode ser executado em outra máquina de modelo diferente, nem em outro SO. Cada processador possui um conjunto único de instruções de máquina previamente definido pelo fabricante. Estas instruções especificam detalhes como registradores, modos de endereçamento de memória, tipo de dados que caracterizam um processador e suas potencialidades. Por sua vez, cada SO tem um grupo de instruções específico, chamada API – Application ProgramIinterface – que os compiladores usam para traduzir as instruções escritas na linguagem de alto nível para a linguagem entendida pelo linker. Isso faz com que um programa compilado em Linux não funcione com Windows; ou que um programa compilado em um PC não funcione em um Apple (Coutinho, 2010). 5.PROCESSO Os primeiros computadores permitiam que apenas um programa fosse executado de cada vez. Esse programa tinha controle total sobre o sistema e acesso a todos os seus recursos. Por outro lado, os sistemas de computação ENG. MENDES CASTANHEIRO ANTÓNIO 49 SISTEMA OPERATIVO I contemporâneos permitem que vários programas sejam carregados na memória e executados concorrentemente.Essa evolução demandou controle mais firme e maior compartimentalização dos diversos programas; e essas necessidades resultaram na noção de processo, que é um programa em execução. Um processo é a unidade de trabalho em um sistema moderno de tempo compartilhado (Silberschatz, 2015). Quanto mais complexo é o sistema operacional, mais se espera que ele funcione em benefício de seus usuários. Embora sua principal preocupação seja a execução de programas de usuário, ele também precisa se encarregar de várias tarefas do sistema, que ficam melhor fora do próprio kernel. Portanto, um sistema é composto por um conjunto de processos: processos do sistema operacional executando código de sistema e processos de usuário executando código de usuário. Potencialmente, todos esses processos podem ser executados concorrentemente, com a CPU (ou CPUs) multiplexada entre eles. Alternando a CPU entre os processos, o sistema operacional pode tornar o computador mais produtivo. Neste capítulo, você lerá sobre o que são processos e como eles funcionam. 5.1 Conceito de Processo Uma questão que surge na discussão sobre os sistemas operacionais envolve como caracterizar todas as atividades da CPU. Um sistema batch executa jobs, enquanto um sistema de tempo compartilhado tem programas de usuário ou tarefas. Até mesmo em um sistema mono-usuário, o usuário pode executar vários programas ao mesmo tempo: um processador de texto, um navegador web e um pacote de e-mail. E mesmo que o usuário possa executar apenas um programa de cada vez, como em um dispositivo embutido que não suporte multitarefa, o sistema operacional deve dar suporte às suas próprias atividades programadas, como o gerenciamento da memória. Em muitos aspetos, essas atividades são semelhantes e, assim, todas são chamadas de processos (Silberschatz, 2015). ENG. MENDES CASTANHEIRO ANTÓNIO 50 SISTEMA OPERATIVO I Os termos job e processo são usados de maneira quase intercambiável neste texto. Embora o termo processo seja de nossa preferência, grande parte da teoria e terminologia dos sistemas operacionais foi desenvolvida durante uma época em que a principal atividade dos sistemas operacionais era o processamento de jobs. Seria enganoso evitar o uso de termos comumente aceitos que incluem a palavra job (como scheduling de jobs), simplesmente porque processo substituiu job. Informalmente, como já mencionado, um processo é um programa em execução. Um processo é mais do que o código do programa, que também é conhecido como seção de texto. Ele também inclui a atividade corrente, conforme representada pelo valor do contador do programa e o conteúdo dos registradores do processador. Geralmente, um processo também inclui a pilha do processo que contém dados temporários (como parâmetros de funções, endereços de retorno e variáveis locais), e uma seção de dados, que contém variáveis globais. Um processo também pode incluir um heap, que é a memória dinamicamente alocada durante o tempo de execução do processo (Silberschatz, 2015). A estrutura de um processo na memória é mostrada na Figura 5.1. Figura 5.1 Processo na memória. ENG. MENDES CASTANHEIRO ANTÓNIO 51 SISTEMA OPERATIVO I Enfatizamos que um programa por si só não é um processo. Um programa é uma entidade passiva, como um arquivo contendo uma lista de instruções armazenadas em disco (geralmente chamado de arquivo executável). Por outro lado, um processo é uma entidade ativa, com um contador de programa especificando a próxima instrução a ser executada e um conjunto de recursos associados. Um programa torna-se um processo quando um arquivo executável é carregado na memória. Duas técnicas comuns para a carga de arquivos executáveis são clicar duas vezes em um ícone representando o arquivo executável ou dar entrada no nome do arquivo executável na linha de comando (como em prog.exe ou a.out). Embora dois processos possam estar associados ao mesmo programa, ainda assim eles são considerados duas sequências de execução separadas. Por exemplo, vários usuários podem estar executando diferentes cópias do programa de e-mail ou o mesmo usuário pode invocar muitas cópias do programa de navegação na web. Cada uma delas é um processo separado e, embora as seções de texto sejam equivalentes, os dados, o heap e as seções de pilha variam. Também é comum haver um processo que gera muitos processos ao ser executado. Observe que o próprio processo pode ser um ambiente de execução para outros códigos. O ambiente de programação Java fornece um bom exemplo. Na maioria dos casos, um programa executável Java é operado dentro da máquina virtual Java (JVM). A JVM executa como um processo que interpreta o código Java carregado e realiza ações (por meio de instruções nativas da máquina) em nome desse código. Por exemplo, para executar o programa Java compilado Program.class, daríamos entrada em java Program O comando java executa a JVM como um processo comum que, por sua vez, executa o programa Java Program na máquina virtual. O conceito é o mesmo ENG. MENDES CASTANHEIRO ANTÓNIO 52 SISTEMA OPERATIVO I da simulação, exceto pelo fato de o código ser escrito na linguagem Java em vez de ser escrito a partir de um conjunto de instruções diferentes. 5.2 - Estado do Processo Quando um processo é executado, ele muda de estado. O estado de um processo é definido, em parte, pela atividade corrente do processo. Um processo pode estar em um dos seguintes estados (Silberschatz, 2015): Novo. O processo está sendo criado. Em execução. Instruções estão sendo executadas. Em espera. O processo está esperando que algum evento ocorra (como a conclusão de um I/O ou o recebimento de um sinal). Pronto. O processo está esperando que seja atribuído a um processador. Concluído. O processo terminou sua execução. Esses nomes são arbitrários e variam entre os sistemas operacionais. No entanto, os estados que eles representam são encontrados em todos os sistemas. Certos sistemas operacionais também descrevem, mais apuradamente, os estados do processo. É importante saber que apenas um processo pode estar em execução em algum processador a cada instante. Mas muitos processos podem estar prontos e em espera. O diagrama de estado correspondente a esses estados é apresentado na Figura 5.2. 5.2.1-Bloco de Controle de Processo Cada processo é representado, no sistema operacional, por um bloco de controle de processo (PCB — process control block) — também chamado bloco de controle de tarefa (Silberschatz, 2015). Um PCB é ENG. MENDES CASTANHEIRO ANTÓNIO 53 SISTEMA OPERATIVO I mostrado na Figura 5.3. Ele contém muitas informações associadas a um processo específico, incluindo estas: Estado do processo. O estado pode ser novo, pronto, em execução, em espera, parado, e assim por diante. Contador do programa. O contador indica o endereço da próxima instrução a ser executada para esse processo. Registradores da CPU. Os registradores variam em número e tipo, dependendo da arquitetura do computador. Eles incluem acumuladores, registradores índices, ponteiros de pilhas e registradores de uso geral, além de qualquer informação do código de condição. Junto com o contador do programa, essas informações de estado devem ser salvas quando ocorre uma interrupção, para permitir que o processo seja retomado corretamente mais tarde (Figura 5.4). Informações de scheduling da CPU. Essas informações incluem a prioridade de um processo, ponteiros para filas de scheduling e quaisquer outros parâmetros de scheduling. Informações de gerenciamento da memória. Essas informações podem incluir itens como o valor dos registradores base e limite e as tabelas de páginas, ou as tabelas de segmentos, dependendo do sistema de memória usado pelosistema operacional . Figura 5.2 Diagrama de estado do processo. ENG. MENDES CASTANHEIRO ANTÓNIO 54 SISTEMA OPERATIVO I Figura 5.3 Bloco de controle de processo (PCB). Informações de contabilização. Essas informações incluem o montante de tempo real e de CPU usados, limites de tempo, números de conta, números de jobs ou processos, e assim por diante. Informações de status de I/O. Essas informações incluem a lista de dispositivos de I/O alocados ao processo, uma lista de arquivos abertos, e assim por diante. Resumindo, o PCB serve, simplesmente, como o repositório de quaisquer informações que possam variar de um processo para outro. 5.3-Escalonamento de Processos O escalonamento de processadores é a forma como os processadores existentes num sistema computacional são utilizados para efetuar o processamento, isto é, é como os processos são distribuídos para execução nos processadores. Tanenbaum propõe a seguinte definição: Quando mais de um processo é executável, o sistema operacional deve ENG. MENDES CASTANHEIRO ANTÓNIO 55 SISTEMA OPERATIVO I decidir qual será executado primeiro. A parte do sistema operacional dedicada a esta decisão é chamada escalonador ( scheduler) e o algoritmo utilizado é chamado algoritmo de escalonamento ( scheduling algorithm) (TANENBAUM, 1992). Por sua vez, Deitel coloca que: A designação de processadores físicos para processos permite aos processos a realização de trabalho. Esta designação é uma tarefa complexa realizada pelo sistema operacional. Isto é chamado escalonamento do processador ( processor scheduling), (DEITEL, 1992).. Simplificando, podemos afirmar que num sistema onde só exista um único processador, o escalonamento representa a ordem em que os processos serão executados. A forma com que se dá o escalonamento é, em grande parte, responsável pela produtividade e eficiência atingidas por um sistema computacional. Mais do que um simples mecanismo, o escalonamento deve representar uma política de tratamento dos processos que permita obter os melhores resultados possíveis num sistema. 5.3.1 Objetivos do escalonamento O projeto de um escalonador adequado deve levar em conta uma série de diferentes necessidades, ou seja, o projeto de uma política de escalonamento deve contemplar os seguintes objetivos: Ser justo: todos os processos devem ser tratados igualmente, tendo possibilidades idênticas de uso do processador, devendo ser evitado o adiamento indefinido. ENG. MENDES CASTANHEIRO ANTÓNIO 56 SISTEMA OPERATIVO I Maximizar a produtividade (throughput): procurar maximizar o número de tarefas processadas por unidade de tempo. Ser previsível: uma tarefa deveria ser sempre executada com aproximadamente o mesmo tempo e custo computacional. Minimizar o tempo de resposta para usuários interativos. Maximizar o número possível de usuários interativos. Minimizar a sobrecarga (overhead): recursos não devem ser desperdiçados embora algum investimento em termos de recursos para o sistema pode permitir maior eficiência. Favorecer processos bem-comportados: processos que tenham comportamento adequado poderiam receber um serviço melhor. Balancear o uso de recursos: o escalonador deve manter todos os recursos ocupados, ou seja, processos que usam recursos subutilizados deveriam ser favorecidos. Exibir degradação previsível e progressiva em situações de intensa carga de trabalho. Como pode ser visto facilmente, alguns destes objetivos são contraditórios, pois dado que a quantidade de tempo disponível de processamento (tempo do processador) é finita, assim como os demais recursos computacionais, para que um processo seja favorecido outro deve ser prejudicado. O maior problema existente no projeto de algoritmos de escalonamento está associado a natureza imprevisível dos processos, pois não é possível prevermos se um dado processo utilizar à intensamente o processador, ou ENG. MENDES CASTANHEIRO ANTÓNIO 57 SISTEMA OPERATIVO I se precisará grandes quantidades de memória ou se necessitar aos numerosos acessos aos dispositivos de E/S. 5.3.2 Níveis de escalonamento Existem três níveis distintos de escalonamento em um sistema computacional quando se considera a frequência e complexidade das operações envolvidas. • Escalonamento de alto nível Chamado também de escalonamento de tarefas, corresponde a admissão de processos, isto é, a determinação de quais tarefas passarão a competir pelos recursos do sistema. Uma vez admitidas, as tarefas transformam-se em processos. Correspondem a rotinas de alto nível oferecidas pelas APIs do sistema operacional. • Escalonamento de nível intermediário Corresponde a determinação de quais processos existentes competirão pelo uso do processador (processos ativos). Este nível de escalonamento é responsável por administrar a carga do sistema, utilizando-se de primitivas de suspensão (suspend) e ativação (resume ou activate). Correspondem a rotinas internas do sistema operacional. • Escalonamento de baixo nível Rotinas que determinam qual processos, dentre os processos ativos, será o próximo processo que efetivamente utilizará o processador. Estas tarefa são executadas pelo dispatcher, usualmente uma rotina escrita diretamente em linguagem de máquina que se encontra permanentemente na memória principal. ENG. MENDES CASTANHEIRO ANTÓNIO 58 SISTEMA OPERATIVO I Os níveis de escalonamento alto, intermediário e baixo também são conhecidos respetivamente como escalonamento de longo prazo, médio prazo e curto prazo. O escalonamento de alto nível ou de longo prazo ocorre menos frequentemente num sistema enquanto o escalonamento de baixo nível ou de curto prazo ocorre constantemente, dado que representa a troca de contexto e o chaveamento do processador entre os processos ativos. Considerando assim os níveis de escalonamento e as operações de suspensão (suspend ou sleep) e ativação (resume, wakeup ou activate), o mapa de estados dos processos pode ser representado de maneira mais completa como ilustrado na Figura 3.2. 5.3 - Escalonamento preemptivo e não preemptivo Um algoritmo de escalonamento é dito não preemptivo quando temos que o processador designado para um certo processo não pode ser retirado deste até que o processo seja finalizado (completion). Analogamente, um algoritmo de escalonamento é considerado preemptivo quando o processador designado para um processo pode ser retirado deste em favor de um outro processo. ENG. MENDES CASTANHEIRO ANTÓNIO 59 SISTEMA OPERATIVO I Figura 5.1: Níveis de escalonamento Algoritmos preemptivos são mais adequados para sistemas em que múltiplos processos requerem atenção do sistema, ou seja, no caso de sistemas multiusuário interativos (sistemas em tempo repartido) ou em sistema de tempo real. Nestes casos, a preemptividade representa a troca do processo em execução, assim sendo, para que o processador seja retirado de um processo, interrompendo seu trabalho, e designado a outro processo, anteriormente interrompido, é fundamental que ocorra a troca de contexto dos processos. Tal troca exige que todo o estado de execução de um processo seja adequadamente armazenado para sua posterior recuperação, representando uma sobrecarga computacional para realização desta troca e armazenagem de tais dados. Usualmente os algoritmos preemptivos são mais complexos dada a natureza imprevisível dos processos. Por sua vez, os algoritmos não preemptivos são mais simples e adequados para o processamento não interativo, semelhante aos esquemas de ENG. MENDES CASTANHEIRO ANTÓNIO 60 SISTEMA OPERATIVO I processamento em lote dos sistemas batch. Emboran˜ao proporcionando interatividade, são geralmente mais eficientes e previsíveis quanto ao tempo de entrega de suas tarefas. Figura 5.2: Mapa de estados dos processos Existem também algoritmos de escalonamento cooperativo, onde os processos não são interrompidos, mas a preempção ocorre em duas situações bem definidas: quando o processo efetua uma operação de I/O e quando o processo é finalizado (SILBERSCHATZ, GALVIN, & GAGNE, 2001). Também é possível que um processo ceda o processador, voluntariamente, em favor de outros processos. Neste caso, o processo educado poderia executar uma chamada a uma função yeld (dar preferência), como no caso do MS-Windows 3.1. A preempção voluntária pode auxiliar numa distribuição mais equitativa da capacidade de processamento do sistema, mas conta com a generosidade do programador, nem sempre disponível. A preemptividade de certos algoritmos se baseia no fato de que o processador é, naturalmente, um recurso preemptivo, ou seja, um recurso que pode ser retirado de um processo e posteriormente devolvido sem prejuízo. O mesmo acontece com a memória. Por outro lado, outros tipos de recursos não podem sofrer preempção, tais como impressoras e até mesmo ENG. MENDES CASTANHEIRO ANTÓNIO 61 SISTEMA OPERATIVO I arquivos, dado que muitas vezes não podem ser retirados de um processo sem que ocorra prejuízo para este. ENG. MENDES CASTANHEIRO ANTÓNIO 62 SISTEMA OPERATIVO I REFERÊNCIAS Coutinho, B. C. (2010). Sistemas Operacionais. Santa Catarina. CRAY. (2004). Cray X1 Product Overview. Cray Research Inc., Internet. Obtido de www.cray.com: http://www.cray.com/, acessado em 5/2020. DEITEL, H. M. (1992). An Introduction to Operating Systems, 2nd. Reading: Edition. Addison- Wesley. DEITEL., H. M. (1992). An Introduction to Operating Systems, 2nd. Reading. GALVIN, A. S. (2000). Sistemas Operaticionais: Conceito, 5º Edição. Prantice Hall. São Paulo: SP. Pereira, A. S., Vissotto, E. M., & Franciscatto, R. (2015). Sistemas Operacionais. Brasil. Silberschatz, A. (2015). Fundamentos de Sistemas Operacionais 9ª Edição. Rio de Janeiro. SILBERSCHATZ, A., GALVIN, P. B., & GAGNE, G. (2001). Sistemas Operacionais: Conceitos e Aplicações, Câmpus. Rio de Janeiro, RJ. STALLINGS, W. (1992). Operating Systems. New York: NY. STALLINGS, W. (1992). Operating Systems. Macmilla. New York: NY. TANENBAUM, A. S. (1992). Modern Operating Systems. Prentice Hall,. Upper Saddle River. INTRODUÇÃO 1- COMPONENTES DE HARDWARE 1.1- Processador 1.2.1- CISC 1.2.2- RISC 1.3-Memória 1.3.1-Memória principal 1.3.2- Memória cache 1.4 Periféricos 1.4.1- Dispositivos de entrada 1.4.2- Dispositivos de saída 1- SISTEMAS OPERACIONAIS 2- ESTRUTURAS DE SISTEMAS DE COMPUTAÇÃO 2.1-Operação do Sistema de Computação 2.2- Estrutura de I/O 2.3-Estrutura de Armazenamento 2.4-Buffering 2.5-Spooling 2.6-Reentrância 4- ESTRUTURAS DE SISTEMA OPERACIONAL 4.1- Serviços do Sistema Operacional 4.1.1-Funções de serviços do sistema operacional 4.2- Chamadas de Sistema 4.2.1-Tipos de Chamadas de Sistema 4.3- Programas de sistema ou utilitários 4.4- Linguagem de máquina 5.PROCESSO 5.1 Conceito de Processo 5.2 - Estado do Processo 5.2.1-Bloco de Controle de Processo 5.3-Escalonamento de Processos 5.3.1 Objetivos do escalonamento 5.3.2 Níveis de escalonamento 5.3 - Escalonamento preemptivo e não preemptivo REFERÊNCIAS