Sistemas Operacionais Hudson

Comienza Ya. Es Gratis
ó regístrate con tu dirección de correo electrónico
Sistemas Operacionais Hudson por Mind Map: Sistemas Operacionais  Hudson

1. FUNÇÕES BÁSICAS • Fornecer uma interface com o usuário; • Gerenciar a operação dos dispositivos de hardware do computador; • Gerenciar e manter o sistema de arquivos; • Dar suporte aos programas que são executados.

2. Um sistema operacional é um conjunto de rotinas executadas pelo processador, de forma semelhante aos outros programas utilizados.

3. MÁQUINA DE CAMADAS :O computador pode ser compreendido como uma máquina de camadas em dois níveis: hardware (nível 0) e software (nível 1). Essa visão em camadas é chamada de máquina virtual, pois o usuário interage com a máquina através do software, é como se o hardware não existisse. Essa visão é chamada de máquina virtual.

4. A evolução dos sistemas operacionais está ligada ao desenvolvimento dos computadores.

4.1. A Primeira Geração (1945-1955): Válvulas e Painéis com Plugs

4.1.1. John Von Neumann> Cria a arquitetura conhecida e utilizada até os dias de hoje

4.2. A Segunda Geração (1955 - 1965): Transistores e Sistemas Batch

4.2.1. Os computadores tornaram-se bastante confiáveis e puderam ser produzidos e vendidos comercialmente na expectativa de que eles continuassem a funcionar por bastante tempo para realizar algumas tarefas usuais. A princípio havia uma clara separação entre projetistas, construtores, operadores, programadores e o pessoal de manutenção.

4.3. A Terceira Geração (1965 - 1980): CIs e Multiprogramação

4.3.1. O 360 foi a primeira linha de computadores a usar (em pequena escala) circuitos integrados (CIs), fornecendo uma maior vantagem em preço/performance sobre as máquinas da segunda geração, que eram construídas de transistores individuais.

4.3.2. multiprogramação

4.3.2.1. Provavelmente, a mais importante dessas técnicas foi a multiprogramação. No 7094, quando o job que estava sendo executado tinha uma pausa esperando que uma operação em fita ou em qualquer outro periférico I/O fosse completada, a CPU simplesmente ficava ociosa até que a operação I/O fosse encerrada. Em cálculos científicos pesados, as operações de I/O não são frequentes, e esse tempo ocioso é insignificante.

4.3.2.2. A vontade de ter um tempo de resposta menor abriu espaço para "time-sharing", uma variante da multiprogramação, em que cada usuário tem um terminal "on-line". Num sistema "time-sharing", se 20 usuários estão conectados e 17 deles estão pensando, falando ou tomando café, a CPU pode ser alocada para os três jobs que querem serviço.

4.4. A Quarta Geração (1980-1990): Computadores Pessoais

4.4.1. A grande variedade de capacidade computacional disponível, especialmente a capacidade de computação altamente interativa com excelentes facilidades gráficas, fizeram crescer a indústria de produção de software para computadores pessoais.

4.4.2. Um interessante desenvolvimento que começou em meados dos anos 80 foi o crescimento de redes de computadores pessoais rodando sistemas peracionais para rede e sistemas operacionais distribuídos.

5. CONCORRÊNCIA

5.1. O processador pode executar instruções ao mesmo tempo, como por exemplo, operações de entrada e saída, permite que diversas tarefas sejam executadas concorrentemente.

5.2. Sistemas Monoprogramáveis X Multiprogramaveis

5.2.1. Nos sistemas multiprogramaveis, vários programas podem estar residentes em memória, concorrendo pela utilização do processador. Dessa forma, enquanto um programa executa operações de entrada e saída, outros podem utilizar o processador.

5.2.2. No tipo de sistema monoprogramavel, existe bastante desperdício de processador, o tempo de espera entre uma instrução e outra é longo se comparada com a velocidade do processador em executar as instruções.

