Prévia do material em texto
1 Sistemas Operacionais Prof. MSc. Leandro KravczukProf. MSc. Leandro Kravczuk proflkv@gmail.comproflkv@gmail.com www.facebook.com/profleandrokvwww.facebook.com/profleandrokv 2 Bibliografia Básica Tanenbaum, A. S. Sistemas Operacionais Modernos. Ed. Pearson, 3ª Edição, 2010. Machado, F. B., Maia, L. P. Arquitetura de Sistemas Operacionais. LTC Editora, 4ª Edição 2007. Silberschatz, A., Galvin, P. B., Gaine, G. Fundamentos de Sistemas Operacionais. LTC, 8ª Edição, 2010. Complementar Deitel, H.M., Deitel, P. J., CHOFFNES, D. R. Sistemas Operacionais. Ed. Pearson, 3ª Edição, 2005. Flynn, I. M., Mchoes, A. M. Introdução aos Sistemas Operacionais, Cengage Learning, 2002. Tanenbaum, A. S., Woodhull, A. S. Sistemas Operacionais – Projeto e Implementação. Grupo A Editoras, 3ª Edição, 2008. Silberchatz, A., Galvin, P. B., Gagne, G. Sistemas Operacionais com Java. 7ª Edição Campus, 2008. Oliveira, R. S, Carissimi, A., Toscani, S. Sistemas Operacionais, Coleção Livros Didáticos Informática UFRGS, Vol 11, Grupo A Editoras, 4ª Edição, 2010. 3 Provas S.O. 1ºAV – 01 de Outubro 2ºAV – 03 de Dezembro Obs: Entrega da parte escrita do P.I. II 4 Projeto Interdisciplinar II - Conteúdo Programático • Levantamento histórico de dois Sistemas Operacionais; • Vantagens e desvantagens da utilização dos Sistemas Operacionais escolhidos; • Aplicabilidade dos Sistemas Operacionais escolhidos no meio acadêmico, doméstico e profissional; • Comparativo entre os dois Sistemas Operacionais escolhidos (no meio acadêmico, doméstico e profissional); • Estudo de caso de uma empresa existente, mostrando qual Sistema Operacional é atualmente utilizado (clientes e servidores) e qual o Sistema Operacional que melhor se adequaria para realidade da empresa escolhida. 5 Proj Interdisciplinar II Quantidade de Alunos: • Máximo de 10 pessoas por equipe • Reuniões Agendar pelo proflkv@gmail.com Disponibilidade: Segundas - 18:00 às 18:45 e/ou Terças - 18:00 às 18:45 e/ou por email proflkv@gmail.com 6 - Entrega do trabalho [impresso (encadernado) e por email (arquivo .doc ou .docx)] completo composto de capa, folha de rosto sumário, introdução, metodologia, referencial teórico (em média de oito a quinze folhas) e referências; - Apresentação do trabalho através de um pôster. - Apresentação do PowerPoint utilizando o DataShow para toda turma. - Entrega trabalho impresso: No dia da 2º AV - Data para Apresentação do Pôster e DataShow: A combinar com o Prof. 7 Introdução O que compõem um Sistemas Computacional? Processadores; Memória; Discos; Impressora; Teclado; Monitor, Placas de Rede e outros dispositivos de entrada e saida. Para gerenciar esses recursos existe o sistema operacional, cujo trabalho é fornecer aos programas do usuário um modelo de computador melhor, mais simples e limpo e lidar com o gerenciamento de todos os recursos mencionados. 8 Windows? Linux? Mac OS X? O programa que os usuários interagem: • Shell: interpretador de comandos • GUI: Interface gráfica com o usuário Eles não fazem parte do SO, embora o utilize para realizar seu trabalho. Introdução 9 Introdução A maioria dos computadores tem dois níveis de operação: modo núcleo e modo usuário. O S.O. é a peça mais básica de software e opera em modo núcleo (modo supervisor). Nesse modo ele tem acesso completo a todo o hardware e pode executar qualquer instrução que a máquina seja capaz de executar. O resto do software opera em modo usuário, no qual apenas um subconjunto de instruções da máquina está disponível. As instruções que afetam o controle da máquina ou realizam E/S são proibidas para programas de modo usuário. 10 Onde o SO se encaixa 11 O programa de interface com o usuário, shell ou GUI, é o nível mais inferior do software de modo usuário e permite que este inicie programas, como o navegador Web. Esses programas também usam muito o S.O. Sistemas Operacionais ≠ Aplicações SO: Grandes, complexos e têm vida longa. Difíceis de escrever; Evoluem com o tempo. Introdução 12 É um software que executa em modo núcleo, ou seja, fornece aos aplicativos um conjunto de recursos abstratos claro em vez de recursos confusos de hardware e também gerencia esses recursos de hardware. O que é um SO? 13 É uma máquina estendida – Oculta os detalhes complicados que têm quer ser executados – Apresenta ao usuário uma máquina virtual, mais fácil de usar Exemplo: => O que é um SO? 14 SO transformam hardware feio em abstrações bonitas 15 O que é um SO? É um gerenciador de recurso • Cada programa tem um tempo com o recurso Diferentes programas aguardam sua vez para utilizá-lo; Ex: Múltiplas saídas são enfileiradas para imprimir em uma única impressora. O SO decide qual será a próxima saída a ser impressa. • Cada programa tem um espaço no recurso Cada um ocupa uma parte do recurso. Ex: A memória principal é dividida entre vários programas em execução, assim cada um pode residir ao mesmo tempo na memória. É mais eficiente mantê-los nela em vez de destinar toda memória a um só programa, principalmente se ele precisar de apenas uma pequena fração do total. 16 A História dos SOs • Primeira geração 1945 - 1955 – Válvulas, painéis de programação • Segunda geração 1955 - 1965 – transistores, sistemas em lote • Terceira geração 1965 – 1980 – CIs e multiprogramação • Quarta geração 1980 – presente – Computadores pessoais 17 Aspectos Históricos dos S.O.’s 1ª Geração (1945-1955): Válvulas e Painéis de Programação • Máquinas imensas com milhares de válvulas e milhões de vezes mais lentas que os mais lentos computadores atuais; • Um mesmo grupo de pessoas projetava, construía, programava, operava e realizava a manutenção de cada máquina; • No início da década de 50 a programação em painéis deu lugar à programação em cartões. 18 Aspectos Históricos dos S.O.’s 1ª Geração (1945-1955): Válvulas e Painéis de Programação * Toda programação era feita em código de máquina absoluto e muitas vezes conectando plugs em painéis para controlar as funções básicas da máquina. • Não havia linguagens de programação (nem mesmo a linguagem assembly); • Os S.O.s também não haviam sido inventados. • O programador reservava antecipadamente tempo de máquina em uma planilha, ia para a sala da máquina, inseria seu painel de programação no computador e passava algumas horas torcendo para que nenhuma das 20 mil válvulas queimasse durante a execução. 19 Aspectos Históricos dos S.O.’s 1ªGeração (1945-1955): Válvulas e Painéis de Programação 20 2ª Geração (1955-1965): Transistores e Sistemas em Lote (batch) – Computadores de grande porte (mainframes), fabricados e comercializados com a expectativa de maior tempo de funcionamento. - Separação entre projetistas, fabricantes, programadores e técnicos da manutenção; – Sistemas operacionais típicos desta época: FMS (Fortran Monitor System) e o IBSYS, do IBM-7094. Aspectos Históricos dos S.O.’s 21 2ª Geração (1955-1965): Transistores e Sistemas em Lote (batch) – Ficavam isolados em salas especiais com ar- condicionado, operadas por equipes profissionais; – Somente grandes corporações, governo ou universidades podiam pagar vários milhões de dólares por estes computadores; Aspectos Históricos dos S.O.’s 22 2ª Geração (1955-1965): Transistores e Sistemas em Lote (batch) – Para uma tarefa se executada, o programador primeiro escrevia o programa em um papel e depois perfurava em cartões. Então levava o maço de cartões para a sala de entradas e entregava-o a um dos operadores. – Ao fim da execução, o operador ia até a impressora, retirava sua saídae levava para a sala de saídas, de modo que o programador pudesse retirá-la mais tarde. Aspectos Históricos dos S.O.’s 23 2ª Geração (1955-1965): Transistores e Sistemas em Lote (batch) • Sistema em Lote (batch): registro de vários jobs em fita magnética. Aspectos Históricos dos S.O.’s 24 2ª Geração (1955-1965): Transistores e Sistemas em Lote (batch) IBM1401 Aspectos Históricos dos S.O.’s 25 2ª Geração (1955-1965): Transistores e Sistemas em Lote (batch) IBM7094 Aspectos Históricos dos S.O.’s 26 Aspectos Históricos dos S.O.’s 3ªGeração (1965-1980): Circuitos Integrados e Multiprogramação – System/360 da IBM. Série de máquinas compatíveis (teoricamente), com a mesma arquitetura e conjunto de instruções, voltada tanto para a computação numérica quanto para a comercial 27 Aspectos Históricos dos S.O.’s 3ªGeração (1965-1980): CI’s e Multiprogramação • Sistema Operacional: OS/360. Requisitos de Software: ser executado em sistemas pequenos e em sistemas muito grandes; ser eficiente em máquinas com poucos periféricos e também em computadores com muitos periféricos; ser eficaz em todos os diferentes usos. • OS/360, “batendo”: milhões de linhas escritas em linguagem de montagem por milhares de programadores com milhares de erros e muitas correções (versões). • OS/360, “assoprando”: atendia razoavelmente bem à maioria dos clientes; popularizava técnicas novas como a multiprogramação e spooling (simultaneous peripheral operation online). 28 Aspectos Históricos dos S.O.’s 3ªGeração (1965-1980): CI’s e Multiprogramação • Multiprogramação: divisão da memória em vários jobs, com um job para cada partição. Enquanto um job esperava que a operação de E/S se completasse, um outro poderia usar a CPU. • Spooling: job transferido do cartão para discos magnéticos, e, após a execução, liberados da partição destes discos, possibilitando a carga de um novo job. Os 1401 já não eram mais necessários... 29 Aspectos Históricos dos S.O.’s 3ªGeração (1965-1980): CI’s e Multiprogramação • Timesharing: variante da multiprogramação na qual cada usuário se conectava por meio de um terminal on- line. – CTSS (compatible time sharing system): 1º sistema timesharing, desenvolvido no MIT. • MULTICS(Serviço de computação e de informação multiplexada): MIT, Bell Labs e General Electric e o fornecimento de “energia computacional”. 30 Aspectos Históricos dos S.O.’s 3ª Geração (1965-1980): CI’s e Multiprogramação – MULTICS: • Projetado para suportar centenas de usuários em uma única máquina; • Bells Labs e General Eletric deixaram o projeto; • Usuários extremamente leais; • Várias idéias influenciaram positivamente os S.O.’s subseqüentes.. 31 Aspectos Históricos dos S.O.’s 3ª Geração (1965-1980): CI’s e Multiprogramação – Ken Thompson, do Bell Labs, escreveu uma versão monousuário do MULTICS denominada... UNIX. – Após inúmeras versões incompatíveis do UNIX, foi desenvolvido o padrão POSIX (Portable Operating System-IX): interface mínima de chamadas ao sistema. – Tanenbaum e o seu MINIX, em 1987-> Linus Torvalds escreve o LINUX. 32 Aspectos Históricos dos S.O.’s 4ª Geração (1980-Presente): Computadores Pessoais – Em 1974, a Intel lançou a 1ª CPU de 8 bits, a 8080. – Gary Kildall, consultor Intel, escreve um S.O. para a 8080: CP/M (programa de controle para microcomputadores). – A Intel abre mão dos direitos do CP/M para a firma de Kildall, a Digital Research. – Em 1977, a Digital Research lança um remodelado CP/M e domina a microcomputação por cinco anos. 33 Aspectos Históricos dos S.O.’s 4ª Geração (1980 - Presente): Computadores Pessoais CP/M 34 Aspectos Históricos dos S.O.’s 4ª Geração ( 1980 - Presente): Computadores Pessoais – Início dos anos 80: Projeto do IBM PC. Bill Gates é procurado pela IBM para licenciar o BASIC e... Requisitar um S.O.. – Bill Gates recomenda o S.O. da Digital Research de Gary Kildall, que... Se recusa a se reunir com a IBM! IBM procura Mr. Gates novamente. – Gates adquire o DOS (disk operating system) da Seattle Computer Products. Na verdade ele compra a Seatlle, empresa de Tim Paterson por 50 mil dólares. 35 Aspectos Históricos dos S.O.’s 4ª Geração ( 1980 – Presente ): Computadores Pessoais – Atendendo a um pedido da IBM, Gates modifica o DOS. Dono da Microsoft, Gates contrata Tim Paterson para modificar o projeto original do DOS. Lança-se então o MS-DOS (Microsoft...Disk Operating System). – MS-DOS lançado com o 80286, 80386 e 80486. O MS-DOS foi se aperfeiçoando, com aspectos cada vez mais avançados, muitos deles derivados do UNIX. 36 Aspectos Históricos dos S.O.’s 4ª Geração (1980-Presente) : Computadores Pessoais – MS-DOS 37 4ª Geração (1980-Presente): Computadores Pessoais – Doug Engelbart no Stanford Research Institute nos anos 60 criou a GUI (graphical user interface), que fora incorporada às máquinas do Xerox PARC. – Steve Jobs incorporou a GUI ao Apple – Projeto Lisa: fracasso comercial! – Steve Jobs e a 2ª tentativa com a GUI: Apple Macintosh... 38 Aspectos Históricos dos S.O.’s MAC OS 39 Aspectos Históricos dos S.O.’s 4ª Geração (1980 - Presente): Computadores Pessoais – Bill Gates lança o Windows, baseado na interface GUI e influenciado pelo sucesso do Macintosh. De 1985 a 1995, o Windows foi apenas um interpretador de comandos. – A seguir, Windows 95, com vários aspectos de um S.O., mas com boot e alguns programas do MS-DOS. – Windows 98, versão levemente modificada do 95. – Windows NT (new tecnology): totalmente 32 bits. 40 Aspectos Históricos dos S.O.’s 41 Aspectos Históricos dos S.O.’s 4ª Geração (1980-Presente): Computadores Pessoais – Versão 5 do Windows NT renomeada para Windows 2000. A expectativa de suceder tanto o Windows NT 4.0 quanto o Windows 98 não obteve êxito. – Lançou-se mais uma versão do Windows 98, denominada Windows Me (Millenium Edition). – Windows XP, Windows Vista e Windows 7 – Unix e as máquinas RISC. MIT escreveu um sistema de janelas para UNIX denominada X Windows 42 Aspectos Históricos dos S.O.’s 43 Aspectos Históricos dos S.O.’s 44 4ª Geração ( 1980 - Presente): Computadores Pessoais – Meados dos Anos 80: Sistemas Operacionais de Rede. Usuários podem conectar-se a máquinas remotas. Cada máquina executa seu próprio S.O. (local) e tem seu próprio usuário. – Sistema Operacional Distribuído: composto de múltiplos processadores. Os usuários não precisam saber onde estão seus programas e arquivos. Tudo é tratado pelo S.O.. Aspectos Históricos dos S.O.’s 45 Hardware de Computadores Um S.O. está intimamente ligado ao hardware do computador no qual ele é executado. Ele estende o conjunto de instruções do computador e gerencia seus recursos. 46 Processadores O ‘cérebro’ do computador é a CPU. Ela busca instruções na memória e as executa. O ciclo básico de execução de qualquer CPU é: buscar a primeira instrução da memória, decodificá-la para determinar seus operandos e qual operação executar com esses, executá-la e então buscar, decodificar e executar as instruções subsequentes. O ciclo é repetido até que o programa pare. É dessa maneira que os programas são executados. 47 Conceitos em S.O. Processos – Essencialmente um Processo é um programa em execução; – Associado a cada processo está o seu espaço de endereçamento , isto é, uma lista de locais da memória em que o processo pode ler e gravar. – Processo é um contêiner que armazena todas as informações necessárias para executar um programa. Ex: Edição de vídeo, navegador da web e o receptor de email. - Processos possuem ponteiros que sãoresponsáveis por mostrar a posição atual (o número do próximo byte ou registro a ser lido) - Tabela de Processos: Tabela do S.O. onde todas informações relativas a um processo são armazenadas. 48 Conceitos em S.O. – As principais chamadas de sistema de gerenciamento de processos são aquelas que lidam com a criação e o término de processos (ex: interpretador de comandos ou shell) – Um processo pode criar outros processos (processos filhos), determinando uma estrutura de processos. 49 Conceitos em S.O. – Processos relacionados que estiverem cooperando em alguma tarefa, precisam se comunicar e sintonizar suas ações. É a chamada comunicação entre processos. Ex: processos remoto em redes – A cada pessoa autorizada a usar um sistema é atribuida uma UID (identificação do usuário). A UID com poderes especiais e que pode violar muitas das regras de proteção é chamada de superusuário (em UNIX) 50 Conceitos em S.O. Deadlock – Ao interagirem, dois ou mais processos podem , algumas vezes, entrar em uma situação da qual eles não conseguem sair. É o chamado Deadlock. – Imagine um computador, uma unidade de fita e um gravador de CD. A requisita a fita e é atendido. B requisita o gravador e é atendido. A requisita o gravador e espera. B requisita a fita e espera. Ambos esperam... deadlock! 51 Conceitos em S.O. 52 Conceitos em S.O. Gerenciamento de Memória – No uso compartilhado da memória, qualquer programa residente deve manter-se livre de interferências dos outros programas. O gerenciamento de memória é responsável por esse mecanismo de proteção. – O gerenciamento de memória é responsável também pelo controle do espaço de endereçamento dos processos. • Memória Virtual 53 Conceitos em S.O. Arquivos – Uma característica importante de um S.O. é a capacidade de esconder peculiaridades de discos e outros elementos de E/S e apresentar um modelo abstrato de arquivos independentes de dispositivo. – Diretório: forma de agrupamento de arquivos. – As entradas de diretório podem ser arquivos ou outros diretórios. Esta possibilidade determina uma hierarquia - o sistema de arquivo. 54 Conceitos em S.O. Sistema de Arquivos 55 Conceitos em S.O. – Cada arquivo dentro da hierarquia de diretórios pode ser especificado fornecendo- se o caminho a partir do topo da hierarquia de diretórios, o diretório-raiz. • Ex: CS101, slide anterior • Antes que possa ser trabalhado, um arquivo precisa ser aberto e, nesse momento, as permissões são verificadas. 56 Conceitos em S.O. – Montagem do sistema de arquivos. Ex: Cd-ROM, Pen Drive 57 Conceitos em S.O. Pipe: é um tipo de pseudoarquivo que pode ser usado para conectar dois processos. 58 Conceitos em S.O. Entrada e Saída (E/S) – O S.O. deve gerenciar os dispositivos de E/S. – Alguns programas se aplicam a qualquer recurso de E/S; outros, como os drives, são específicos a cada dispositivo. • Ex: Teclado, Monitores e impressoras. 59 • Segurança – É tarefa do S.O. gerenciar o sistema de segurança para que os arquivos, p.e., sejam acessíveis apenas por usuários autorizados. • Ex: Proprietário, membros do grupo do proprietário e qualquer usuário. Os 3 bits são conhecidos como bits rwx Conceitos em S.O. 60 Conceitos em S.O. • Shell: interpretador de comando do UNIX. – Não é parte do Sistema Operacional, porém é um software importante que trabalha junto ao S.O. – É a interface principal entre o usuário à frente de seu terminal e o S.O. (a menos que o usuário esteja usando uma GUI). A Interface GUI é um programa sendo executado na camada superior do S.O., como um shell. Exemplos: COMMAND.COM, EXPLORER.EXE, BShell, CShell. 61 Conceitos em S.O. – Exemplos de comandos interpretados pelo Command.com: • dir; cd; md; – Exemplos de comandos interpretados pelo Shell do Linux: • ls; cd; mkdir; rm; find 62 Conceitos em S.O. • Os Sistemas Operacionais têm duas funções principais: – Fornecer abstrações aos programas de usuários; – Administrar os recursos do computador (transparente para os usuários e feita automaticamente). 63 Conceitos em S.O. Chamada de Sistema (System Call): interface entre o sistema operacional e os programas de usuário. 64 Conceitos em S.O. System Call 65 Modo Kernel e de Usuário do Processador: para que os programas de usuário não tenham acesso a determinadas instruções do processador, foram criados modos de acesso a estas instruções. O Modo Kernel ou Modo Protegido é restrito ao Sistema Operacional. 66 Estrutura UNIX – Kernel: é o núcleo do sistema operacional, controla o hardware traduzindo comandos UNIX em instruções de hardware. O usuário não trabalha diretamente com o kernel. – Sistema de arquivos: é o modo do UNIX armazenar informações de qualquer tipo, como por exemplo, gráficos, textos, etc. – Shell: é um programa que atua como interface entre o kernel e o usuário. – Aplicativos: são programas que podem ser invocados pelo shell para realizar diversas tarefas. 67 Aspectos Sobre a Estrutura dos Sistemas Operacionais • As rotinas do S.O. oferecem serviços aos usuários e às suas aplicações. O conjunto destas rotinas é chamado de núcleo, ou kernel. • Os usuários podem interagir com o núcleo do S.O. por meio de: aplicações, utilitários ou linguagem de comando. 68 Estrutura do S.O. • Funções essenciais do núcleo do S.O. – Tratamento de interrupções e exceções – Criação e eliminação de processos. – Sincronização e comunicação entre processos. – Escalonamento e controle dos processos. – Gerência de memória – Gerência de sistemas de arquivos – Gerência de dispositivos de E/S – Suporte a redes locais e distribuídas – Contabilização do uso do sistema, além de auditoria e segurança 69 Estrutura do S.O. • Estrutura de um Sistema Operacional • É a maneira como o código do sistema é organizado e o inter-relacionamento entre seus diversos componentes. Esta estrutura pode variar conforme a concepção do projeto. • Abordaremos: Sistemas Monolíticos, Sistemas de Camadas, Micronúcleo, sistemas cliente- servidor, Máquinas Virtuais e exonúcleo. 70 Estrutura do S.O. Sistemas Monolíticos: • O S.O. inteiro é executado como um único programa no modo núcleo. O S.O. é escrito como uma coleção de rotinas, ligadas a um único grande programa binário executável. Exs: linux, MS-DOS. 71 Estrutura do S.O. Sistemas Monolíticos: Sua estrutura básica para o S.O. é a seguinte: 1) Um programa principal invoca a rotina do serviço requisitado; 2) Um conjunto de rotinas de serviço executam as chamadas de sistema; 3) Um conjunto de rotinas utilitárias auxiliam as rotinas de serviço. Segundo esse modelo, para cada chamada de sistema há uma rotina de serviço que se encarrega dela. As rotinas utilitárias realizam tarefas necessárias para as várias rotinas de serviço, como buscar dados dos programas dos usuários. 72 Estrutura do S.O. Sistemas de Camadas: Sistema é dividido em níveis sobrepostos. Cada nível oferece funcionalidades que podem ser acessadas somente pelas camadas superiores. Exs: MULTICS, THE (Technishe Hogeschool Eindhoven), WINDOWS, maioria das versões UNIX. arquitetura do OpenVMS 73 Estrutura do S.O. Arquitetura em Camadas: – Tem como vantagem isolar as funções do sistema operacional, facilitando a manutenção e a depuração, além de criar uma hierarquia de níveis de modos de acesso, protegendo as camadas mais internas. – Uma desvantagem deste modelo é o desempenho. Cada nova camada implica em novo modo de acesso. – A maioria dos atuais sistemas comerciais utiliza duas camadas,onde existem os modos de acesso usuário (não-privilegiado) e kernel (privilegiado). 74 • Tradicionalmente, todas camadas entram no núcleo, mas isso não é necessário. • Erros no núcleo podem derrubar o sistema instantaneamente. Entretanto, processo de usuário podem ser configurados com menos potência de modo que um erro não seja fatal. • A densidade de erro por mil linha de código: dez erros. Nem todos fatais... Por conta disso, os fabricantes inserem botões de reinicialização nos computadores. 75 Estrutura do S.O. Micronúcleo Idéia: alcançar alta confiabilidade por meio da divisão do S.O. em módulos pequenos, bem definidos, e apenas um desses módulos – o micronúcleo – é executado no modo núcleo e o restante é executado como processos de usuário comum. * 10 erros por 1000 linhas de código. Em um S.O. monolítico de 5 milhões de linhas de código contenha 50 mil erros no núcleo (nem todos fatais). * botão de reset Ex: Erro no áudio em um sistema micronúcleo x Erro no áudio no sistema monolítico. Próximo Slide 76 Estrutura do S.O. Micronúcleo Ex: Erro no áudio em um sistema micronúcleo x Erro no áudio no sistema monolítico. Quando há a execução de cada driver de dispositivo e de cada sistema de arquivos como um processo de usuário separado, um erro em um deles pode quebrar aquele componente, mas não pode quebrar o sistema inteiro. Desse modo, um erro na unidade de áudio fará com que o som seja adulterado ou interrompido, mas não travará o computador. Por outro lado, em um sistema monolítico, com todas unidades no núcleo, uma unidade de áudio defeituosa pode facilmente dar como referência um endereço de memória inválido e para o sistema instantaneamente. Muitos foram implementados e utilizados, e são especialmente comuns em aplicações de tempo real, industriais, de aviônica e militares, que são cruciais e têm requisitos de confiabilidade muito altos. 77 Estrutura do S.O. Modelo cliente-servidor: Idéia: Os servidores prestam algum serviço, e os clientes usam esses serviços. Frequentemente a camada inferior é micronúcleo, mas ele não é obrigatório. A comunicação entre clientes e servidores é feita por meio de troca de mensagens. Para obter um serviço, um processo cliente constrói uma mensagem dizendo o que deseja e a envia ao serviço apropriado. Este faz o trabalho e envia a resposta de volta. Ex: Páginas na Web 78 Estrutura do S.O. • Máquina Virtual: – Cria uma camada intermediária entre o hardware e o sistema operacional chamada Monitor de Máquina Virtual. Esta camada oferece, para cada máquina virtual, uma cópia virtual do hardware. • Exemplos: VM/370, JVM. 79 • Como cada máquina virtual é uma cópia exata do hardware, cada uma delas pode executar qualquer S.O.. • Ex: Servidores de correio, web, ftp - Computadores diferentes x virtualizado. - Com a Virtualização, executa-se todos eles na mesma máquina sem que uma falha em um servidor afete o resto. • Ex: Hospedagem na Web: - Hospedagem compartilhada: o cliente recebe uma conta de acesso a um servidor da web, mas não é permitido controlar o software do servidor - Hospedagem dedicada: o cliente terá uma maquina própria (pouco econômico) Quando uma cia aluga máquinas virtuais, uma única máquina física pode executar muitas máquinas virtuais e cada uma delas parece ser uma maquina completa. • Ex: Usuários finais que querem executar dois ou mais S.O.s ao mesmo tempo. 80 Estrutura do S.O. 81 Estrutura do S.O. Monitor de Maquina Virtual - Hipervisor tipo 1 x Hipervisor tipo 2 Máquina Virtual Java 82 Estrutura do S.O. Exonúcleo A máquina real é dividida, ou seja, cada usuário recebe um subconjunto de recursos. Na camada mais inferior, executando em modo núcleo, há um programa denominado exonúcleo. Sua tarefa é alocar recursos às máquinas virtuais e então verificar as tentativas de usá-los para assegurar-se de que nenhuma máquina esteja tentando usar recursos de outra. 83 Estrutura do S.O. Exonúcleo • Vantagem: poupa uma camada de mapeamento. – Nos outros projetos, cada máquina virtual pensa que tem seu próprio HD, com blocos indo de 0 a um valor máximo, de modo que o monitor de MV deve manter tabelas para remapear os endereços de disco( e todos recursos). – Com o exonúcleo, ele precisa manter somente o registro de para qual máquina virtual foi atribuído qual recurso. 84 Resumo • Sistemas operacionais podem ser analisados de dois pontos de vista: – Gerenciadores de recursos • O trabalho do S.O. é gerenciar as diferentes partes do sistema. – Máquinas estendidas • Oferece aos usuários abstrações que sejam mais convenientes ao uso do que a máquina real (incluem processos, espaços de endereçamento e arquivos) 85 Resumo • Os S.O.s tem longa história. • Os computadores são constituídos de processadores, memórias e dispositivos de E/S. • Os conceitos básicos sobre os quais todos S.O.s são construídos são: processos, gerenciamento de memória, gerenciamento de E/S, sistema de arquivos e segurança. • Os S.O.s podem ser estruturados: Como Sistemas monolíticos, como hierarquia de camadas, como micronúcleo, como um sistema de máquina virtual, como um exonúcleo ou por meio do modelo cliente-servidor 86 Processos • Processo: uma abstração de um programa em execução; ex: múltiplas solicitações em um servidor web chegada de emails, atualização de antivírus, imprimindo arquivos, gravando dvds e navegando na web • Processo é um programa em execução, e seu conceito pode ser definido como o conjunto necessário de informações para a implementação da concorrência de programas. Estas informações estão reunidas nos contextos de software e de hardware e no espaço de endereçamento. • Cada processo tem sua própria CPU virtual. 87 A parte de imagem com identificação de relação rId2 não foi encontrada no arquivo. 88 Processos • Cada cpu só pode executar um processo por vez; • A diferença entre um processo e o programa é sutil, mas crucial. – Ex: Analogia Cientista confeiteiro (receita =programa, cientista = processador e ingredientes = dados de entrada) • Processo constitui uma atividade. Ele possui programa, entrada, saída e um estado. Um único processador pode ser compartilhado entre vários processos, com algum algoritmo de escalonamento usado para determinar quando para o trabalho sobre um processo e servir outro 89 Processos • Um programa executado duas vezes conta como dois processos. • S.O.s precisam de mecanismos para criar processos. Há quatro eventos principais que fazem com que processos sejam criados: – Início do sistema (processos em primeiro plano e segundo plano); – Execução de uma chamada de sistema de criação de processo por um processo em execução; – Uma requisição do usuário para criar um novo processo; – Início de uma tarefa em lote (batch job) Daemons: Processos que ficam em background com a finalidade de lidar com alguma atividade. Como vê-los? ps (UNIX) ou gerenciador de tarefas (win) 90 Processos – Um processo sem execução pode fazer chamadas de sistema (system calls) para criar um ou mais novos processos para ajudá-lo em seu trabalho. – Usuários podem iniciar um programa digitando um comando ou clicando em um ícone. Cada ação inicia um novo processo e executa nele o programa selecionado. » Janela Programas Windows – Um novo processo (processo filho) é criado por um processo existente (processo pai) executando uma chamada de sistema para a criação de processo. Esse processo (pai) pode ser um processo de usuário que está executando, um processo de sistema invocado a partir do teclado/mouse ou um processo gerenciador de lotes. 91Processos • Término de um processo: – Saída normal (voluntária); • Exit (unix) / ExitProcess (Windows). Fechar qualquer programa. – Saída por erro (voluntária); • Cc foo.c / erro ao fornecer parâmetros errados – Erro Fatal (involuntário); • Execução de uma instrução ilegal – Cancelamento por outro processo (involuntário). • Um processo executa uma chamada de sistema dizendo ao S.O. para cancelar algum outro processo (Unix Kill/ Windows TerminateProcess). 92 Processos Estados de Processos 93 Processos – Processos Foregroun de Background: Foreground: permite comunicação direta do usuário com o processo durante a sua execução. – Background: não existe interatividade com usuário. 94 Processos Processo PIPE 95 Thread Thread é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente. Em hardwares equipados com uma única CPU, cada thread é processada de forma aparentemente simultânea, pois a mudança entre uma thread e outra é feita de forma tão rápida que para o utilizador isso está acontecendo paralelamente. Em hardwares com múltiplos CPUs ou multi-cores, as threads são realizadas realmente de forma simultânea; 96 Threads Um thread é um fluxo único de controle sequencial dentro de um programa. Principais razões para existência dos threads: • Tornar o modelo de programação mais simples. As aplicações são decompostas em múltiplos threads sequenciais que executam em quase paralelo. Isso deve-se ao fato de que em muitas aplicações ocorrem múltiplas atividades ao mesmo tempo. • São mais fáceis (mais rápidos) de criar e destruir que os processos, pois não têm nenhum recurso associados a eles. • Ganho de desempenho. O uso de threads não resulta em ganho de desempenho quando todos eles são CPU-bound (muito processamento com pouca E/S). No entanto, quando há grande quantidade de computação e de E/S, os threads permitem que essas atividades se sobreponham e acelerem a aplicação. 97 Threads Ex: Processador de textos. 1º Usuário escrevendo um livro. Arquivo único/Divide em diversos arquivos 2º Altera frase na primeira folha, doc de 1000 páginas. 3º Figura abaixo. 98 Modelo de Thread Clássico • Um modo de ver um processo é encará-lo como um meio de agrupar recursos relacionados. Um processo apresenta um espaço de endereçamento que contém o código e os dados do programa. • Outro conceito que um processo apresenta é o thread. Este tem um contador de programa que mantém o controle de qual instrução ele deve executar em seguida. Ele tem registradores, que contêm suas variáveis de trabalho atuais. Apresenta uma pilha que traz a história da execução. • Apesar de um thread ter de executar um processo, ambos (o thread e seu processo) são conceitos diferentes. Processos são usados para agrupar recursos; threads são as entidas escalonadas para a execução sobre a CPU. 99 O que os threads acrescentam ao modelo de processo é permitir que múltiplas execuções ocorram no mesmo ambiente do processo, com um grande grau de independência uma da outra. Ter múltiplos threads executando em paralelo é análogo a múltiplos processos executando em paralelo em um único computador. No primeiro caso, os threads compartilham um mesmo espaço de endereçamento e outros recursos. No último, os processos compartilham um espaço físico de memória, discos, impressoras e outros recursos. Multithread é o termo usado para descrever a situação em que se permite a existência de múltiplos threads no mesmo processo. Modelo de Thread Clássico 100 Modelo de Thread Clássico 101 Modelo de Thread Clássico Threads distintos não são tão independentes quanto processos distintos. Todos os threads têm exatamente o mesmo espaço de endereçamento, o que significa que eles também compartilham as mesmas variáveis globais. Cada thread pode ter acesso a qualquer endereço do processo. 102 Escalonamento Quando um computador é multiprogramado, ele muitas vezes tem múltiplos processos ou threads que competem pela CPU ao mesmo tempo. Essa situação ocorre sempre que dois processos estão simultaneamente no estado pronto. Se somente uma CPU estiver disponível, deverá ser feita uma escolha de qual processo executará em seguida. A parte do SO que faz a escolha é chamada de Escalonador, e o algoritmo que ele usa é o algoritmo de escalonamento. Escalonamento: seleção de um processo que deverá ser executado; 103 Introdução ao Escalonamento Um bom escalonador pode fazer uma grande diferença no desempenho observado e na satisfação do usuário. Computadores pessoais: geralmente existe apenas um processo ativo. É improvável que um usuário esteja, simultaneamente, trabalhando com um doc no processador de textos e compilando um programa em segundo plano. Hoje, a maioria dos programas para PC é limitada pela velocidade com que o usuário pode entrar dados (digitando ou clicando), e não pela taxa na qual a CPU é capaz de processá-los. Ex: Compiladores nos PCs atuais x exibir Vídeo em HD 104 Introdução ao Escalonamento A situação muda quando falamos de Servidores e estações de trabalho de alto desempenho em rede. Nesse caso é comum haver múltiplos processos competindo pela CPU e o escalonamento torna-se importante novamente. Ex: CPU precisa decidir entre executar um processo que reúne estatísticas diárias e um que atende às solicitações dos usuários. Além de escolher o processo certo para executar, o escalonador deve se preocupar em fazer o uso eficiente da CPU, pois chavear processos é muito custoso. 105 Introdução ao Escalonamento Como ele ocorre? Primeiramente, deve-se ocorrer um chaveamento do modo de usuário para o modo núcleo. Depois, o estado atual do processo deve ser salvo. Em muitos sistemas, o mapa de memória deve ser salvo. Em seguida, um novo processo precisa ser selecionado pela execução do algoritmo de escalonamento. Depois, a MMU (unidade de gerenciamento de memória) tem de ser recarregada com o mapa de memória do novo processo. Por fim, o novo processo precisa ser iniciado. 106 Comportamento do Processo Quase todos processos alternam surtos de computação com requisições de E/S (de disco). Em geral, a CPU executa e então é feita uma chamada de sistema para ler de um arquivo ou escrever nele. Quando a chamada de sistema termina, a CPU computa novamente até que ela requisite ou tenha de escrever mais dado. 107 Comportamento do Processo Alguns processos gastam maior parte do tempo computando. Outros passam maior parte do tempo esperando E/S. Limitados pela CPU: apresentam longos surtos de uso da CPU e esporádicas esperas por E/S Limitados pela E/S: têm pequenos surtos de uso da CPU e esperas frequentes por E/S À medida que as CPUs se tornam mais rápidas, os processos tendem a ficar mais limitados por E/S. 108 Algoritmo de Escalonamento Algoritmo de escalonamento não preemptivo escolhe um processo para executar e o deixa executar até que seja bloqueado ou até que ele voluntariamente libere a CPU. O Algoritmo de escalonamento preemptivo escolhe um processo e o deixa em execução por um tempo máximo fixado. Se ainda estiver executando ao final desse intervalo de tempo, o processo será suspenso e o escalonador escolherá outro processo para executar. 109 Algoritmos de Escalonamento Para ambientes diferentes, são necessários diferentes algoritmos de escalonamento. Isso ocorre porque diferentes áreas de aplicação têm objetivos diferentes. 110 Objetivos do Algoritmo de Escalonamento Para projetar um algoritmo de escalonamento, é necessário ter alguma idéia do que um bom algoritmo deve fazer. Alguns objetivos dependem do ambiente (lote, interativoou tempo real), mas há também aqueles que são desejáveis para todos os casos... Em todos sistemas: • Justiça: Processos semelhantes devem ter serviços semelhantes. Não é justo dar mais tempo de CPU a um processo do que a outro equivalente. Lembre-se que categorias diferentes de processos podem ser tratadas de modo diverso. • Políticas do sistema: Verificar sempre se a política estabelecida é cumprida. • Equilíbrio: Manter, quando possível, todas as partes do sistema ocupadas. Se a CPU e os dispositivos de E/S puderem ser mantidos em execução o tempo todo, mais trabalho por segundo será feito do que se algum dos componentes estiver ocioso. 111 Nos sistemas em lote: Os sistemas em lote são utilizados pelas empresas para folhas de pagamento, estoque, contas a receber, contas a pagar, cálculo de juros (em bancos), processamento de pedidos de indenização (em companhias de seguros) e outras tarefas periódicas. Nos sistemas em lote não há, em seus terminais, usuários esperando impacientemente por uma resposta rápida. Consequentemente, os algoritmos não preemptivos ou preemptivos com longo intervalo de tempo para cada processo são aceitáveis. Essa tática reduz os chaveamentos entre processos e assim melhora o desempenho. Categorias de algoritmos de Escalonamento 112 Objetivos do Algoritmo de Escalonamento Nos sistemas em lote: • Vazão: é o número de tarefas por hora que o sistema termina. • Tempo de retorno: é estatisticamente o tempo médio do momento em que uma tarefa em lote é submetido até o momento em que ele é terminado. Ele indica quanto tempo, em média, o usuário tem de esperar pelo fim de um trabalho. Quanto menor, Melhor. • Utilização da CPU: Procurar manter a CPU ocupada o máximo de tempo possível. 113 Sistemas Interativos Em um ambiente com usuários interativos, a preempção é essencial para evitar que um processo se aposse da CPU e negue serviço aos outros. Mesmo que nenhum processo execute intencionalmente para sempre, uma falha em um programa pode levar um processo a impedir indefinidamente que todos os outros executem. A preempção é necessária para impedir esse comportamento. Os servidores também caem nessa categoria, visto que normalmente servem a usuários (remotos) múltiplos, todos muito apressados. Categorias de algoritmos de Escalonamento 114 Sistemas Interativos: • Tempo de resposta: É o tempo entre a emissão de um comando e a obtenção do resultado. Deve ser o menor possível. • Proporcionalidade: satisfazer as expectativas dos usuários. Quando uma requisição complexa demora, os usuários aceitam isso, mas, quando a demora ocorre com uma requisição simples, os usuários ficam irritados. Objetivos do Algoritmo de Escalonamento 115 Categorias de algoritmos de Escalonamento Sistemas de Tempo Real Em sistemas com restrições de tempo real, a preempção é, estranhamente, algumas vezes desnecessária, pois os processos sabem que não podem executar por longos períodos e, em geral, fazem seus trabalhos e bloqueiam rapidamente. A diferença com relação aos sistemas interativos é que os sistemas de tempo real executam apenas programas que visam ao progresso da aplicação. Já os sistemas interativos são de propósito geral e podem executar programas arbitrários não cooperativos ou até mal- intencionados. 116 Objetivos do Algoritmo de Escalonamento Sistemas de Tempo Real: Cumprimento dos prazos: evitar a perda de dados Previsibilidade: evitar a degradação da qualidade em sistemas multimídia. 117 Escalonamento em Sistemas de Lote Primeiro a chegar, primeiro a ser servido (First come, first served – FCFS) Algoritmo de escalonamento não preemptivo; Com esse algoritmo, a CPU é atribuída aos processos na ordem em que eles a requisitam. Como Funciona? Há uma fila única de processos prontos. Quando a primeira tarefa entra no sistema é iniciado imediatamente e autorizado a executar por quanto tempo queira. Ele não é interrompido porque está sendo executado há muito tempo. À medida que chegam as outras tarefas, eles são encaminhados para o fim da fila. Quando o processo em execuação é bloqueado, o primeiro processo na fila é o próximo a executar. Quando um processo bloqueado fica pronto (assim como uma tarefa que acabou de chegar), ele é posto no fim da fila. 118 Escalonamento em Sistemas de Lote Primeiro a chegar, primeiro a ser servido (First come, first served – FCFS) Vantagens: Ele é fácil de entender e igualmente fácil de programar. É também um algoritmo justo. Com esse algoritmo, uma única lista encadeada controla todos os processos prontos. Adicionar uma nova tarefa ou um processo desbloqueado requer apenas a inserção dele no final da fila. Desvantagens: Dependendo do tipo de processo orientado a computação, pode-se levar muito tempo para executá-lo. Ex:Um processo orientado à computação que execute durante um segundo por vez e muitos outros processos limitados por E/S que usem pouco tempo de CPU, mas que precisem realizar, cada um, mil leituras de disco antes de terminar. O resultado é que cada um dos processos limitados por E/S lê um bloco por segundo e demorará mil segundos para terminar. Com um algoritmo de escalonamento que causasse a preempção do processo orientado à computação a cada dez milissegundos (em vez de a cada um segundo), os processos de E/S terminariam em dez segundos, e não em mil segundos. 119 Escalonamento em Sistemas de Lote Tarefa mais curta primeiro (shortest job first) Algoritmo de escalonamento não preemptivo; Com esse algoritmo, quando temos várias tarefas igualmente importantes postadas na mesma fila de entrada à espera de serem iniciados, o escalonador escolhe a tarefa mais curta primeiro. Ex: Quatro tarefas (A, B, C e D) com seus respectivos tempos de execução 8, 4, 4 e 4 minutos. FCFS x Tarefa mais curta primeiro É importante lembrar que a tarefa mais curta primeiro é adequado somente para situação em que todas as tarefas estejam disponíveis simultaneamente. 120 Escalonamento em Sistemas de Lote Próximo de menor tempo restante (shortest remaining time next) É um algoritmo de escalonamento preemptivo; Com esse algoritmo, o escalonador sempre escolhe o processo cujo tempo de execução restante seja o menor. Novamente, o tempo de execução deve ser previamente conhecido. Quando chega uma nova tarefa, seu tempo total é comparado ao tempo restante do processo em curso. Se, para terminar, a nova tarefa precisar de menos tempo que o processo corrente, então esse será suspenso e a nova tarefa será iniciada. Esse esquema permite que novas tarefas curtas obtenham um bom desempenho. 121 Escalonamento em Sistemas Interativos São comuns em computadores pessoais, servidores e outros tipos de sistemas. Processos interativos geralmente seguem o padrão de esperar por comando, executar comando, esperar por comando, executar comando e assim por diante. 122 Escalonamento em Sistemas Interativos Escalonamento por chaveamento circular (round-robin) Um dos algoritmos mais antigos, simples, justo e amplamente usado é o circular. Ele pressupõe que todos os processos sejam igualmente importantes. Como ele funciona? A cada processo é atribuído um intervalo de tempo (quantum) no qual ele é permitido executar. Se, ao final do quantum, o processo ainda estiver executando, a CPU sofrerá preempção e será dada a outro processo. Se o processo foi bloqueado ou terminou antes que o quantum tenha decorrido, a CPU é chaveada para outro processo. O escalonamento circular é fácil de implementar. O Escalonador só precisa manter uma lista de processos executáveis. Quando o processo usa todo o seu quantum, ele é colocado no final da lista. Ex: Quantum de 4ms e chaveamento do processode 1ms = 20% desperdiçado Quantum de 100ms e chaveamento de processo de 1ms = 1% desperdiçado Adotar um quantum muito curto causa muitos chaveamentos de processo e reduz a eficiência da CPU, mas um quantum muito longo pode gerar uma resposta pobre às requisições interativas curtas. Um quantum em torno de 20ms a 50ms é bastante razoável. O algoritmo circular pressupõe que todos os processo sejam igualmente importantes. 123 Escalonamento em Sistemas Interativos Escalonamento por prioridades A cada processo é atribuída uma prioridade, e ao processo executável com a prioridade mais alta é permitido executar. Ex: em um PC, o processo que atualiza o antivirus em segundo plano deve receber uma prioridade mais baixa que a um processo que exibe um vídeo na tela em tempo real. Para evitar que processos de alta prioridade executem indefinidamente, o escalonador pode reduzir a prioridade do processo em execução a cada tique de relógio. Se isso fizer com que sua prioridade caia abaixo da prioridade do próximo processo com prioridade mais alta, então ocorrerá um chaveamento de processo. Outra possibilidade é atribuir a cada processo um quantum máximo no qual ele pode executar. Quando esse quantum estiver esgotado, será dada a oportunidade para que o próximo processo com prioridade mais alta execute 124 Escalonamento em Sistemas Interativos Escalonamento garantido É quando o escalonador faz promessas reais sobre o desempenho aos usuários e cumpre-as. Ex: Se houver n usuários conectados enquanto você estiver trabalhando, você receberá cerca de 1/n de CPU. Para isso, o sistema deve manter o controle da quantidade de CPU que cada processo recebe desde sua criação. Então ele calcula a quantidade de CPU destinada a cada um ou o tempo desde a criação dividido por n. 125 Escalonamento em Sistemas Interativos Escalonamento por loteria A idéia básica é dar bilhetes de loteria aos processos, cujos prêmios são vários recursos do sistema, como tempo de CPU. Se houver uma decisão de escalonamento, um bilhete de loteria será escolhido aleatoriamente e o processo que tem o bilhete conseguirá o recurso. Quando aplicado ao escalonamento de CPU, o sistema pode fazer um sorteio 50 vezes por segundo e, portanto, cada vencedor terá 20 ms de tempo de CPU como prêmio. O escalonamento por loteria é altamente responsivo, ou seja, se aparece um novo processo e a ele são atribuídos alguns bilhetes, já no próximo sorteio da loteria sua probabilidade de vencer será proporcional ao número de bilhetes que ele tiver. 126 Escalonamento em Sistemas Interativos Escalonamento por fração justa (fair-share) A cada usuário é alocada uma fração da CPU, e o escalonador escolhe os processos de modo que garanta essa fração. Assim, se dois usuários tiverem 50% da CPU prometida a cada um deles, cada um obterá os 50%, não importando quantos processos eles tenham gerado. Ex: Imagine um sistema com dois usuários, cada qual com 50% da CPU prometida a ele. O usuário 1 tem quatro processos (A, B, C e D) e o usuário 2 tem somente um processo (E)... 127 Escalonamento em sistemas de tempo real Um sistema de tempo real é aquele no qual o tempo tem uma função essencial. Em geral, um ou mais dispositivos físicos externos ao computador geram estímulos, e o computador deve reagir apropriadamente a eles dentro de um dado intervalo de tempo. Ex: monitoração de pacientes em UTI de hospitais e piloto automático de aeronaves. Nesses casos, ter a resposta certa, mas tardia, é tão ruim quanto não ter nada. 128 Escalonamento em sistemas de tempo real Sistemas de tempo real são em geral categorizados como: – Tempo real crítico: há prazos absolutos que devem ser cumpridos; – Tempo real não crítico: o descumprimento ocasional de um prazo é indesejável, contudo tolerável. Em ambos os casos, o comportamento de tempo real é implementado dividindo-se o programa em vários processos cujo comportamento é previamente conhecido. De modo geral, esses processos têm vida curta e podem executar em bem menos de um segundo. Quando é detectado um evento externo, o trabalho do escalonador é escalonar os processos de tal maneira que todos os prazos sejam cumpridos. 129 Escalonamento em sistemas de tempo real Os eventos aos quais um sistema de tempo real pode precisar responder podem ser categorizados como: – Periódicos: ocorrem em intervalos regulares; – Aperiódicos: acontecem de modo imprevisível. Os algoritmos de escalonamento de tempo real podem ser estáticos ou dinâmicos. Os primeiros tomam suas decisões de escalonamento antes de o sistema começar a executar. Os últimos o fazem em tempo de execução. O escalonamento estático só funciona quando há prévia informação perfeita disponível sobre o trabalho necessário a ser feito e os prazos que devem ser cumpridos. Os algoritmos de escalonamento dinâmico não apresentam essas restrições. 130 Gerenciamento de Memória Programas tendem a expandir a fim de ocupar toda a memória disponível. Hierarquia de Memórias é dividida em: ü Memória cache (alguns megabytes, rápida, custo alto e volátil); ü Memórial Principal (volátil, alguns gigabytes, de velocidade e custo médios; ü Disco (não volátil, alguns terabytes, de velocidade e custos baixos; ü Armazenamento removível (DVDs, Cds, USB) A função do S.O. é abstrair essa hierarquia em um modelo útil e, então, gerenciar a abstração. 131 Gerenciamento de Memória A parte do S.O. que gerencia (parcialmente) a hierarquia de memórias é denominada gerenciador de memória. Sua função é gerenciar a memória de modo eficiente: manter o controle de quais partes da memória estão em uso e quais não estão, alocando memória aos processos quando eles precisam e liberando-a quando esses processos terminam. 132 Abstração de memória: espaços de endereçamento Um espaço de endereçamento é o conjunto de endereços que um processo pode usar para endereçar a memória. Cada processo tem seu próprio espaço de endereçamento, independente dos que pertencem a outros processos. Ex: – espaço de endereçamento para números de telefone – espaço de endereçamento de todas cadeias de comprimento de 2 a 63 caracteres que possam ser feitas usando letras, números e hífens, seguidas por .com 133 Troca de Memória Em um sistema Windows ou Linux típico, algo entre 40- 60 processos ou mais podem ser inicializados quando o computador é iniciado. Ex: processos para verificação de atualização, email, conexões do sistema de rede, etc. 134 Troca de Memória Dois métodos gerais para lidar com a sobrecarga de memória têm sido desenvolvidos com o passar dos anos: – Swapping (troca de processos) consiste em trazer, em sua totalidade, cada processo para a memória, executá-lo durante um certo tempo e, então, devolvê-lo ao disco. Processos ociosos são armazenados no disco, de forma que não ocupem qualquer espaço na memória quando não estão executando. – Memória virtual permite que programas possam ser executados mesmo que estejam apenas parcialmente carregados na memória principal. 135 Funcionamento de um sistema de troca de processos 136 Troca de Memória Quando as trocas de processos deixam muitos espaços vazios na memória, é possível combiná-los todos em um único espaço contíguo de memória, movendo-os, o máximo possível, para os endereços mais baixos. Essa técnica é chamada de compactação de memória. Desvantagem: tempo gasto transferindo blocos de uma região para outra da memória principal 137 Troca de memória Um ponto importanto é a quantidade de memória que deve ser alocada a um processo quando este for criado ou trazido do disco para a memória. Se processos são criados com tamanhofixo então a alocação é simples: o S.O. alocará aquilo que é necessário. Se a área de dados do processo puder crescer, problemas poderão ocorrer sempre que um processo tentar crescer. Se houver espaço livre disponível adjacente ao processo, ele poderá ser alocado e p processo poderá crescer nesse espaço. Caso contrário, o processo que necessita crescer poderá ser movido para uma área de memória grande o suficiente para contê- lo ou um ou mais processos terão de ser transferidos para o disco a fim de criar essa área disponível. Se o processo não puder crescer na memória e a área de troca de disco (swap) estiver cheia, o processo deverá ser suspenso até que algum espaço seja liberado (ou pode ser terminado). 138 Alocação de espaço para um segmento de dados em expansão 139 Memória Virtual Introdução Bloatware é o termo utilizado para definir softwares que usam quantidades excessivas de memória. O tamanho da memória está aumentando rapidamente, mas o tamanho dos softwares está aumentando muito mais rápido. Existe a necessidade de executar programas grandes demais para se encaixarem na memória, e certamente há necessidade de haver sistemas que possam dar suporte a múltiplos programas em execução simultânea, cada um dos quais é comportado pela memória individualmente, mas que, coletivamente, excedam a memória. 140 Memória Virtual Introdução A troca de processos não é uma opção atrativa, visto que um disco SATA tem uma taxa de transferência de pico de, no máximo, 100MB/s, o que significa que leva pelo menos 10 seg para sair de um programa de 1GB e outros 10 seg para inicializar um programa de 1GB. A idéia básica por trás da memória virtual é que cada programa tem seu próprio espaço de endereçamento, que é dividido em blocos chamados páginas. Cada página é uma série contígua de endereços. Essas páginas são mapeadas na memória física, mas nem todas precisam estar na memória física para executar o programa. Quando o programa referencia uma parte de seu espaço de endereçamento que está na memória física, o hardware executa o mapeamento necessário dinamicamente. Quando o programa referencia uma parte de seu espaço de endereçamento que não está em sua memória física, o S.O. é alertado para obter a parte que falta e reexecutar a instrução que faltou. 141 Memória Virtual Espaço de Endereçamento Virtual Como o espaço de endereçamento virtual não tem nenhuma relação direta com os endereços reais, um programa pode referenciar endereços que estejam fora dos limites da memória principal. Quando um programa é executado, somente uma parte do seu código fica residente, permanecendo o restante na memória secundária até o momento de ser referenciado. 142 Memória Virtual 143 Memória Virtual Mapeamento • Tradução de um endereço virtual para um endereço real. • Por causa do mapeamento, um programa não mais precisa estar necessariamente em endereços contíguos na memória principal. 144 Memória Virtual 145 Memória Virtual A memória virtual funciona bem em um sistema com multiprogramação, com pedaços e partes de diferentes programas simultaneamente na memória. Se um programa estiver esperando por outra parte de si próprio ser carregada na memória, a CPU poderá ser dada a outro processo. 146 Memória Virtual Paginação Em computadores sem memória virtual, o endereço virtual é idêntico ao endereço físico e para ler ou escrever uma posição na memória, ele é colocado diretamente no barramento da memória. Quando a memória virtual é usada, o endereço virtual não é colocado diretamente no barramento da memória. Em Vez disso, ele vai a uma MMU (memory management unit – unidade de gerenciamento de memória), que mapeia endereços virtuais em endereços físicos. 147 Memória Virtual 148 Memória Virtual – Exemplo (parte 1) Nesse exemplo, temos um computador que pode gerar endereços virtuais de 16 bits, de 0 a 64 k - 1. Contudo, esse computador tem somente 32 kb de memória física. Assim, embora seja possível escrever programas de 64kb, eles não podem ser totalmente carregados na memória para serem executados. Uma cópia completa do código do programa deve estar presente no disco, de modo que partes possam ser carregadas dinamicamente na memória quando necessário. O espaço de endereçamento virtual é dividido em unidades denominadas páginas. As unidades correspondentes na memória física são denominadas molduras de página. As páginas e as molduras de páginas são sempre do mesmo tamanho. Nesse exemplo, as páginas têm 4KB. Com 64KB de espaço de endereçamento virtual e 32KB de memória física, podemos ter 16 páginas virtuais e 08 molduras de páginas. As transferências entre memória e disco são sempre em páginas completas. A série 0-4K significa que os endereços físicos ou virtuais nessa página dão 0 a 4095. A série 4-8K refere-se aos endereços 4096 a 8191 e assim por diante. 149 Quando um programa tenta acessar o endereço 0, o endereço virtual 0 é enviado à MMU, que detecta que esse endereço virtual situa-se na página virtual 0 (de 0 a 4095), que, de acordo com seu mapeamento, corresponde à moldura de página 2 (de 8192 a 12287). A MMU transforma o endereço físico 8192 e o envia à memória por meio de barramento. A memória desconhece a existência da MMU e somente enxerga uma solicitação de leitura ou escrita no endereço 8192, a qual ela executa. Essa habilidade de mapear as 16 páginas virtuais em qualquer uma das oito molduras de página não resolve o problema de o espaço de endereçamento virtual ser maior do que a memória física disponível. As páginas rotuladas com um X na figura não são mapeadas. O que acontece se um programa tenta usar uma página virtual não mapeada? A MMU constata que essa página virtual não está mapeada e força o desvio da CPU para o S.O. Essa interrupção é denominada falta de página. O S.O. escolhe uma moldura de página pouco usada e a salva em disco. Em seguida, ele carrega a página virtual na moldura de página recém-liberada, atualiza o mapeamento da tabela de páginas e reinicializa a instrução causadora da interrupção. Memória Virtual – Exemplo (parte 2) 150 Memória Virtual Mapeamento Cada processo tem o seu espaço de endereçamento virtual. O mecanismo de tradução mantém tabelas exclusivas para cada processo, relacionando os endereços virtuais às posições na memória real. 151 Memória Virtual por Paginação Existem Sistemas Operacionais que trabalham apenas com blocos de tamanho fixo (técnica de paginação), enquanto que outros utilizam blocos de tamanho variável (técnica de segmentação). Existem ainda aqueles que implementam ambas as técnicas (segmentação com paginação). 152 Memória Virtual por Paginação Trata-se de uma técnica de gerência de memória em que o espaço de endereçamento virtual e o espaço de endereçamento real são divididos em blocos de mesmo tamanho chamados páginas. As unidades correspondentes na memória física são denominadas molduras de página (page frames). As páginas e as molduras de páginas são sempre do mesmo tamanho. 153 Memória Virtual Quando um programa tenta usar uma página virtual não mapeada, a MMU constata que essa página virtual não está mapeada e força o desvio da CPU para o S.O. Essa interrupção é denominada falta de página (page fault). O S.O., então, escolhe uma moldura de página pouco usada e a salva em disco, ou seja, escreve seu conteúdo de volta no disco. Em seguida, ele carrega a página virtual referenciada pela instrução na moldura de página recém-liberada, atualiza o mapeamento da tabela de páginas e reinicializa a instrução causadora da interrupção. 154 MemóriaVirtual O número da página é usado como índice para a tabela de páginas, a fim de obter a moldura de página física correspondente àquela página virtual. O objetivo da tabela de páginas é mapear páginas virtuais em molduras de página física. 155 Em qualquer sistema de paginação, dois problemas importantes devem ser enfrentados: – O mapeamento do endereço virtual para o endereço físico deve ser rápido; – Se o espaço de endereço virtual for grande, a tabela de páginas será grande. 156 TLB – Memória Associativa TLB (translation lookaside buffer – buffer para tradução de endereços) ou memória associativa é o pequeno dispositivo (hardware) capaz de mapear os endereços virtuais para endereços físicos sem passar pela tabela de páginas. Portanto, TLB é um dispositivo de hardware implementado a partir de uma pequena memória associativa que fica integrada na MMU de um processador. Destina-se a facilitar a tradução de endereços lineares em endereços físicos, evitando a consulta à tabela de páginas localizada na memória. Quando um endereço é solicitado, o processador verifica se o endereço da frame respectiva existe no TLB. Se este for encontrado, é utilizado para gerar o endereço físico pretendido e o acesso à memória é iniciado. Em caso de falha, a tabela de páginas será consultada. Os projetistas observaram que os processos tendem a acessar com mais freqüência um número reduzido de páginas virtuais. Isto permite obter taxas de sucesso próximas de 100%, mesmo com TLBs de dimensões reduzidas. 157 TLB – Memória Associativa O modo normal de tratar uma ausência de página na TLB, seja por hardware, seja por software, é acessar a tabela de páginas e executar as operações de indexação para localizar a página referenciada não encontrada na TLB. O problema em se fazer essa pesquisa por software é que as páginas que contêm a tabela de páginas podem não estar mapeadas na TLB, ocasionando ausências adicionais na TLB durante o processamento. Essas ausências podem ser reduzidas se uma grande cache, gerenciada por software e contendo entradas do tipo TLB, for mantida em uma localização fixa com sua página sempre mapeada na TLB. Verificando primeiro essa cache, o S.O. pode reduzir substancialmente as ausências de página na TLB. 158 TLB – Memória Associativa Quando o gerenciamento da TLB por software é usada, devemos compreender a diferença entre dois tipos de ausência. – Ausência leve (soft miss) ocorre quando a página referenciada não está na TLB, mas na memória (é necessário atualizar a TLB - os discos de E/S não são utilizados) – Ausência completa (hard miss) ocorre quando a própria página não está na memória (e nem na TLB). Requer-se acesso ao disco para trazer a página. Uma ausência definitiva é milhões de vezes mais lenta que uma ausência temporária) 159 Memória Virtual As TBLs podem ser usadas para acelerar a tradução de endereços virtuais para endereços físicos em relação ao esquema original de tabela de páginas na memória. 160 Memória Virtual por Paginação Políticas de Busca de Páginas Determinam quando uma página deve ser carregada para a memória. Basicamente, existem duas estratégias para este propósito: * paginação por demanda * paginação antecipada. 161 Memória Virtual por Paginação Políticas de Busca de Páginas – Paginação por Demanda: as páginas do processo são transferidas da memória secundária para a principal apenas quando elas são referenciadas. – Paginação Antecipada: o sistema carrega para a memória, além da página referenciada, outras páginas que podem ou não ser necessárias ao processo durante o processamento. 162 Memória Virtual por Paginação Políticas de Alocação de Páginas Determinam quantos frames cada processo pode manter na memória principal. Existem duas possibilidades para este propósito: * alocação fixa * alocação variável. 163 Memória Virtual por Paginação Políticas de Alocação de Páginas Alocação Fixa Cada processo tem um número máximo de frames que pode ser utilizado durante a execução do programa. O limite de páginas pode ser igual para todos os processos ou definido individualmente, no momento da criação do processo, com base no tipo de aplicação. 164 Memória Virtual por Paginação Políticas de Alocação de Páginas Alocação Variável O número máximo de páginas alocadas ao processo pode variar durante a execução, em função da taxa de paginação e da ocupação da memória principal. Processos com elevadas taxas de paginação podem ampliar o limite de frames, a fim de reduzir o número de page faults. 165 Memória Virtual por Paginação Política de Alocação de Página 166 Memória Virtual por Paginação Políticas de Substituição de Páginas Selecionar, entre as páginas alocadas, aquela que deverá sair da memória para dar lugar a outra página mais relevante para o processo. A necessidade de substituição de páginas acontece quando um processo atinge seu limite de alocação de frames. No processo de substituição de páginas, antes de liberar a página, é necessário saber se ela foi alterada. As páginas que armazenam estruturas de dados e variáveis, ao serem alteradas, o sistema operacional deverá gravá-las na memória secundária antes do descarte (page out), preservando os seus conteúdos. Se a página não tiver sido modificada, a cópia em disco já estará atualizada e não será necessário reescrevê-la. A página a ser trazida para a memória simplesmente sobrescreve a página que está sendo destituída. 167 Memória Virtual por Paginação Embora seja possível escolher aleatoriamente uma página a ser descartada a cada falta de página, o desempenho do sistema será muito melhor se a página escolhida for uma que não estiver sendo muito usada. Se uma página intensamente usada for removida, é provável que logo ela precise ser trazida de volta, ocasionando custos extras. 168 Memória Virtual por Paginação Políticas de Substituição de Páginas O sistema operacional mantém, então, um arquivo de paginação (page file), onde todas as páginas modificadas e descartadas são armazenadas. Sempre que uma página for outra vez referenciada, ocorrerá um page in, carregando esta página para a memória principal a partir do arquivo de paginação. 169 Substituição de Páginas 170 Memória Virtual por Paginação Políticas de Substituição de Páginas O sistema operacional identifica as páginas modificadas através de um bit que existe em cada entrada da tabela de páginas, chamado bit de modificação(dirty bit ou modify bit). – Política de Substituição Local: apenas as páginas do processo que gerou o page fault podem ser realocadas. – Política de Substituição Global: todas as páginas na memória principal podem ser realocadas, independente do processo que causou o page fault. 171 Memória Virtual por Paginação Políticas de Substituição de Páginas – A política de alocação fixa permite apenas a utilização de uma política de substituição Local. – A política de alocação variável permite tanto a utilização de uma política de substituição Local quanto de uma política de substituição Global. 172 Memória Virtual por Paginação Algoritmos de Substituição de Páginas – O maior problema na memória virtual por paginação não é decidir quais páginas devem ser carregadas para a memória principal, mas quais páginas devem ser liberadas. – Os algoritmos de substituição de páginas têm o objetivo de selecionar os frames que tenham menores chances de serem referenciados em um futuro próximo. – A partir do princípio da localidade, a maioria dos algoritmos tenta prever o comportamento futuro das aplicações em função do comportamentopassado, avaliando o número de vezes que uma página foi referenciada, o momento em que foi carregada para a memória principal e o intervalo de tempo da última referência. 173 Memória Virtual por Paginação Algoritmos de Substituição de Páginas Ótimo: seleciona uma página que não será mais referenciada no futuro ou aquela que levará o maior intervalo de tempo para ser novamente utilizada. – Vantagem: menores taxas de paginação para os processos. – Desvantagem: impossível implementação, pois o S.O. não tem como conhecer o comportamento futuro das aplicações. 174 Algoritmos de Substituição de Páginas Algoritmo de substituição de página não usada recentemente (NRU) A maioria dos computadores com memória virtual tem 2 bits de status [o bit referenciado (R) e o bit modificado (M)], associados a cada página virtual, que permitem que o S.O. saiba quais páginas físicas estão sendo usadas e quais não estão. O bit R é colocado em 1 sempre que a página é referenciada (lida ou escrita). O bit M é colocado em 1 sempre que se escreve na página (isto é, a página é modificada). Os bits estão contidos em cada entrada da tabela de páginas. 175 Algoritmos de Substituição de Páginas Algoritmo de substituição de página não usada recentemente (NRU) Os bits R e M podem ser usados para construir um algoritmo de paginação simples. Quando um processo é inicializado, os dois bits citados, para todas as suas páginas, são colocados em 0 pelo S.O.. Periodicamente (ex. a cada tique do relógio), o bit R é limpo, de modo que diferencie as páginas que não foram referenciadas recentemente daquelas que foram. Quando acontece uma falta de página, o S.O. inspeciona todas as páginas e as separa em quatro categorias, com base nos valores atuais dos bits R e M: – Classe 0: não referenciada, não modificada. – Classe 1: não referenciada, modificada. – Classe 2: referenciada, não modificada. – Classe 3: referenciada, modificada. 176 O algoritmo NRU (not recently used – nada usada recentemente) remove aleatoriamente uma página da classe de ordem mais baixa que não esteja vazia. Está implícito nesse algoritmo que é melhor remover uma página modificada, mas não referenciada, a pelo menor um tique do relógio (em geral, 20ms) do que uma página não modificada que está sendo intensamente referenciada. A principal vantagem do algoritmo NRU é ser fácil de entender e de implementar e, além disso, fornece um desempenho que, apesar de não ser ótimo, pode ser adequado. Algoritmos de Substituição de Páginas Algoritmo de substituição de página não usada recentemente (NRU) 177 Algoritmos de Substituição de Páginas FIFO (First-In-First-Out) FIFO (First-In-First-Out): O S.O. mantém uma lista de todas as páginas atualmente na memória, com a página mais antiga na cabeça da lista e a página que chegou mais recentemente situada no final dessa lista. Na ocorrência de uma falta de página, a primeira página da lista é removida e a nova página é adicionada no final da lista. Vantagem: parece sensato descartar páginas mais antigas. Desvantagem: nem sempre uma página mais antiga deve ser descartada, pois ela pode estar sendo constantemente referenciada. 178 Algoritmos de Substituição de Páginas FIFO (First-In-First-Out) 179 Uma modificação simples no algoritmo de substituição de página FIFO evitaria o problema de se jogar fora uma página intensamente usada. Isso é feito simplesmente inspecionando o bit R da página mais antiga, ou seja, a primeira página da fila. Se o bit for 0, essa página, além de ser a mais antiga, não estará sendo usada, de modo que será substituída imediatamente. Se o bit R for 1, ele será colocado em 0, a página será posta no final da lista de páginas e seu tempo de carregamento (chegada) será atualizado como se ela tivesse acabado de ser carregada na memória. A pesquisa então continua. Algoritmos de Substituição de Página segunda chance 180 O que o algoritmo segunda chance faz é procurar uma página antiga que não tenha sido referenciada no intervalo de relógio anterior. Sua desvantagem é porque ele é desnecessariamente ineficaz, pois permanece constantemente reinserindo páginas no final da lista. Algoritmos de Substituição de Página segunda chance 181 Uma estratégia melhor é manter todas as páginas em uma lista circular em forma de relógio. Um ponteiro aponta para a página mais antiga. Quando ocorre uma falta de página, a página indicada pelo ponteiro é examinada. Se o bit R for 0, a página é removida, uma nova página é inserida em seu lugar no relógio e o ponteiro avança uma posição. Se R for 1, ele é zerado e o ponteiro avança para a próxima página. Esse processo é repetido até que uma página seja encontrada com R=0. Não é de surpreender que esse algoritmo seja chamado de relógio. Algoritmos de Substituição de Página do relógio 182 Algoritmo de substituição de página usada menos recentemente (LRU) Qual a Lógica provável? * Páginas muito utilizadas nas últimas instruções provavelmente serão muito utilizadas novamente nas próximas instruções. * Páginas que não estão sendo utilizadas por um longo período de tempo provavelmente permanecerão inutilizadas por muito tempo. Essa idéia sugere um algoritmo realizável: quando ocorrer uma falta de página, elimine a página não utilizada pelo período de tempo mais longo. Essa estratégia é chamada de paginação LRU (least recently used – usada menos recentemente) 183 Algoritmo de substituição de página usada menos recentemente (LRU) Embora a LRU seja teoricamente realizável, não é barato. Para implementar completamente o LRU, é necessário manter uma lista vinculada de todas as páginas na memória, com a página usada mais recentemente na dianteira e a página usada menos recentemente na parte de trás. A dificuldade é que a lista deve ser atualizada em cada referência à memória. Encontrar uma página na lista, deletá-la e posicioná-la na dianteira é uma operação demorada, mesmo no hardware. 184 Algoritmo de substituição de página não usada frequentemente (NFU) A implementação desse algoritmo requer contadores em software, cada um deles associado a uma página, inicialmente zerados. A cada interrupção de relógio, o S.O. percorre todas as páginas na memória. Para cada página, o bit R, que pode ser 0 ou 1, é adicionado ao contador correspondente. Assim, esses contadores constituem uma tentativa de saber quantas vezes cada página já foi referenciada. Quando ocorrer uma falta de página, a página que tiver a menor contagem será selecionada para a substituição. 185 Algoritmo de substituição de página não usada frequentemente (NFU) O problema principal com o algoritmo NFU é que ele nunca se esquece de nada. Ex: Em um compilador de múltiplos passos, páginas que foram intensamente referenciadas durante o passo 1 podem ainda ter um contador alto em passos bem posteriores. De fato, se acontecer de o passo 1 possuir o tempo de execução mais longo de todos os passos, as páginas que contiverem o código para os passos seguintes poderão ter sempre contadores menores do que as páginas do passo 1. Consequentemente, o sistema operacional removerá páginas que ainda estiverem sendo referenciadas, em vez daquelas que não o estão mais. 186 Algoritmo de substituição de página não usada frequentemente (NFU) Para corrigir isso deve ser utilizado um algoritmo de envelhecimento (aging). – Quando ocorre uma falta de página, a página que tem a menor contagem é removida. É claro que a página que não tiver sido removida por, digamos, quatro interrupções de relógio terá quatro zeros nas posições mais significativas de seu contador e, assim, possuirá um valor menor do que um contadorque não tiver sido referenciado por três interrupções de relógio. 187 Algoritmo de substituição de página não usada frequentemente (NFU) Esse algoritmo difere do LRU de duas maneiras. – De acordo com o LRU, se uma página tiver de ser substituída, devemos escolher uma das duas. O problema é que não sabemos qual dessas páginas foi referenciada por último no intervalo entre as interrupções de relógio. Registrando somente um bit por intervalo de tempo, perdemos a capacidade de distinguir a ordem das referências dentro de um mesmo intervalo. – A segunda diferença entre o algoritmo LRU e o de envelhecimento é que , neste último, os contadores têm um número finito de bits. Imagine duas páginas, ambas com seus contadores zerados. Só nos resta substituir uma delas aleatoriamente. Na realidade, é bastante possível que uma das páginas tenha sido referenciada pela última vez nove intervalos atrás e a outra o tenha sido há mil intervalos. Não temos como verificar isso. 188 Algoritmo de substituição de página do conjunto de trabalho No modo mais puro de paginação, os processos são inicializados sem qualquer de suas páginas presentes na memória. Assim que a CPU tenta buscar a primeira instrução, ela detecta uma falta de página, fazendo o S.O. carregar na memória a referida página que contém essa primeira instrução. Outras faltas de página, para as variáveis globais e a pilha, geralmente ocorrem logo em seguida. O processo, depois de um certo tempo, tem a maioria das páginas de que necessita para ser executado com relativamente poucas faltas de páginas. Essa estratégia é denominada paginação por demanda, pois as páginas só são carregadas à medida que são solicitadas, e não antecipadamente. 189 É fácil escrever um programa de teste que leia sistematicamente todas as páginas em um grande espaço de endereçamento e gere muitas faltas de página, de maneira que não exista memória suficiente para conter todas elas. Felizmente, a maioria dos processos não funciona assim. Eles apresentam uma prioridade denominada localidade de referência, a qual diz que, durante qualquer uma das fases de sua execução, o processo só vai referenciar uma fração relativamente pequena de suas páginas. Algoritmo de substituição de página do conjunto de trabalho 190 Algoritmo de substituição de página do conjunto de trabalho O conjunto de páginas que um processo está usando atualmente é denominado conjunto de trabalho (working set). Se todo esse conjunto estiver presente na memória, o processo será executado com poucas faltas de página até mudar para outra fase de execução (ex: o próximo passo em um compilador). Se a memória disponível for muito pequena para conter todo esse conjunto de trabalho, o processo sofrerá muitas faltas de página e será executado lentamente, pois a execução de uma instrução leva apenas uns poucos nanossegundos, mas trazer uma página do disco para a memória consome cerca de 10 milissegundos. Executar apenas uma ou duas instruções a cada 10 milissegundos faria demorar uma eternidade para finalizar o processamento. Diz-se que um programa que gere faltas de página frequente e continuamente provoca ultrapaginação (thrashing). 191 Algoritmo de substituição de página do conjunto de trabalho Em um sistema multiprogramado, os processo muitas vezes são transferidos para disco, ou seja, todas as suas páginas são retiradas da memória, para que outros processos possam utilizar a CPU. Uma questão que surge é: o que fazer quando as páginas relativas a um processo são trazidas de volta à memória??? Tecnicamente, nada precisa ser feito. O processo simplesmente causará falta de página até que seu conjunto de páginas tenha sido novamente carregado na memória. O problema é que, havendo 20, cem ou mesmo mil falta de página toda vez que um processo é carregado, a execução se torna bastante lenta e é desperdiçado um considerável tempo de CPU, pois o S.O. gasta alguns milissegundos de tempo de CPU para processar uma falta de página. 192 Algoritmo de substituição de página do conjunto de trabalho Muitos sistemas de paginação tentam gerenciar o conjunto de trabalho de cada processo e assegurar que ele esteja presente na memória antes de o processo ser executado. Essa prática, denominada modelo do conjunto de trabalho (working set model) foi concebida para reduzir substancialmente a frequência de falta de página. Carregar páginas de um processo na memória antes de ele ser posto em execução também se denomina pré-paginação. 193 Algoritmo de substituição de página do conjunto de trabalho A idéia principal do algoritmo de substituição de página com base no conjunto de trabalho é encontrar uma página que não esteja presente no conjunto de trabalho e removê-la da memória. 194 Algoritmo de substituição de página WSClock O algoritmo básico do conjunto de trabalho é enfadonho, pois é preciso pesquisar em cada falta de página toda a tabela de páginas para que seja localizada uma página adequada para ser substituída. Há um algoritmo melhorado, com base no algoritmo do relógio, que também usa informações do conjunto de trabalho: é o chamado WSClock. Em virtude da simplicidade de implementação e do bom desempenho, esse algoritmo é amplamente utilizado. 195 Algoritmo de substituição de página WSClock A estrutura de dados necessária é uma lista circular de molduras de página (assim como no algoritmo do relógio). Inicialmente, essa lista circular encontra-se vazia. Quando a primeira página é carregada, ela é inserida nessa lista. À medida que mais páginas são carregadas na memória, elas também são inseridas na lista para formar um anel. Cada entrada dessa lista contém o campo Instante do último uso, do algoritmo do conjunto de trabalho básico, bem como o bit R (mostrado) e o bit M (não mostrado) 196 Resumo dos algoritmos de substituição de página Revisão: – O algoritmo ótimo substitui, entre as páginas atuais, a página que será referenciada por último. Infelizmente, não há como determinar qual página será a última, de modo que, na prática, esse algoritmo não pode ser usado. Entretanto, ele é útil como uma medida-padrão de desempenho, à qual outros algoritmos podem ser comparados. 197 Resumo dos algoritmos de substituição de página Revisão: – O Algoritmo de substituição de página não usada recentemente (NRU) divide as páginas em quatro classes, dependendo do estado dos bits R e M. Uma página aleatória da classe de ordem mais baixa é escolhida aleatoriamente. Esse algoritmo é fácil de implementar, mas ainda bastante rudimentar. Existem outros melhores. 198 Resumo dos algoritmos de substituição de página Revisão: – O algoritmo FIFO gerencia a ordem em que as páginas foram carregadas na memória, mantendo-as em uma lista encadeada. A remoção da página mais velha torna-se trivial, mas essa página ainda pode estar em uso, de modo que o FIFO não é uma escolha adequada. 199 Resumo dos algoritmos de substituição de página Revisão: – Uma modificação do FIFO é o algoritmo segunda chance, que verifica se a página está em uso antes de removê-la. Se estiver, a página será poupada. Essa modificação melhora bastante o desempenho. O algoritmo do relógio é simplesmente uma implementação diferente do segunda chance: ele tem as mesmas propriedades de desempenho, mas gasta um pouco menos de tempo para executar o algoritmo. 200 Resumo dos algoritmos de substituição de página Revisão: – O Algoritmo de substituição de página usada menos recentemente (LRU) é um excelente algoritmo, mas não pode ser implementado sem hardware especial. Se o hardware não está disponível, ele não pode ser usado. O Algoritmo de substituição de página não usada frequentemente(NFU) é uma tentativa rudimentar de aproximação do LRU. Por outro lado, o algoritmo do envelhecimento é uma aproximação muito melhor do LRU e pode ser implementada eficientemente, constituindo uma boa escolha. – Os dois últimos algoritmos utilizam o conjunto de trabalho, que tem desempenho razoável, mas é de implementação um tanto cara. O WSClock é uma variante que não somente provê um bom desempenho, mas também é eficiente em sua implementação. 201 Resumo dos algoritmos de substituição de página Revisão: Entre todos eles, os dois melhores algoritmos são o envelhecimento e o WSClock. Eles baseiam-se, respectivamente, no Algoritmo de substituição de página usada menos recentemente (LRU) e no conjunto de trabalho. Ambos oferecem um bom desempenho de paginação e podem ser implementados de forma eficiente. 202 Política de alocação local versus global Algoritmo de substituição local alocam uma fração fixa de memória para cada processo. Algoritmos de substituição global alocam molduras de página entre os processos em execução. Assim, o número de molduras de páginas alocadas a cada processo varia no tempo. Em geral, os algoritmos globais funcionam melhor, especialmente quando o tamanho do conjunto de trabalho varia durante o tempo de vida de um processo. Se um algoritmo local é usado e o conjunto de trabalho cresce durante a execução do processo, uma ultrapaginação (thrashing) pode ocorrer mesmo que existam muitas molduras de página disponíveis na memória. Se o conjunto de trabalho diminuir durante a execução do processo, os algoritmos locais desperdiçam memória. Se um algoritmo global é usado, o sistema deve decidir continuamente quantas molduras de página alocar para cada processo. Uma das maneiras de fazer isso é o monitoramento do tamanho do conjunto de trabalho desse processo, conforme indicado pelos bits de envelhecimento (aging), mas essa estratégia não necessariamente evita a ultrapaginação. O conjunto de trabalho pode variar de tamanho em questão de microssegundos, enquanto os bits de envelhecimento representam uma medida rudimentar estendida a um número de interrupções de relógio. 203 Política de alocação local versus global Outra prática se baseia em um algoritmo de alocação de molduras de páginas para processo. Uma possibilidade é determinar periodicamente o número de processos em execução e alocar para cada processo o mesmo número de molduras de página. 204 Controle de Carga Sempre que os conjuntos de trabalho de todos os processos combinados excedem a capacidade da memória, pode-se esperar a ocorrência de ultrapaginação. Um bom modo de reduzir o número de processos que competem por memória é levar alguns deles para disco e liberar a memória a eles alocada. 205 Controle de Carga A idéia de remover processos para disco a fim de aliviar a carga sobre a memória origina-se do escalonamento de dois níveis, no qual alguns processos são colocados em disco e um escalonador de curto prazo é empregado para escalonar os processos restantes na memória. É claro que as duas idéias podem ser combinadas, de modo que se remova somente um número suficiente de processos para disco, a fim de fazer com que a frequência de faltas de página fique aceitável. Periodicamente, alguns processos são trazidos do disco para a memória, e outros, presentes na memória, são levados para disco. Contudo, outro fator a ser considerado é o grau de multiprogramação. Quando o número de processos presentes na memória principal é muito pequeno, a CPU pode ficar ociosa durante consideráveis períodos de tempo. Ao escolher considerar não só o tamanho dos processos e a taxa de paginação, mas também outros aspectos, como se o processo é do tipo limitado pela CPU ou por E/S e quais as características que os processos remanescentes na memória possuem. 206 Tamanho de página O tamanho de página é um parâmetro que frequentemente pode ser escolhido pelo S.O.. A determinação do melhor tamanho de página requer o balanceamento de vários fatores conflitantes, o que leva a não se conseguir um tamanho ótimo geral. Há dois argumentos a favor de um tamanho pequeno de página: – É provável que um segmento de código, dados ou pilha escolhido aleatoriamente não ocupe um número inteiro de páginas. Em média, metade da última página permanecerá vazia e esse espaço será desperdiçado. Esse desperdício é denominado fragmentação interna. – Tamanhos grandes de páginas farão com que partes do programa não usadas ocupem a memória desnecessariamente. Entretanto, páginas pequenas implicam muitas páginas e uma grande tabela de páginas. 207 Espaço separados de instruções e dados A maioria dos computadores tem um espaço único de endereçamento para programas e dados. Se esse espaço de endereçamento for suficientemente grande, tudo funcionará bem. No entanto, muitas vezes esse espaço é muito pequeno, o que obriga os programadores a suar a camisa para fazer tudo caber no espaço de endereçamento. Uma solução consiste em espaços de endereçamento separados para instruções (código do programa) e dados. Esses espaços são denominados, respectivamente, espaço I e espaço D. Em um computador com esse projeto, ambos os espaços de endereçamento podem ser paginados, independentemente um do outro. Cada um deles possui sua própria tabela de páginas, que contém o mapeamento individual de páginas virtuais para molduras de página física. Quando o hardware busca uma instrução, ele sabe que deve usar o espaço I e a tabela de páginas do espaço I. Da mesma maneira, referências aos dados devem acontecer por intermédio da tabela de páginas do espaço D. A não ser por essa distinção, usar espaços separados de instruções e dados não causa nenhuma complicação especial e duplica o espaço de endereçamento disponível. 208 Páginas Compartilhadas Em grandes sistemas com multiprogramação, é comum haver vários usuários executando simultaneamente o mesmo programa. É nitidamente mais eficiente compartilhar páginas para evitar a situação de existirem duas cópias ou mais da mesma página presentes na memória. Um problema é que nem todas as páginas são compartilháveis. Em particular, as páginas somente de leitura (como as que contêm código de programa) são compartilháveis, mas páginas com dados alteráveis durante a execução não o são. Se o sistema der suporte aos espaços I e D, o compartilhamento de programas será obtido de modo relativamente direto, fazendo com que dois ou mais processos usem, no espaço I, a mesma tabela de páginas em vez de tabelas de páginas individuais, mas diferentes tabelas de páginas no espaço D. 209 Em geral, em uma implementação que suporte compartilhamento desse tipo, tabelas de páginas são estruturas de dados independentes da tabela de processos. Cada processo tem dois ponteiros em sua tabela de processos: um aponta para tabela de páginas do espaço I e outro, para a tabela de páginas do espaço D. Quando o escalonador escolher um processo para ser executado, ele usará esses ponteiros para localizar as tabelas de páginas apropriadas e ativar a MMU. Mesmo sem espaços I e D separados, os processos ainda podem compartilhar programas (ou, às vezes, bibliotecas), mas o mecanismo é mais complicado. Páginas Compartilhadas 210 Páginas compartilhadas Quando dois ou mais processos compartilham o mesmo código, um problema ocorre com as páginas compartilhadas. Suponha que os processos A e B estejam ambos executando o editor e compartilhando suas páginas. Se o escalonador decide remover A da memória, descartando todas as suas páginas e carregando as molduras de página vazias com outro programa, ele leva o processo B a causar muitas faltas de página, até que suas páginas estejam novamente presentes na memória. Demaneira semelhante, quando o processo A termina sua execução, é essencial que o sistema operacional saiba que as páginas utilizadas pelo processo A ainda estão sendo utilizadas por outro processo, a fim de que o espaço em disco ocupado por essas páginas não seja liberado acidentalmente. Em geral, é muito trabalhoso pesquisar todas as tabelas de páginas para descobrir se uma determinada página é compartilhada, de modo que são necessárias estruturas de dados especiais para manter o controle das páginas compartilhadas – especialmente se a unidade de compartilhamento for de uma página individual ( ou de um conjunto delas), em vez de toda uma tabela de páginas. 211 Bibliotecas compartilhadas Se um programa for inicializado duas vezes, a maioria dos S.O. automaticamente compartilhará todas as páginas de texto, de modo que apenas uma cópia esteja na memória. As páginas de texto sempre são apenas para leitura, por isso não há nenhum problema nesse caso. Dependendo do sistema operacional, cada processo pode obter sua própria cópia provada das páginas de dados ou eles podem ser compartilhados e marcados como somente leitura. Em sistemas modernos, há muitas bibliotecas grandes usadas por muitos processos; por exemplo, a biblioteca que trata a caixa de diálogo de busca de arquivos para abrir e de bibliotecas gráficas múltiplas. Ligar estaticamente todas essas bibliotecas a cada programa executável no disco as tornaria mais infladas do que já são. 212 Bibliotecas compartilhadas Em vez disso, uma técnica comum é usar bibliotecas compartilhadas (que são chamadas de DLL ou bibliotecas de ligação dinâmica no Windows). As bibliotecas compartilhadas são carregadas quando o programa é carregado ou quando funções nelas são chamadas pela primeira vez. É claro que, se outro programa já tiver carregado a biblioteca compartilhada, não há necessidade de carregá-la novamente. Perceba que, quando uma biblioteca é carregada ou usada, não é a biblioteca inteira que é lida de uma só vez. As páginas entram uma a uma, de acordo com a necessidade; assim, as funções que não são chamadas não serão trazidas à RAM. 213 Bibliotecas compartilhadas Além de reduzir os arquivos executáveis e de economizar espaço na memória, as bibliotecas compartilhadas têm outra vantagem: se uma função em uma biblioteca compartilhada for atualizada para remover um erro, não é necessário recompilar os programas que a chamam. Os antigos arquivos binários continuam a funcionar. Essa característica é especialmente importante para softwares comerciais, em que o código-fonte não é distribuído ao cliente. Ex: Se a Microsoft encontra e repara um erro de segurança em algum DLL padrão, o Windows Update fará o download do novo DLL e substituirá o antigo, e todos os programas que usam o DLL automaticamente usarão a nova versão da próxima vez que forem inicializados. 214 Arquivos Mapeados As bibliotecas compartilhadas são realmente um caso especial de um recurso mais geral, chamado arquivos mapeados em memória. A idéia aqui é que um processo pode emitir uma chamada ao sistema para mapear um arquivo em uma porção de seu espaço de endereçamento virtual. Na maior parte das implementações, nenhuma página é trazida durante o período do mapeamento, mas, à medida que as páginas usadas, são paginadas, uma a uma, por demanda, usando o arquivo no disco como memória auxiliar. Quando o processo sai, ou explicitamente finaliza o mapeamento do arquivo, todas as páginas modificadas são escritas de volta no arquivo. Os arquivos mapeados fornecem um modelo alternativo para E/S. Em vez de fazer leituras e gravações o arquivo pode ser acessado como um grande arranjo de caracteres na memória. Em algumas situações, os programadores acham esse modelo mais conveniente. Se dois ou mais processos mapeiam o mesmo arquivo ao mesmo tempo, eles podem se comunicar através da memória compartilhada. Gravações feitas por um processo na memória compartilhada são imediatamente visíveis quando o outro lê da parte de seu espaço de endereçamento virtual mapeado no arquivo. Dessa forma, esse arquivo fornece um canal de largura de banda elevada entre processos e muitas vezes é usado como tal. Se os arquivos mapeados em memória estiverem disponíveis, as bibliotecas compartilhadas podem usar esse mecanismo. 215 Política de limpeza A paginação funciona melhor quando existe uma grande quantidade de molduras de páginas disponíveis prontas a serem requisitadas quando ocorrem faltas de página. Se a moldura de página estiver ocupada e, além disso, for modificada, antes de uma nova página ser carregada na memória, uma página antiga deverá primeiro ser escrita em disco. Para garantir um estoque abundante de molduras de páginas disponíveis, muitos sistemas de paginação executam um processo específico, denominado daemon de paginação (paging daemon), que dorme quase todo o tempo, mas que é acordado periodicamente para inspecionar o estado da memória. Se existirem apenas algumas molduras de página disponíveis, o daemon de paginação começa a selecionar as páginas a serem removidas da memória usando um algoritmo de substituição de página. Se essas páginas tiverem sido modificadas desde quando carregadas, elas serão escritas em disco. 216 Política de limpeza Em qualquer eventualidade, o conteúdo anterior da página é lembrado. No caso de uma página descartada da memória ser novamente referenciada antes de sua moldura ter sido sobreposta por uma nova página, a moldura pode ser reclamada, ou seja, trazida de volta, retirando-a do conjunto de molduras de página disponível. Manter uma lista de molduras de página disponíveis fornece melhor desempenho do que pesquisar toda a memória em busca de uma moldura de página disponível todas as vezes em que isso se tornar necessário. O daemon de paginação garante que todas as molduras de páginas disponíveis estejam limpas e que não precisem ser escritas às pressas em disco. 217 Interface da memória virtual Uma razão para dar o controle do mapa de memória a programadores é permitir que dois ou mais processos compartilhem a mesma memória. Se os programadores puderem nomear regiões de memória, talvez se torne possível a um processo fornecer a outro o nome de uma região, de modo que esse segundo processo também possa ser mapeado na mesma região do primeiro. Com dois (ou mais) processos, compartilhando as mesmas páginas, surge a possibilidade de um compartilhamento em largura de banda elevada (ou seja, um processos escreve na memória compartilhada e outro lê dessa mesma memória). 218 Interface da memória virtual O compartilhamento de páginas também pode ser usado na implementação de um sistema de troca de mensagens de alto desempenho. Em geral, na troca de mensagens, dados são copiados de um espaço de endereçamento para outro, a um custo considerável. Se os processos puderem controlar seus mapeamentos, uma mensagem poderá ser trocada retirando-se a página relacionada do mapeamento do processo emissor e inserindo-a no mapeamento do processo receptor. Nesse caso, somente os nomes de páginas devem ser copiados, em vez de todos os dados. 219 Interface da memória virtual Outra técnica avançada de gerenciamento de memória é a memória compartilhada distribuída. A idéia é permitir que vários processos em uma rede compartilhem um conjunto de páginas - possível, mas não necessariamente – por intermédio de um único espaço de endereçamento linear compartilhado. Quando um processo referencia uma página não atualmente mapeada, isso causa uma falta de página. O manipulador de falta de página localiza a máquina que contém a referida página e manda um pedido para liberar essa página de seu mapeamento e enviá-la pela rede. Quando a página chega, ela é mapeada namemória e a instrução que causou a falta de página é reinicializada. 220 Segmentação A memória virtual discutida até agora é unidimensional porque o endereço virtual vai de 0 a algum endereço máximo, um após o outro. Levando em consideração que para muitos problemas é melhor ter dois ou mais espaços de endereçamento separados, podemos imaginar 5 tabelas, onde cada uma das quatro tabelas cresce continuamente quando a compilação prossegue. Entretanto, a última cresce e diminui de modo imprevisível durante a compilação. Em uma memória unidimensional, essas cinco tabelas teria, de ser alocadas em regiões contíguas do espaço de endereçamento virtual. Agora imagine o que ocorre se um programa tem um número excepcionalmente grande de variáveis, mas uma quantidade normal de todo o restante. A região do espaço de endereçamento alocada para a tabela de símbolos pode se esgotar, mas talvez existam várias entradas livres nas outras tabelas. Obviamente, o compilador poderia simplesmente emitir uma mensagem que informasse que a compilação não continuaria em virtude da grande quantidade de variáveis, mas essa atitude não parece muito interessante, pois se sabe que existem espaços não utilizados nas outras tabelas. 221 Segmentação Prover a máquina com muitos espaços de endereçamento completamente independentes é chamado de segmentos. Pelo fato de cada segmento constituir um espaço de endereçamento separado, segmentos diferentes podem crescer ou reduzir independentemente, sem afetarem uns aos outros. Se uma pilha, em certo segmento, precisa de mais espaço de endereçamento para crescer, ela pode tê-lo, pois não existe nada em seu espaço de endereçamento capaz de colidir com ela. Segmento é uma entidade lógica que o programador conhece e usa como entidade lógica. Um segmento pode conter uma rotina, um arranjo, uma pilha ou um conjunto de variáveis escalares, mas em geral ele não apresenta uma mistura de diferentes tipos. A segmentação facilita o compartilhamento de rotinas ou dados entre vários processos. Como cada segmento forma uma entidade lógica da qual o programador está ciente – como uma rorina, um arranjo ou uma pilha –, diferentes segmentos podem possuir diferentes tipos de proteção . Ex: Um segmento de rotina pode ser especificado como somente para execução, o que proíbe tentativas de leitura ou escrita nele. 222 Gerência de Memória Virtual Swapping Utiliza-se a técnica de swapping em memória virtual para permitir aumento no grau de multiprogramação do sistema. Há diferentes políticas aplicadas na escolha dos processos que devem ser retirados da memória principal. A maioria dessas políticas baseia-se no estado e na prioridade do processo. O arquivo de swap é compartilhado por todos os processos que estão sendo executados no ambiente. Quando um processo é criado, o sistema reserva um espaço no arquivo de swap para ele. Quando o processo é eliminado, o sistema libera a área alocada. 223 Gerência de Memória Virtual Swapping Alguns sistemas utilizam um único arquivo para uso como arquivo de paginação e de swap. Em alguns sistemas, o arquivo de swap é uma área em disco reservada para esta função. O arquivo de swap (swap file) deve oferecer o melhor desempenho possível para as operações de swapping. 224 Sistemas de arquivo Todas aplicações precisam armazenar e recuperar informação. Enquanto estiver executando, um processo pode armazenar uma quantidade limitada de informação dentro de seu próprio espaço de endereçamento. Contudo, a capacidade de armazenamento está restrita ao tamanho do espaço de endereçamento virtual. Para algumas aplicações, esse tamanho é adequado, mas, para outras, é pequeno demais. Um segundo problema em manter a informação dentro do espaço de endereçamento do processo é que, quando o processo termina, a informação é perdida. Em muitas aplicações (ex: banco de dados), a informação precisa ficar retida por semanas, meses ou até mesmo para sempre. É inaceitável que a informação em uso pelo processo desapareça quando ele é encerrado. Além disso, a informação não deve desaparecer se uma falha no computador eliminar o processo. O terceiro problema é que muitas vezes é necessário que múltiplos processos tenham acesso à informação (ou a parte dela) ao mesmo tempo. A solução para esse problema é tornar a própria informação independente de qualquer processo. 225 Sistemas de arquivo Arquivos são unidades lógicas de informação criadas por processos. Em geral, um disco contém milhares de arquivos, um independente do outro. Na verdade, os arquivos também são uma espécie de espaço de endereçamento, mas eles são usados para modelar o disco e não a memória RAM. Os processos podem ler os arquivos existentes e criar novos, se necessário. A informação armazenada em arquivos deve ser persistente, isto é, não pode ser afetada pela criação e pelo término de um processo. Um arquivo só desaparecerá quando seu proprietário removê-lo explicitamente. 226 Sistemas de arquivo Arquivos são gerenciados pelo S.O. O modo como são estruturados, nomeados, acessados, usados, protegidos e implementados são um dos principais tópicos de um projeto de S.O.. De modo geral, essa parte do S.O. que trata dos arquivos é conhecida como sistema de arquivos. Arquivo é um mecanismo de abstração. Ele oferece meios de armazenar informações no disco e de tê-las depois. Isso deve ser feito de um modo que isole o usuário dos detalhes sobre como e onde a informação está armazenada e como os discos na verdade funcionam. 227 Arquivos: Nomeação de arquivos Quando um processo cria um arquivo, ele dá um nome a esse arquivo. Quando o processo termina, o arquivo continua existindo e outros processos podem ter acesso a ele simplesmente buscando seu nome. As regras exatas para se dar nome a um arquivo variam de sistema para sistema, mas todos os S.O. atuais permitem cadeias de caracteres (strings) de uma até oito letras como nomes válidos de arquivos. Frequentemente dígitos e caracteres especiais também são permitidos. Muitos sistemas de arquivos permitem nomes com tamanhos de até 255 caracteres. Alguns sistemas de arquivos distinguem letras maiúsculas de minúsculas e outros, não. O UNIX pertence à primeira categoria; o MS-DOS pertence à segunda. 228 Arquivos: Nomeação de arquivos Muitos S.O. permitem nomes de arquivos com duas partes separadas por um ponto. A parte que segue o ponto é chamada de extensão do arquivo e normalmente indica algo sobre o arquivo.