5.2.3. Interrupções e Exceções

5.2.3.1. Durante a execução de um programa podem ocorrer alguns eventos inesperados, ocasionado um desvio forçado no seu fluxo de execução. Estes tipos de eventos, são conhecidos por Interrupção ou Exceção e pode ser consequência da sinalização de algum dispositivo de hardware externo ao processador ou da execução de instruções do próprio programa.

5.2.4. Operações de Entrada/Saída

5.2.4.1. Com a implementação do mecanismo de interrupção no hardware dos computadores, as operações de E/S puderam ser realizadas de uma forma mais eficiente. Em vez de o sistema periodicamente verificar o estado de uma operação pendente, o próprio controlador interrompia a UCP para avisar do término da operação.

5.2.5. Buffering

5.2.5.1. A técnica de buffering consiste na utilização de uma área de memória para a transferência de dados entre os periféricos e a memória principal denominada buffer.

5.2.6. Spooling

5.2.6.1. A técnica de spooling (simultaneous peripheral operation on-line) foi introduzida no final dos anos 50 para aumentar a produtividade e a eficiência dos sistemas operacionais.

5.2.7. Reentrância

5.2.7.1. Reentrância é a capacidade de um código de programa (código reentrante) poder ser compartilhado por diversos usuários, exigindo que apenas uma cópia do programa esteja na memória.

6. ESTRUTURA DOS SISTEMAS OPERACIONAIS

6.1. O sistema operacional é formado por um conjunto de rotinas (procedimentos) que oferecem serviços aos usuários do sistema e suas aplicações, bem como a outras rotinas do próprio sistema.

6.2. Esse conjunto de rotinas é chamado núcleo do sistema ou Kernel (cérebro). As principais funções do núcleo são:

6.2.1. ➢tratamento de interrupções; ➢criação e eliminação de processos; ➢sincronização e comunicação de processos; ➢escalonamento e controle dos processos; ➢gerência de memória; ➢gerência do sistema de arquivos; ➢operações de entrada e saída; ➢contabilização e segurança do sistema.

6.3. System Calls

6.3.1. Todo o controle de execução de rotinas do sistema operacional é realizado pelo mecanismo system call. Incialmente o sistema operacional verificará se a aplicação possui privilégios para executar a rotina desejada. Em caso negativo, o sistema operacioanl impedirá a execução do mesmo. Este é um mecanismo de proteção por software, no qual o sistema opeacional garante que as aplicações somente poderão executar rotinas do sistema que estão previamente autorizadas.

6.4. Modos de Acesso

6.4.1. Para que uma aplicação possa executar uma instrução privilegiada, o processador implementa o mecanismo de modos de acesso. Existem basicamente dois modos de acesso implementados pelo processador: modo usuário e modo kernel.

7. PROCESSO

7.1. O processo é a base para implantação de um sistema operacional multiprogramável.

7.1.1. Estrutura do Processo

7.1.1.1. Em um sistema multiusuário, cada usuário é associado a um processo. Ao executar um programa, o usuário tem a impressão de possuir o processador e demais recursos exclusivamente para si. Na verdade, o processador executa o programa de um usuário durante um intervalo de tempo, e no instante seguinte poderá estar executando um outro programa de outro usuário.

7.2. Contexto de hardware

7.2.1. O contexto de hardware guarda o conteúdo dos registradores do processador. Quando um processo está em execução, o seu contexto de hardware está armazenado nos registradores do processador. Quando o processo perde a utilização da CPU, o sistema salva as informações no contexto de hardware do processo.

7.3. Contexto de software

7.3.1. No contexto de software são especificadas as características e limites dos recursos que podem ser alocados pelo processo, como o numero Maximo de arquivos abertos simultaneamente, prioridade de execução e tamanho do buffer dos dispositivos de E/S.

7.4. Espaço de endereçamento

7.4.1. O espaço de endereçamento é a área de memória pertencente ao processo onde as instruções e dados do programa são armazenados para execução. Cada processo possui seu próprio espaço de endereçamento, que deve ser devidamente protegido do acesso dos demais processos

7.5. Bloco de controle do processo

7.5.1. A partir do PCB, o sistema operacional mantém todas as informações sobre o contexto de hardware, contexto de software e espaço de endereçamento de cada processo.

7.6. Estados do Processo

7.6.1. Os processos passam por diferentes estados ao longo de seu processamento, em função de eventos gerados pelo SO ou pelo próprio processo. Um processo ativo pode encontra-se em três estados diferentes:

7.6.1.1. Execução (running) – Um processo é dito no estado de execução quando está sendo processado pela CPU.

7.6.1.2. Pronto (ready) – Um processo está no estado de pronto quando aguarda apenas para ser executado.

7.6.1.3. Espera (wait) – Um processo no estado de espera aguarda por algum evento externo ou por algum recurso para prosseguir seu processamento.

7.7. Mudanças de Estado de Processo

7.7.1. Um processo muda de estado durante seu processamento em função de eventos originados por ele próprio (eventos voluntários) ou pelo sistema operacional (eventos involuntários).

7.7.1.1. Pronto → Execução – Após a criação de um processo, o sistema o coloca em uma lista de processos no estado de pronto, aguardando para ser executado. Cada sistema operacional tem sua política de escalonamento.

7.7.1.2. Execução → Espera – Um processo passa para o estado de espera por eventos gerados pelo próprio processo, como uma operação de E/S, ou por eventos externos.

7.7.1.3. Espera → Pronto – Ocorre quando uma operação solicitada é atendida ou o recurso esperado é concedido. Não existe a mudança de espera para execução diretamente.

7.7.1.4. Execução → Pronto – Ocorre através de eventos gerados pelo sistema, como o termino da fatia de tempo que o processo possui para sua execução. Então, aguarda nova oportunidade para continuar seu processamento.

7.8. Criação e Eliminação de Processos

7.8.1. Processos são criados e eliminados por diversas razões. A criação de um processo ocorre quando o sistema operacional adiciona um novo PCB à sua estrutura e reserva espaço na memória para uso. A partir da criação do PCB, o sistema operacional já reconhece a existência do processo, passando a gerenciá-lo e associar programas ao seu contexto para serem executados.

7.9. Processos Independentes, Subprocessos e Threads

7.9.1. O uso de processos independentes é a maneira mais simples de se implementar a concorrência em sistemas multiprogramáveis. Neste caso, não existe vínculo entre o processo criado e seu criador.

7.10. Processos Foreground e Background

7.10.1. Um processo foreground é aquele que permite a comunicação direta do usuário com o processo durante sua execução. Assim, ambos os canais estão associados a um terminal com teclado, mouse e monitor, permitindo portanto, a interação com o usuário .

7.10.2. Um processo background é aquele onde não existe a comunicação com o usuário durante seu processamento. Aqui, os canais de E/S não estão associados a nenhum dispositivo de E/S interativo, mas em geral a arquivos de E/S.

7.11. Processos do Sistema Operacional

7.11.1. O conceito de processo, além de estar associado a aplicações de usuários, podem também ser implementados na própria arquitetura do sistema operacional. A arquitetura microkernel implementa uso intensivo de processos que disponibilizam serviços para processos das aplicações e do próprio sistema operacional.

7.12. Processos CPU-Bound e I/O-Bound

7.12.1. Um processo é definido como CPU-Bound (ligado à CPU), quando passa a maior parte do tempo no estado de execução, ou seja, utilizando o processador.

7.12.2. Por outro lado, um processo I/O-Bound (ligado à E/S) passa a maior parte do tempo no estado de espera, pois realiza grande número de operações de E/S.

7.13. Sinais

7.13.1. são mecanismos que permitem notificar processos de eventos gerados pelo sistema operacional ou por outros processos. O uso de sinais é fundamental para a gerência de processos, além de possibilitar a comunicação e sincronização entre processos.

8. THREAD

8.1. Ambiente Monothread

8.1.1. Um programa é uma seqüência de instruções, compostas de desvios, repetições e chamadas a procedimentos e funções. Em um ambiente monothread, um processo suporta apenas um programa em seu espaço de endereçamento. Neste ambiente, aplicações concorrentes são implementadas apenas com o uso de múltiplos processos independentes ou subprocessos.

8.2. Ambiente Multithread

8.2.1. Em um ambiente multithread, ou seja, com múltiplos threads, não existe a idéia de programas associados a processos, mas sim a threads. O processo, neste ambiente, tem pelo menos um thread em execução, mas pode compartilhar o seu espaço de endereçamento com inúmeros outros threads.

8.3. Programação Multithreads

8.3.1. Para obter os benefícios do uso de threads, uma aplicação deve permitir que partes diferentes de seu código sejam executadas em paralelo de forma independente. Se um aplicativo realiza várias operações de E/S e trata eventos assíncronos, a programação multithread aumenta seu desempenho até mesmo em ambientes com um fraco processador.

8.4. Arquitetura e Implementação

8.4.1. O conjunto de rotinas disponíveis para que uma aplicação utilize as facilidades dos threads é chamado de pacote de threads. Existem diferentes abordagens na implementação deste pacote em um sistema operacional, o que influenciará no desempenho, na concorrência e na modularidade das aplicações multithread.

8.5. Threads em Modo Usuário

8.5.1. A vantagem deste modelo é a possibilidade de implementar aplicações multithreads mesmo em sistemas operacionais que não suportem threads. Utilizando biblioteca, múltiplos threads podem ser criados, compartilhando o mesmo espaço de endereçamento do processo, além de outros recursos.

8.6. Threads em Modo Kernel

8.6.1. O grande problema para pacotes em modo kernel é o seu baixo desempenho. Enquanto nos pacotes em modo usuário todo tratamento é feito sem ajuda do sistema operacional, ou seja, sem a mudança do modo de acesso (usuário-kernel-usuário), pacotes em modo kernel utilizam chamadas a rotinas do sistema e, conseqüentemente, várias mudanças no modo de acesso.

8.7. Threads em Modo Híbrido

8.7.1. O modo híbrido, apesar de maior flexibilidade, apresenta problemas herdados de ambas as implementações. Por exemplo, quando um TMK realiza uma chamada bloqueante, todos os TMUs são colocados no estado de espera. TMUs que desejam utilizar vários processos deve utilizar diferentes TMKs, o que influenciará no desempenho.

8.8. Scheduler Activations

8.8.1. Introduzido no início dos anos 90, este pacote combina o melhor das duas arquiteturas, mas em vez de dividir os threads em modo usuário entre os de modo kernel, o núcleo do sistema troca informações com a biblioteca de threads utilizando uma estrutura de dados chamada scheduler activations.

9. SINCRONIZAÇÃO E COMUNICAÇÃO ENTRE PROCESSOS.

9.1. Os processos alternam sua execução segundo escalonamento estabelecido pelo sistema operacional e mesmo assim aplicações concorrentes obtêm melhoras em seu desempenho.

9.2. Aplicações Concorrentes

9.2.1. Em aplicações concorrentes, pode ser necessário que os processos comuniquem-se entre si. Esta comunicação pode ser implementada através de variáveis compartilhadas na memória principal ou trocas de mensagens.

9.3. Especificação de Concorrência em Programas

9.3.1. Técnicas mais recentes tentam expressar a concorrência no código dos programas de uma forma mais clara e estruturada. As primeiras notações para especificar uma concorrência em um programa foram os comandos FORK e JOIN.

9.4. Problemas de Compartilhamento de Recursos

9.4.1. Quando dois ou mais processos compartilham um mesmo recurso, alguns mecanismos devem evitar que este tipo de problema ocorra (conhecidos como race conditions – condições de corrida).

9.5. Exclusão Mútua

9.5.1. A exclusão mútua deverá agir apenas sobre os processos que estão concorrendo em um determinado recurso. Quando desenvolvemos um programa, que faça tratamento de exclusão mútua, este deverá ter uma seção chamada REGIÃO CRÍTICA (Critical Region).

9.6. Starvation

9.6.1. A primeira situação indesejada é conhecida como starvation (ou espera indefinida).

9.6.1.1. Quem determina as prioridades dos processos é o sistema operacional. Neste caso existem duas formas do sistema operacional determinar qual será a vez de quem. Ou por escolha aleatória ou por prioridades.

9.7. Sincronização condicional

9.7.1. é uma situação onde o acesso a um recurso compartilhado exige a sincronização de processos vinculada a uma condição de acesso.

9.8. Soluções de Hardware

9.8.1. Desabilitação de interrupções

9.8.1.1. Faz com que o processo, antes de entrar em sua região crítica desabilite todas as interrupções externas e a reabilite após deixar a região critica. Como a mudança de contexto de processos só pode ser realizada através de interrupções, o processo que as desabilitou terá acesso exclusivo garantido.

9.8.2. Instrução test-and-set

9.8.2.1. O uso desta instrução especial oferece vantagens, como a simplicidade de implementação da exclusão mútua em múltiplas regiões críticas e o uso da solução em arquiteturas com múltiplos processadores. A principal desvantagem é a possibilidade do starvation, pois a seleção do processo para o acesso ao recurso é arbitrária.

9.9. Soluções de software

9.9.1. Diversos algoritmos foram propostos na tentativa de implementar a exclusão mútua através de soluções de software. As primeiras soluções tratavam apenas da exclusão mútua para dois processos e, inicialmente, apresentavam alguns problemas. A evolução ocorreu até uma solução definitiva para a exclusão mútua para N processos.

9.10. Semáforos

9.10.1. O semáforo é uma variável que fica associada a um recurso compartilhado, indicando quando este está sendo acessado por um outro processo.

9.11. Monitores

9.11.1. Basicamente, são mecanismos de sincronização compostos de um conjunto de procedimentos, variáveis e estrutura de dados definidos dentro de um módulo cuja finalidade é a implementação automática da exclusão mútua entre seus procedimentos. Somente um processo pode estar executando um dos procedimentos do monitor em um determinado instante.

9.12. Troca de mensagens

9.12.1. No sistema de troca de mensagens, existe a possibilidade da mensagem se perder. Para isto foi implementado o recurso de que o processo receptor ao recebê-la deverá enviar ao processo transmissor uma mensagem de recebimento.

9.13. Deadlock

9.13.1. O Deadlock existe em qualquer sistema multiprogramável. Dizemos que um processo está em Deadlock quando este para de responder porque está esperando por um evento que nunca ocorrerá. Esta situação é conseqüência do problema da exclusão mútua.

9.13.2. Prevenção do Deadlock

9.13.2.1. Para prevenir o Deadlock é preciso garantir que uma das quatro condições acima citada nunca ocorra, dentre as diversas situações já citadas pode ser feito um minucioso trabalho de determinar muito bem que recursos, quais recursos e quando estes recursos deverão ser disponibilizados aos processos.

9.13.3. Detecção de Deadlock

9.13.3.1. Em sistemas que não possuam mecanismos que previnam a ocorrência de deadlocks, é ecessário um esquema de detecção e correção do problema.Um exemplo deste tipo de detector é o próprio Gerenciador de tarefas do Windows que detecta o aplicativo que parou de responder ao sistema causado, possivelmente, por um deadlock.

9.13.3.2. Correção do Deadlock

9.13.3.2.1. Geralmente o problema é resolvido eliminando os processos envolvidos e desalojando os recursos para ele já garantidos. É aquele processo em que você dá um Alt+Ctrl+Del no Windows e aparece uma janela informando o aplicativo que não responde.

10. GERÊNCIA DO PROCESSADOR

10.1. Funções

10.1.1. Dentre as funções da gerência do processador, podemos citar: manter o processador ocupado a maior parte do tempo. balancear o uso da CPU entre processos, privilegiar a execução de aplicações críticas, maximizar o throughput e oferecer tempos de resposta razoáveis aos usuários interativos.

10.2. Critérios de escalonamento

10.2.1. Utilização do processador: corresponde a uma taxa de utilização, que na maioria dos sistemas varia entre 30 e 90%. Uma utilização abaixo dos 30% indicaria um sistema ocioso, com carga de processamento baixa, enquanto uma taxa de utilização acima dos 90% pode indicar um sistema bastante carregado, próximo da sua capacidade máxima (em alguns casos tal situação pode levar a um crash – travamento do sistema).

10.2.2. Throughput: é o número de processos executados em um determinado intervalo de tempo. Quanto maior o throughput, maior o número de tarefas executadas em função do tempo. A maximização do throughput é desejada na maioria dos sistemas.

10.2.3. Tempo de Processador: é o tempo que um processo leva no estado de execução, durante seu processamento. As políticas de escalonamento não interferem neste parâmetro, sendo este tempo função apenas do código executável e da entrada/saída de dados.

10.2.4. Tempo de Espera (pela CPU): é todo o tempo que o processo permanece na fila de pronto, aguardando a liberação da CPU para ser executado. A redução deste tempo de espera é desejada pela maioria das políticas de escalonamento.

10.2.5. Tempo de Turnaround: é o tempo total que o processo permaneceu no sistema, desde sua criação até o momento em que é encerrado. São contados os tempos de alocação de memória, espera na fila de pronto e interrupção (E/S).

10.2.6. Tempo de Resposta: é o tempo decorrido entre uma requisição ao sistema e o instante em que a resposta começa a ser exibida. Em sistemas interativos, como aplicações on-line ou acesso à Web, os tempos de resposta devem ser da ordem de apenas poucos segundos.

10.3. Escalonamentos Não-Preemptivos e Preemptivos

10.3.1. Escalonamentos do tipo não-preemptivos são aqueles onde o sistema operacional não pode interromper o processo em execução para retirá-lo da CPU. Assim sendo, se nenhum evento externo ocorresse durante a execução do processo, este permanecia na CPU até terminar ou então alguma instrução do próprio programa o desviasse para o estado de espera (operação de E/S).

10.3.2. Já os escalonamentos preemptivos são caracterizados pela possibilidade de o sistema operacional interromper o processo em execução para retirá-lo da CPU e dar lugar a outro. Neste caso o processo retirado da CPU volta ao estado de pronto, onde permanece aguardando nova oportunidade de ocupar a CPU. Com o uso da preempção, é possível ao sistema priorizar a execução de processos, como no caso de aplicações em tempo real.

11. GERÊNCIA DE MEMÓRIA / MEMÓRIA VIRTUAL

11.1. Funções

11.1.1. Geralmente, os programas são armazenados em memórias secundárias, de uso permanente e não voláteis, como discos ou fitas. Como o processador somente executa o que está na memória principal, o sistema operacional deve sempre transferir programas da memória secundária para a principal antes de serem executados.

11.2. Alocação Contígua Simples

11.2.1. Este tipo de alocação foi implementado nos primeiros sistemas operacionais, embora ainda nos dias de hoje esteja presente em alguns sistemas monoprogramáveis. Nesse modelo, a memória principal é dividida em duas partes, uma para o sistema operacional e a outra para o programa do usuário.

11.3. Segmentação de Programas

11.3.1. Na alocação contígua simples todos os programas estão limitados ao tamanho da memória principal disponível para o usuário. Uma solução encontrada para o problema é dividir o programa em módulos, de modo que seja possível a execução independente de cada módulo, utilizando a mesma área de memória. A esta técnica dá-se o nome de segmentação ou overlay.

11.4. Alocação Particionada Estática

11.4.1. Nos primeiros sistemas multiprogramáveis a memória era dividida em blocos de tamanho fixo, chamados partições.O tamanho dessas partições, estabelecido em tempo de inicialização do sistema, era definido em função do tamanho dos programas que executariam no ambiente

11.5. Alocação Particionada Dinâmica

11.5.1. Na alocação particionada dinâmica, foi eliminado o conceito de partições de tamanho fixo. Nesse esquema, cada programa, ao ser carregado, utilizaria o espaço necessário à sua execução, tornando esse espaço a sua partição.

11.6. Estratégias de Alocação de Partição

11.6.1. A melhor estratégia a ser adotada por um sistema depende de uma série de fatores, sendo o mais importante o tamanho dos programas executados no ambiente.

11.7. Swapping

11.7.1. É uma técnica aplicada à gerência de memória que visa dar maior taxa de utilização à memória principal, melhorando seu compartilhamento. Visa também resolver o problema da falta de memória principal num sistema.

11.8. Memória Virtual

11.8.1. Memória virtual é uma técnica sofisticada e poderosa de gerência de memória onde as memórias principal e secundária são combinadas, dando ao usuário a impressão de que existe muito mais memória do que a capacidade real de memória principal.

11.9. Algoritmos de substituição de páginas

11.9.1. Os algoritmos de substituição de páginas têm o objetivo de selecionar os frames que tenham as menores chances de serem referenciados num futuro próximo. Caso contrário, o frame poderia retornar diversas vezes para a memória real, provocando excesso de page faults.

11.9.1.1. algoritmo ótimo: impossível de ser implementado, pois o processador não consegue prever com segurança qual frame não será mais referenciado durante a execução do programa. Tal fato deve-se à lógica do programa e aos dados que ele manipula, desconhecidos pelo processador.

11.9.1.2. Algoritmo aleatório: escolhe qualquer página, entre as alocadas na memória, para fazer a substituição. Em função de sua baixa eficiência, este algoritmo não muito utilizado, embora consuma poucos recursos do sistema.

11.9.1.3. Algoritmo FIFO (first in, first out): escolhe a página que está há mais tempo na memória principal para fazer a troca. É um algoritmo de simples implementação, mas corre o risco de retirar uma página que, embora tenha sido carregada há mais tempo, esteja sendo muito utilizada. Por essa razão não é muito usado.

11.9.1.4. Algoritmo LFU (least frequently used): elege a página menos frequentemente usada para efetuar a troca. Através de um contador, armazenado na tabela de endereçamento de páginas, mo sistema identifica quantas referências cada página teve e utiliza esta informação para escolher a página.

11.9.1.5. Algoritmo LRU (least recently used): elege a página menos recentemente usada para fazer a troca. O sistema mantém na tabela de endereçamento de páginas um campo onde são armazenadas a data e a hora da última referência de cada página, e com base nestas informações faz a seleção.

11.9.1.6. Algoritmo NRU (not recently used): elege a página menos recentemente usada para efetuar a troca. O sistema exclui da decisão a página mais recente e escolhe entre as outras, pelo método FIFO, qual página deve sair.

12. GERÊNCIA DE SISTEMAS DE ARQUIVOS

12.1. Estrutura de Diretórios

12.1.1. É como o Sistema organiza logicamente os arquivos. Contém entradas associadas aos arquivos, com as informações de localização, nome, organização e outros atributos:

12.1.1.1. · Nível único: é a implementação mais simples de uma estrutura de diretórios, onde existe um único diretório contendo todos os arquivos do disco. É muito limitado, não permitindo a criação de arquivos com o mesmo nome. · Diretório pessoal: Evolução do modelo anterior, permite a cada usuário ter ser “diretório” particular, sem a preocupação de conhecer os outros arquivos do disco. Neste modelo há um diretório “master” que indexa todos os diretórios particulares dos usuários, provendo o acesso a cada um. · Múltiplos níveis (ÁRVORE): É o modelo utilizado hoje em dia em quase todos os Sistemas Operacionais. Nesta modalidade cada usuário pode criar vários níveis de diretórios (ou sub-diretórios), sendo que cada diretório pode conter arquivos e subdiretórios. O número de níveis possíveis depende do Sistema Operacional.

12.2. Sistemas de alocação de arquivos

12.2.1. · FAT: sistema criado no MS-DOS e depois utilizado no Windows. Usa listas encadeadas, tem um limite de área utilizável em partições de 2 GB, caracteriza-se por um baixo desempenho no acesso e armazenamento. · FAT32: igual ao FAT no que diz respeito a organização e desempenho, mas pode trabalhar com partições de até 2TB. · NTFS: NT File System, original da plataforma Windows NT/2000/XP. Opera com uma estrutura em árvore binária, oferecendo alto grau de segurança e desempenho. · UNIX: Usa diretório hierárquico, com um raiz e outros diretórios subordinados. Neste Sistema Operacional todos os arquivos são considerados apenas como uma “seqüência” de bytes, sem significado para o Sistema.

12.3. Gerência de espaço livre

12.3.1. São três as formas de se implementar estruturas de espaços livres.

12.3.1.1. Uma delas é através de uma tabela denominada mapa de bits, onde cada entrada da tabela é associada a um bloco do disco representado por um bit, que estando com valor 0 indica que o espaço está livre, e com valor 1 representa um espaço ocupado. Gasta muita memória, pois para cada bloco do disco há uma entrada na tabela.

12.3.1.2. A segunda forma é utilizando uma lista encadeada dos blocos livres do disco. Desse modo, cada bloco possui uma área reservada para armazenar o endereço do próximo bloco livre. Apresenta problemas de lentidão no acesso, devido às constantes buscas seqüenciais na lista.

12.3.1.3. A terceira forma é a tabela de blocos livres. Nesta, leva em consideração que blocos contíguos de dados geralmente são alocados/liberados simultaneamente. Desta forma, pode-se enxergar o disco como um conjunto de segmentos de blocos livres. Assim, pode-se manter uma tabela com o endereço do primeiro bloco de cada segmento e o número de blocos contíguos que se seguem.

12.4. Proteção de acesso

12.4.1. Considerando-se que os meios de armazenamento são compartilhados por vários usuários, é fundamental que mecanismos de proteção sejam implementados para garantir a integridade e proteção individual dos arquivos e diretórios:

12.4.1.1. Senha de acesso: mecanismo de simples implementação, mas apresenta duas desvantagens: não é possível determinar quais os tipos de operação podem ser efetuadas no arquivo, e, se este for compartilhado, todos os usuários que o utilizam devem conhecer a senha de acesso.

12.4.1.2. Grupos de usuário: é muito utilizada em muitos Sistemas Operacionais. Consiste em associar cada usuário a um grupo. Os grupos são organizados logicamente com o objetivo de compartilhar arquivos e diretórios no disco. Este mecanismo implementa três níveis de proteção: OWNER (dono), GROUP (grupo) e ALL (todos).

12.4.1.3. Lista de controle de acesso: é uma lista associada ao arquivo onde são especificados quais os usuários e os tipos de acesso permitidos. O tamanho dessa estrutura pode ser bastante extenso se considerarmos que um arquivo pode ser compartilhado por vários usuários. Além deste problema, há o inconveniente de se fazer acesso seqüencial à lista toda vez que um acesso é solicitado.