www.carlosrobertodasvirgens.wikispaces.com/ Sistemas Operacionais Definição • SO é um programa que permite às pessoas usar o Hardware do computador (CPU, Memória e • Armazenamento Secundário). Os usuários não dão instruções diretamente ao computador. Em vez disso, eles dão instruções ao Sistema Operacional. O SO instruí o Hardware a executar as tarefas desejadas. Funções O que faz o Sistema Operacional? Imaginemos uma calculadora e várias pessoas querendo usá-la. • Como você poderia dar a cada um aquilo que ele precisa? • Quem usaria a calculadora primeiro? • O que você faria se alguém se apossasse da calculadora por muito tempo? • O que você faria se alguém insistisse que seus cálculos são secretos e que ninguém poderia ter conhecimentos? • O que você faria se eles quisessem armazenar seus resultados em algum lugar? Esta situação é semelhante ao que o SO geralmente enfrenta. Existem recursos que muitas pessoas querem usar. Se não houver algo que execute as tarefas, haverá conflitos e confusão geral. Tarefas que o Sistema Operacional realiza: • • • • • • • Permite que os programas armazenem e obtenham as informações. Isola os programas dos detalhes específicos de hardware. Controla o fluxo de dados entre os componentes de um computador. Permite que outros programas sejam executados sem interferência de outros programas. Permite que programas independentes cooperem periodicamente e compartilhem informações. Responde aos erros ou a solicitações do usuário. Impõe um escalonamento entre programas que solicitem recursos. Histórico • O primeiro computador eletrônico (o ENIAC) não tinha sistema operacional. • O ENIAC tinha de ser operado manualmente. • O ENIAC precisava que os engenheiros conectassem fios e conjuntos de chaves e reles para que pudesse • • • • • • • • • • • • • funcionar. Uma vez concluído o trabalho dos engenheiros, o computador fazia os cálculos automaticamente. Se fossem necessários cálculos diferentes, era preciso refazer a fiação do computador. Durante a década de 1950, foram desenvolvidos Sistemas Operacionais simples, que permitiam que programas fossem apresentados (usualmente em cartões perfurados) em seqüência e armazenados. Todos os recursos do computador estavam dedicados a apenas um programa de cada vez. O próximo estágio do desenvolvimento (início da década de 1960) foi armazenar vários programas na memória simultaneamente. Em vez de serem executados em seqüência, os programas ocupavam turnos. Cada um executado por um certo tempo, quando então o Sistema Operacional alocava a CPU para outro. Um usuário podia solicitar permissão por meio de um terminal e acessar recursos quase imediatamente. Migrações para um computador maior significavam uma mudança para um novo Sistema Operacional. Em meados da década de 1960, a IBM introduziu um Sistema Operacional que poderia ser executado em qualquer computador, desde os pequenos e baratos até os mais caros. Como as informações geralmente tinham de ser acessíveis a muitos usuários, começou a surgir a necessidade de estabelecer comunicação entre computadores separados. Os Sistemas operacionais já não eram destinados apenas a sistemas estanques. Eles tinham de estabelecer interfaces com redes complexas de comunicações de dados. Tipos de Sistemas Operacionais 1 1. Monotarefa (Single-Tasking) • O ambiente mais simples, é aquele onde um usuário executa um aplicativo de cada vez. • O Sistema Operacional permite que apenas um programa (tarefa) seja executado de cada vez. Esse tipo de Sistema Operacional tem como responsabilidades principais: processamento E/S, gerenciamento de disco e gerenciamento de memória. Por exemplo, o Sistema Operacional deve: • Ler e interpretar as entradas do teclado. • Enviar dados a um disco , impressora ou outro dispositivo de saída. • Manter listas de arquivos em um disco e manter um controle do espaço de disco disponível. • Manter compiladores, editores e outros programas do sistema em locais de memória distintos. 2. Multitarefa (Monousuário) • Comportam apenas um usuário, que pode, entretanto, executar várias atividades ao mesmo tempo. Sistemas Multiusuário • Também chamados sistemas multiprogramação. • São mais complexos do que os sistemas monousuários. • A elaboração do escalonamento se torna mais importante em um computador multiusuário. Tipos de Programas 1. Programas Interativos • É aquele que o usuário ativa por meio de um terminal. Em geral o usuário introduz um pequeno comando. • O Sistema Operacional interpreta então esse comando, decide qual a ação apropriada e a executa. • Finalmente, ele instrui o usuário para que outro comando seja introduzido mostrando um sinal de prontidão ou uma mensagem. • Os usuários interativos esperam respostas rápidas. 2. Programas em Lote • Os programas em lote ( batch programs) dominaram a computação desde a década de 1950 até o começo da década de 1970. • Um usuário pode armazenar comandos em um arquivo, colocá-lo em uma fila de lotes do Sistema • • • Operacional, e então se desconectar do sistema e executar alguma outra tarefa. O arquivo com os comandos, porém, permanece na fila e é eventualmente tratado pelo sistema. Os usuários de programas em lote, ao contrário dos usuários interativos, não esperam respostas imediatas. Como resultados, os programas de lote em geral têm prioridade mais baixa do que os interativos. 3. Programas em Tempo Real • A programação em tempo real é usada quando respostas imediatas são essenciais. • Os usuários interativos preferem respostas rápidas, mas os usuários de programas em tempo real as exigem. • Exemplos de programação em tempo real incluem software que deve responder a eventos externos, como o sistema de controle de tráfego aéreo em um aeroporto. • Outros exemplos de programação em tempo real são: robôs, controladores de veículos, monitoração de experimentos de laboratório, reatores nucleares, indústrias químicas e controle de equipamentos em fábricas. Máquinas Virtuais • Em geral os sistemas multiusuário permitem que os usuários compartilhem o acesso aos recursos de um computador. • Como o Sistema operacional define quais os recursos existentes, os usuários geralmente vêem esses mesmos recursos. • Há um outro tipo de sistema, um monitor de máquina virtual, que proporciona a cada usuário uma visão particular de seu ambiente de computação. 2 Projeto em Camadas • Muitos Sistemas Operacionais implementam a interface entre o usuário e o computador como sendo uma • • • • • • • • • • • • • • • série de etapas ou camadas. A camada superior define as funções e a inferior contém os detalhes de mais baixo nível para executá-las. O interpretador de comandos, na realidade, não executa os comandos do usuário. A razão é que muitos comandos, apesar de parecerem simples, são na realidade muito complicados. Por exemplo, um simples comando solicitando ao Sistema Operacional que imprima o conteúdo de um arquivo exige que ele faça muitas coisas, entre elas: Determinar se o arquivo existe. Determinar se o usuário tem permissão para acessar o arquivo. Determinar a estrutura do arquivo. Localizar o arquivo. Ler o arquivo. Determinar onde o conteúdo deve ser impresso. Escrever no dispositivo de saída. A última camada é o núcleo (Kernel), o “coração”do Sistema Operacional. Ele contém as rotinas mais críticas e mais freqüentemente utilizadas. Quando o usuário faz uma solicitação, os utilitários fazem a maior parte das verificações e preparações necessárias para atender a solicitação. Mas a última etapa, para dar ao usuário aquilo de que ele precisa, geralmente é executada pelo núcleo. Processos • • • • Um processo é basicamente um programa em execução, sendo constituído do código executável, dos dados referentes ao código, da pilha de execução, do valor do contador de programa (registrador PC), do valor do apontador de pilha (registrador SP), dos valores dos demais registradores do hardware, além de um conjunto de outras informações necessárias à execução do programa. Um usuário pode ter vários programas independentes sendo executados simultaneamente e fazendo solicitações conflitantes. Para estudar um Sistema Operacional, precisamos considerar como ele responde a todas as atividades independentes que podem existir. Chamamos essas atividades de processos (ou tarefas). O número de programas por usuário pode variar. O Sistema Operacional não está preocupado com o usuário ou mesmo com o programa (pelo menos não diretamente) - sua responsabilidade básica é com os que devem ser executados e competem aos recursos. Recursos Um Sistema Operacional deve responder às necessidades de um processo. Mas que necessidade são essas? Basicamente, os processos requerem recursos. 1. Memória • Um processo precisa de memória para armazenar suas instruções e dados. Portanto, um sistema operacional deve garantir ao processo uma quantidade de memória suficiente. • A memória é um recurso finito. • O Sistema Operacional não deve permitir que o processo ocupe tanta memória a ponto de impedir que outros processos sejam executados. • A privacidade e a segurança exigem que um processo seja impedido de acessar a memória de outro processo arbitrariamente. 2. CPU • O processo precisa da CPU para executar suas instruções. • Como usualmente há mais processos do que CPUs, o Sistema Operacional deve controlar seu uso, mas deve fazê-lo adequadamente. 3. Dispositivos 3 • Os dispositivos incluem as impressoras, unidades de fita e unidades de disco. • O Sistema Operacional tem de determinar quem tem acesso a quê, além de controlar o fluxo dos dados enquanto os processos lêem e escrevem nos dispositivos. 4. Arquivos • O que se espera é que o Sistema Operacional localize rapidamente um determinado arquivo e também que possa localizar um determinado registro no arquivo. • Esta é uma tarefa complexa. Concorrência • Um dos problemas mais difíceis na administração dos recursos está relacionado ao fato de muitos processos existirem simultaneamente. • Dizemos que esses processos são concorrentes. • Por exemplo, processos concorrentes freqüentemente acessam o mesmo arquivo. • O Sistema Operacional deverá garantir que um processo não altere os dados que um outro processo esteja usando. Gerenciamento de Memória Conceitos Iniciais: • • • • • • CPU e periféricos de I/O interagem com a memória. Um programa deve ser carregado na memória principal para executar. Memória secundária pode ser utilizada como extensão da memória principal. Memória física é a memória do hardware começa geralmente no endereço físico 0 e continua até um endereço qualquer. Também é chamada de memória principal. O núcleo do S O ocupa parte da memória principal. Problemas ao se observar recursos da memória: *Proteger programas e dados de interferência de outros programas. *Fazer com que o S O proteja a si mesmo. Gerência de Memória 1. Introdução • Nos Sistemas operacionais monoprogramáveis a gerência da memória não é muito complexa. • Nos Sistemas multiprogramáveis ela se torna crítica, devido a necessidade de se manter o maior número de usuários possível utilizando a memória eficientemente. 2. Alocação contígua Simples • A alocação contígua simples foi implementada nos primeiros sistemas operacionais desenvolvidos. • A memória principal é dividida em duas partes: uma para o Sistema Operacional e outra para o Programa do Usuário. • O programador deve desenvolver suas aplicações preocupado-se , apenas, em não ultrapassar o espaço de memória disponível. O usuário tem controle sobre toda a memória principal, podendo acessar qualquer posição de memória, inclusive para alterar o Sistema Operacional. • Alguns sistemas implementam proteção através de um registrador, que delimita as áreas do Sistema Operacional e do usuário. • Dessa forma, sempre que um programa de usuário faz referência a um endereço na memória, o sistema verifica se o endereço está nos seus limites. • Apesar de sua fácil implementação e código reduzido, a alocação contígua simples não permite a • • • utilização eficiente do processador. Apenas um usuário pode dispor desses recursos. Caso o programa do usuário não preencha totalmente, existirá um espaço de memória sem utilização. A princípio, os programas dos usuários estavam limitados ao tamanho da memória principal disponível. 4 • A solução encontrada para o problema foi dividir o programa em partes (módulos), de forma que • • • • • • pudessem executar independentemente uma da outra, utilizando uma mesma área de memória. Essa técnica é chamada de overlay (sobreposição). Quando um módulo estiver na memória, o outro não precisa necessariamente estar. O módulo principal é comum aos dois módulos; logo, deve permanecer na memória durante todo o tempo. A definição das áreas de overlay é função do programador, através de comandos específicos da linguagem utilizada. O tamanho de uma área será estabelecido a partir do tamanho do maior módulo. A técnica de overlay tem a vantagem de permitir ao programador expandir os limites da memória principal. A utilização dessa técnica exige muito cuidado, pois pode trazer implicações tanto no desempenho das aplicações, devido à possibilidade de transfer6encia excessiva dos módulos entre disco e a memória, quanto na sua manutenção. 3. Alocação Particionada • Nos sistemas multiprogramáveis, o processador permanece ocioso e a memória é substituída, enquanto o programa aguarda por algum evento. • Para a multiprogramação ser eficiente, é necessário que vários programas estejam na memória ao mesmo tempo, daí a necessidade de uma nova forma de organização para a memória principal. 3.1 Alocação Particionada Estática • Nos primeiros sistemas multiprogramáveis, a memória foi dividida em pedaços de tamanho fixo, • • • • • • • • • • • • chamados partições. O tamanho das partições era estabelecido na fase de iniciação do sistema, em função do tamanho dos programas que executariam no ambiente. Sempre que fosse necessária a alteração do tamanho de uma partição, o sistema deveria ser desativado e reiniciado com uma nova configuração. A princípio, os programas só podiam executar em uma das partições, mesmo se outras estivessem disponíveis. Essa limitação se devia aos compiladores e montadores, que geravam apenas código absoluto. A esse tipo de alocação chamou-se alocação particionada estática absoluta. Com a evolução dos compiladores, linkers e loaders, a geração de código relocável foi possível, e os programas puderam ser carregados em qualquer partição. Foi criado um novo tipo de organização, denominado alocação particionada estática relocável. Para manter o controle de quais partições estavam alocadas ou não, os sistemas possuíam uma tabela, delimitando cada partição, seu tamanho e se estava em uso ou não. Sempre que um programa era carregado para a memória, o sistema percorria a tabela, na tentativa de localizar uma partição livre, onde o programa pudesse ser alocado. Nesse esquema de alocação de memória, a proteção baseia-se em dois registradores, que indicam os limites inferior e superior da partição onde o programa está sendo executado. Tanto nos sistemas de alocação absoluta quanto nos de alocação relocável, os programas, normalmente, não preenchiam totalmente as partições onde eram carregados. Se um programa for maior que qualquer partição livre, ele ficará aguardando uma que o acomode, mesmo que existam duas ou mais partições adjacentes que, somadas, totalizem o tamanho do programa. 3.2 Alocação Particionada Dinâmica • A alocação particionada estática, analisada no item anterior, deixou evidente a necessidade de uma nova forma de organização para a memória principal, que diminuísse o problema da fragmentação e, conseqüentemente, aumentasse o grau de compartilhamento da memória. • Na alocação particionada dinâmica (ou variável), foi eliminado o conceito de partições de tamanho fixo. • Cada programa utilizaria o espaço de que necessitasse, passando esse pedaço a ser sua partição. • A fragmentação externa começará a ocorrer, realmente, quando os programas forem terminando e deixando espaços cada vez menores na memória, não permitindo o ingresso de novos programas. Existem duas soluções para fragmentação • Os espaços adjacentes são reunidos, produzindo um espaço de tamanho maior. • A segunda maneira de resolver o problema da fragmentação envolve a relocação de todas as partições, eliminando os espaços entre elas e criando uma única área livre contígua. 5 • A complexidade do algoritmo e o consumo de recursos do sistema, como processador e área em disco, podem torná-lo inviável. 3.3 Estratégias para Escolha da Partição • Os sistemas Operacionais implementam, basicamente, três estratégias para determinar em qual partição • livre um programa será carregado para execução. Essas estratégias tentam evitar, ou diminuir, o problema da fragmentação antes que ela ocorra. O sistema possuí uma lista de áreas livres (free list), com o endereço e tamanho de cada uma delas. * Best-fit • Escolhe a melhor partição (best-fit), ou seja, aquela em que o programa deixa o menor espaço sem utilização. A lista de áreas livres está ordenada por tamanho, diminuindo o tempo de busca por uma área desocupada. Como é alocada a partição que deixa a menor área livre, a tendência é que cada vez mais a memória fique com pequenas áreas não contíguas, aumentando o problema da fragmentação. * Worst-fit • Escolhe a pior partição (worst-fit), ou seja, aquela em que o programa deixa o maior espaço sem utilização. Deixa espaços livres maiores, que permitem a um maiores número de programas utilizar a memória diminuindo o problema da fragmentação. * First-fit • Escolhe a primeira partição (first-fit) livre, de tamanho suficiente para carregar o programa. • A lista de áreas livres está ordenada por endereços crescentemente. Como o método tenta primeiro utilizar as áreas livres de endereços mais baixos, existe uma grande chance de se obter uma grande partição livre nos endereços de memória mais altos. Das três, a first-fit é a mais rápida, consumindo menos recursos do sistema. Swapping Mesmo com o aumento da eficiência da multiprogramação e, particularmente, da gerência de memória, muitas vezes um programa não podia ser executado por falta de uma partição livre disponível. A técnica swapping veio tentar resolver o problema da insuficiência de memória para todos os usuários. Em todos os esquemas apresentados anteriormente, um programa permanecia na memória principal até o final da sua execução. O sistema escolhe um programa residente, que é levado da memória para o disco (swap out), retornando posteriormente para a memória principal (swap in), como se nada tivesse ocorrido. Um dos problemas gerados pelo swapping é a relocação dos programas. O loader relocável permite que um programa seja colocado em qualquer posição de memória, porém a relocação é realizada no momento do carregamento. No caso de um programa que saia e volte muitas vezes para a memória, é necessário que a relocação seja realizada pelo loader de cada carregamento. Torna o mecanismo ineficiente em função do tempo gasto para o carregamento. A melhor solução para este problema é uma implementação do hardware dos computadores, para permitir que a relocação seja realizada durante a execução do programa. Esse tipo de mecanismo é denominado relocação dinâmica (Guimarães –1). A relocação dinâmica é realizada através de um registrador especial denominado registrador de relocação. No momento em que o programa é carregado na memória, o registrador recebe o endereço inicial de memória que o programa irá ocupar. A relocação dinâmica é essencial para a implementação de um sistema multiprogramável. O conceito swapping permitiu um maior compartilhamento da memória e, conseqüentemente, um maior throughput. Memória Virtual • Memória Virtual (virtual memory) é a 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 ilusão de existir uma memória principal. 6 • O conceito de memória virtual está baseado em desvincular o endereçamento feito pelo programa dos endereços físicos da memória principal. • Os programas e suas estruturas de dados deixam de estar limitados ao tamanho da memória física disponível. Espaço de Endereçamento Virtual • Um programa no ambiente de memória virtual não faz referência a endereços físicos de memória (endereços reais) , mas apenas a endereços virtuais. • No momento da execução de uma instrução, o endereço virtual é traduzido para um endereço físico, pois o processador acessa apenas posições da memória principal. • O mecanismo de tradução do endereço virtual para endereço físico é denominado mapeamento. • O conjunto de endereços virtuais que os processos podem endereçar é chamado espaço de endereçamento virtual. Analogamente, o conjunto de endereços reais é chamado espaço de endereçamento real. • O espaço de endereçamento virtual não tem nenhuma relação direta com os endereços no espaço real. • Um programa pode fazer referência a endereços virtuais que estejam fora dos limites do espaço real, ou • • • • seja, os programas e suas estruturas de dados não estão mais limitados ao tamanho da memória física disponível. Os programas podem ser muito maiores que a memória física, apenas parte deles pode estar residente na memória em um determinado instante. O sistema operacional utiliza a memória secundária como extensão da memória principal. Quando o usuário desenvolve suas aplicações, ele ignora a existência dos endereços virtuais. Os compiladores linkers se encarregam de gerar o código executável em função desses endereços, e o sistema operacional cuida dos detalhes de sua execução. Mapeamento • Deve existir um mecanismo que transforme os endereços virtuais em endereços reais. • Mapeamento permite ao sistema operacional traduzir um endereço localizado no espaço virtual para um no • • • • • • • • • • • • • espaço real. Como conseqüência do mapeamento, um programa não precisa estar necessariamente contíguo na memória real para ser executado Nos sistemas atuais, a tarefa de tradução é realizada por hardware, juntamente com o sistema operacional, de forma a não comprometer seu desempenho e torná-lo transparente a usuários e suas aplicações. Como a maioria das aplicações tende a fazer referência a um reduzido número de páginas, somente uma pequena fração da tabela de páginas é realmente necessária. Com base nesta realidade, foi introduzido um hardware especial para mapear endereços virtuais para endereços físicos sem a necessidade de acesso à tabela de páginas, chamando memória associativa ou translation lookside buffer. Cada processo tem o mesmo espaço de endereçamento virtual, como se possuísse sua própria memória virtual. O mecanismo de tradução se encarrega, então, de manter tabelas de mapeamento exclusivas para cada processo, relacionando os endereços virtuais do processo às suas posições na memória física. Quando um programa está sendo executado, o sistema, para realizar a tradução, utiliza a tabela de mapeamento do processo no qual o programa executa. Se um outro programa vai ser executado no contexto de outro processo, o sistema deve passar a referenciar a tabela do novo processo. Isso é realizado através de um registrador, que indica a posição inicial da tabela de mapeamento, onde, toda vez que há mudança de contexto, o registrador é atualizado com o endereço da nova tabela. Caso o mapeamento fosse realizado para cada célula na memória principal, o espaço ocupado pelas tabelas seria tão grande quanto o espaço de endereçamento virtual de cada processo, o que inviabilizaria a implementação do mecanismo de memória virtual. As tabelas mapeiam blocos de informações, cujo tamanho determina o número de entradas existentes nas tabelas de mapeamento. Quanto maior o bloco, menos entradas nas tabelas de mapeamento. Blocos maiores aumentam o tempo de transferência do bloco entre a memória secundária e a principal. Paginação 7 • Paginação é a técnica de gerência de memória onde o espaço de endereçamento virtual e o espaço de • • • • • • • • • • • • • • • • • • • endereçamento real são divididos em blocos do mesmo tamanho, chamados páginas. As páginas no espaço virtual são denominadas páginas virtuais, as páginas no espaço real são chamadas de páginas reais ou frames (molduras). Todo o mapeamento é realizado em nível de página, através de tabelas de páginas. Cada página virtual do processo possui uma entrada na tabela (entrada na tabela de ‘páginas - ETP), com informações de mapeamento que permitem ao sistema localizar a página real correspondente. Quando um programa é executado, as páginas virtuais são transferidas da memória secundária para a memória principal e colocadas em frames. Sempre que o programa fizer referência a um endereço virtual, o mecanismo de mapeamento localizará, na ETP da tabela do processo, o endereço físico do frame. O endereço virtual é formado pelo número da página virtual (NPV) e um deslocamento dentro da página. O NPV identifica, unicamente, uma página virtual na tabela de páginas (ETP) O deslocamento funciona como seu índice. O endereço físico é calculado, então, somando-se o endereço do frame localizado na tabela de páginas com o deslocamento contido no endereço virtual. A EPT possui outras informações, entre elas o bit de validade, que indica se uma página está ou não na memória física (valid bit). Se o bit tem o valo 0, indica que a página virtual não está na memória principal, enquanto, se for igual a 1, a página está localizada na memória. Sempre que o processo faz referência a um endereço virtual, o sistema verifica, através do bit de validade, se a página que contém o endereço referenciado está ou não na memória principal. Caso não esteja, o sistema tem de transferir a página da memória secundária para a memória física. Toda vez que o sistema é solicitado para isso, dizemos que ocorreu um page fault (falha de página). As páginas dos processos são transferidas da memória secundária para a principal apenas quando são referenciadas. Este mecanismo é chamado paginação por demanda (demand paging) e é conveniente, na medida em que leva para a memória principal apenas as páginas realmente necessárias à execução do programa. Existe uma tendência de os sistemas passarem a utilizar a técnica de paginação antecipada (antecipatory paging). O sistema tenta prever as páginas que serão à execução do programa, trazendo-as para a memória antecipadamente. No caso de o sistema errar nessa previsão, terá perdido tempo de processador e ocupado memória desnecessariamente. Working Set O mecanismo de memória virtual apesar de suas vantagens, introduz um grande problema. • Sempre que um processo faz referência a uma de suas páginas e esta não se encontra na memória (page fault), exige do sistema operacional pelo menos uma operação de E/S, que, quando possível, deve ser evitada. • A taxa de page faults gerada por um programa depende de como a aplicação foi desenvolvida, além da política de gerência de memória implementada pelo sistema operacional. • Qualquer sistema que implementa paginação deve se preocupar em manter na memória principal um certo número de páginas que reduza ao máximo a taxa de paginação dos processos, ao mesmo tempo que não prejudique os demais processos que desejam ter acesso à memória. • O conceito de working set surgiu a partir da análise da taxa de paginação dos processos. • Quando um programa começa a ser executado, percebe-se uma elevada taxa de page faults, que se estabiliza com o decorrer da sua execução. • Este fato está ligado diretamente a um outro conceito-chave na estratégia d gerência de memória chamado localidade. • Localidade é a tendência que existe em um programa de fazer referências a posições de memória de forma que uniforme, ou seja, a instruções próximas. • Um processo tenderá a concentrar suas referências em um mesmo conjunto de páginas durante determinado período de tempo. • Por exemplo, um loop cujo código ocupe três páginas, a tendência de essas três páginas serem referenciadas novamente é muito grande. • A localidade está relacionada com a forma que a aplicação foi escrita. • Normalmente, se um programa foi desenvolvido utilizando técnicas estruturadas, o conceito de localidade quase sempre é válido. 8 • Não existe nenhuma ferramenta que permita prever mais as próximas páginas que a aplicação irá referenciar. • Working set de um processo é o conjunto de páginas referenciadas por ele durante determinado intervalo de tempo. • O working set é o conjunto de páginas constantemente referenciadas pelo processo, devendo permanecer • • • • • • • • • na memória principal para que execute de forma eficiente. Quando um processo é criado, todas as suas páginas estão na memória secundária. À medida que acontecem referências às páginas virtuais, elas são transferidas para o working set do processo na memória principal (page in). Sempre que um processo faz referência a uma página, o sistema verifica se a página já se encontra no working set do processo. Caso a página não se encontre no working set, ocorrerá o page fault. O gráfico mostra como a taxa de paginação, ou seja, o número page faults por unidade de tempo, varia conforme a execução de um programa. O working set do processo deve ter um limite máximo de páginas permitidas Quanto maior o working set, menor a chance de ocorrer uma referência a uma página que não esteja na memória principal (page fault). Como os working sets dos processos ocuparão mais memória, um número menor de processos poderá estar compartilhando a memória principal. Outro fato que se pode observar é a existência de um ponto onde o aumento do working set do processo não implica diminuição significativa na taxa de paginação. Realocação de Páginas • O maior problema na gerência de memória virtual por paginação não é decidir que página carregar para a • • • • • • • • memória, mais quais páginas remover. Quando o limite do working set de um processo é alcançado, e este necessita de novos frames, o sistema operacional deve intervir e escolher, entre as diversas páginas do seu working set, quais as páginas que devem ser liberadas. Qualquer estratégia de realocação de páginas deve considerar se uma página foi ou não modificada, antes de liberá-la para outro processo. Caso contrário, possíveis dados armazenados na página serão perdidos. Sempre que o sistema liberar uma página desse tipo, ele antes deverá gravá-la na memória secundária (page out), preservando seu conteúdo. O sistema mantém um arquivo de paginação (page file) onde as páginas modificadas são armazenadas. Sempre que uma destas páginas for novamente referenciada, ela será trazida novamente para o working set do processo (page in). O sistema consegue implementar esse mecanismo através do bit de modificação (dirty ou modify bit), que exige na entrada de cada tabela de páginas. Sempre que uma página é alterada, o valor do bit de modificação é alterado de 0 para 1, indicando que a página foi modificada. Principais Estratégias adotadas pelos Sistemas Operacionais para a Realocação de Páginas *Aleatória • Não utiliza critério algum de seleção. • Todas as páginas do working set têm a mesma chance de ser selecionadas, inclusive as páginas que são • freqüentemente referenciadas. Apesar de ser uma estratégia que consome poucos recursos do sistema, é raramente utilizada. * First-In-First-Out (FIFO) • A página que primeiro foi utilizada (first-in) será a primeira a ser escolhida (first-out). • Sua implementação é bastante simples, sendo necessária apenas uma fila , onde as páginas mais antigas estão no início da fila e as mais recentes no final. • Caso uma página seja constantemente referenciada, como é o caso de páginas de utilitários do sistema, o fator tempo se torna irrelevante, e o sistema tem de fazer retornar a mesma página várias vezes. *Least-Recently-Used (NRU) • Seleciona a página utilizada menos recentemente (least-recently-used). 9 • A página que está a mais tempo de ser referenciada. • Apesar de ser uma boa estratégia, é pouco implementada devido ao grande overhead causado pela atualização, em cada página referenciada, do momento do último acesso, além do algoritmo de busca dessas páginas. *Not-Recently-Used (NRU) • A escolha da página que não foi recentemente utilizada (not-recently-used) é bastante semelhante ao esquema LRU. • Existe um flag, que permite ao sistema a implementação do algoritmo. • O flag de referência indica quando a página foi referenciada ou não, e está associado a cada entrada na • • • tabela de páginas. Inicialmente, todas as páginas estão com o flag indicando que não foram referenciadas (0). À medida que as páginas são referenciadas, o flag associado a cada página é modificado pelo hardware (1). Depois de um certo tempo, é possível saber quais páginas foram referenciadas ou não. *Least-Frequently-Used (LFU) • A página menos referenciada, ou seja, a menos freqüentemente utilizada (least-frequently-used) será a • • • • página escolhida. É mantido um contador do número de referência feitas às páginas. A página que tiver o contador com o menor número de referências será a página escolhida. O algoritmo privilegia, ou seja, mantém na memória, as páginas que são bastante utilizadas. Porém, as páginas que entrarem mais recentemente no working set serão, justamente, aquelas que estarão com os contadores com menos valor. Tamanho de Página • O problema da fragmentação também existe em sistemas com paginação, só que em menor escala, se comparada com a de outras organizações já apresentadas. • O programa ocupa quase que integralmente todas as páginas. • A fragmentação só é encontrada, realmente, na última página, quando o código não a ocupa por completo. • A maior ou menor fragmentação é conseqüência do tamanho da página que, também tem influência em outros fatores. • Páginas pequenas, necessitam tabelas de mapeamento maiores, provocam maior taxa de paginação e, • • conseqüentemente, aumentam o número de acessos à memória secundária, gerando, porém, menor fragmentação. O tamanho da página está associado ao hardware e varia de sistema para sistema. A maioria dos estudos em relação ao tamanho ideal de página indica páginas de tamanho pequeno. Segmentação Segmentação é a técnica de gerência de memória, onde os programas são divididos logicamente em subrotinas e estruturas de dados e colocados em blocos de informações na memória. • Os blocos têm tamanhos diferentes s são chamados segmentos, cada um com seu próprio espaço de endereçamento. • A grande diferença entre a paginação e a segmentação é que, enquanto a primeira divide o programa em partes de tamanho fixo, sem qualquer ligação com a estrutura do programa, a segmentação permite uma relação entre a lógica do programa e sua divisão na memória. • O mecanismo de mapeamento é muito semelhante ao de paginação. • Os segmentos são mapeados através de tabelas de mapeamento de segmento (TMS), e os endereços são compostos pelo número do segmento e um deslocamento dentro do segmento. • O número de segmento identifica unicamente uma entrada na tabela de segmentos (ETS), onde estão as informações sobre o segmento na memória real. • O endereço absoluto é calculado a partir do endereço inicial do segmento mais o deslocamento dentro do segmento. • Além do endereço do segmento na memória física, cada entrada na tabela de segmentos possui informações sobre o tamanho do segmento, se ele está ou não na memória e sua proteção. • O sistema operacional mantém uma tabela com áreas livres e ocupadas da memória. 10 • Quando um novo processo é carregado para a memória, o sistema localiza um espaço livre que o acomode. • As estratégias para escolha da área livre podem ser as mesmas utilizadas no item Alocação Particionada • • • • • Dinâmica, ou seja, best-fit, worst-fit ou first-fit. Na segmentação, apenas os segmentos referenciados são transferidos da memória secundária para a memória real. Logo, para serem mais eficientes, os programas devem estar bem modularizados. Se as aplicações não estiverem divididas em módulos, grandes pedaços de código estarão na memória desnecessariamente, não permitindo que outros usuários, também, utilizem a memória. O problema da fragmentação também ocorre nesse modelo, quando as áreas livres são tão pequenas, que não acomodam nenhum segmento que necessite ser carregado. Um outro problema é sua complexidade, pois o sistema deve manter tabelas de segmentos que variam de acordo com o número de segmentos. Segmentação Paginada • Sistemas que implementam segmentação paginada permitem a divisão lógica dos programas em • • • • segmentos e, por sua vez, cada segmento é dividido, fisicamente, em páginas. Nesse sistema, um endereço é formado pelo número do segmento, um número de página dentro desse segmento e um deslocamento dentro dessa página. Através do número do segmento, obtém-se uma entrada na tabela de segmentos, que contém informações na tabela de páginas do segmento. Com o número da página obtém-se uma entrada na tabela de páginas com informações da página na memória física. O endereçamento físico é obtido somando-se a posição inicial do frame e o deslocamento. Proteção • Em qualquer sistema multiprogramável, deve existir um mecanismo que proteja o espaço de memória de cada processo e, principalmente, a área do sistema operacional. • No esquema de memória virtual, cada processo tem sua tabela de mapeamento, e a tradução dos endereços é realizada pelo sistema. • Assim, é impossível que um processo tenha acesso a áreas de memória de outros processos, amenos que • • • • • • • haja compartilhamento explícito de páginas/segmentos. A proteção é necessária para impedir que um processo, ao acessar uma página/segmento do sistema, a modifique ou mesmo tenha acesso a ela. Mesmo as páginas/segmentos do processo podem estar definidas, por exemplo, com uma proteção que impeça a gravação, como é o caso de páginas/segmentos de código executável. Em sistemas que implementam paginação e/ou segmentação, a proteção deve ser realizada em nível de cada página/segmento na memória. Esse mecanismo é implementado utilizando-se as entradas das tabelas de mapeamento, onde alguns bits especificam os acessos permitidos a cada uma das páginas/segmentos Definiremos dois tipos de acessos básicos realizados em uma página/segmento: leitura e gravação. O acesso à leitura (read) permite a leitura da página/segmento, enquanto o de gravação (write), a sua alteração. Os dois tipos de acessos combinados produzem um mecanismo de proteção simples e eficiente, permitindo desde o total à página/segmento, passando por acessos intermediários, até a falta completa de acesso. Compartilhamento de Memória • Em sistemas multiprogramáveis, é comum usuários utilizarem certos programas simultaneamente (código reentrante). • Em sistemas que implementam memória virtual, é bastante simples o compartilhamento de código e dados entre vários processos. • Basta que as entradas das tabelas de páginas/segmentos apontem para as mesmas páginas/segmentos na • • memória principal. A vantagem da segmentação em relação à paginação, no aspecto de compartilhamento, baseia-se na forma em que os programas são divididos. Enquanto o mapeamento de um vetor necessita de várias entradas na tabela de páginas, na tabela de segmentos é necessária apenas uma única entrada. Swapping em Memória Virtual 11 • O conceito de swapping continua válido quando aplicado à memória virtual. • Quando existem novos processos que desejam ser processados e não existe memória real suficiente, o • • sistema seleciona um ou mais processos que deverão sair da memória para ceder espaço aos novos processos. Há vários critérios que podem ser aplicados na escolha do(s) processo(s) que deve(m) sair da memória. Os mais utilizados são a prioridade e o estado do processo. • O critério de estado seleciona os processos que estão no estado de espera, ou seja, aguardando por algum evento. • O critério de prioridade escolhe, entre os processos, os d menor prioridade de execução. Thrashing • Thrashing pode ser definido como sendo a excessiva transferência de páginas/segmentos entre a memória principal e a memória secundária. • Esse problema se aplica tanto a sistemas que implementam paginação como segmentação. • Na paginação, o thrashing ocorre em dois níveis: em nível do próprio processo e em nível do sistema. • Em nível do processo, a excessiva paginação ocorre devido ao elevado número de page faults, gerado pelo programa em execução. • Existem dois motivos que levam um processo a sofrer esse tipo de thrashing . • O primeiro é o mau dimensionamento no tamanho do working set de um processo, pequeno demais para • • • • • • • • • • • acomodar as páginas constantemente referenciadas por ele. Nesse caso, basta aumentar-se o tamanho do working set do processo. O segundo é a não obediência do conceito de localidade, ou seja, o programa faz referência a comandos/dados localizados em páginas fora do working set do processo. Nesse caso, o problema é de programação, e a aplicação deverá ser reescrita. Em nível do sistema, o thrashing ocorre quando existem mais processos competindo por memória que espaço disponível. O sistema tenta admitir a memória de forma que todos os processos sejam atendidos. O primeiro passo é a redução do tamanho dos working sets dos processos, porém, como já analisamos, esse mecanismo leva ao thrashing em nível do processo. Caso a redução do working set não seja suficiente, o sistema começa o trabalho de swapping, tirando e trazendo processos da memória principal para a memória secundária. Se esse mecanismo for levado ao extremo, o sistema passará mais tempo fazendo swapping que executando os processos. O thrashing em sistemas que implementam segmentação também ocorre em dois níveis. Em nível do processo, a transferência de segmentos é excessiva devido a modularização extrema do programa, não seguindo o conceito de localidade. Em nível do sistema, o thrashing em segmentação é bastante semelhante ao da paginação com a ocorrência de swapping. Sistema de Arquivos Introdução • O armazenamento e a recuperação de informações são atividades essenciais para qualquer tipo de aplicação. • Um processo deve ser capaz de ler e gravar grande volume de dados em dispositivos como fitas ou discos de forma permanente, além de poder compartilhá-los com outros processos. • Os arquivos são gerenciados pelo sistema operacional de modo a facilitar o acesso dos usuários ao seu conteúdo. • A parte do sistema responsável por sua gerência é denominada sistema de arquivos. • A manipulação de arquivos é uma atividade freqüentemente realizada pelos usuários, devendo sempre ocorrer de maneira uniforme, independentemente dos diferentes dispositivos de armazenamento. Arquivos • Um arquivo é constituído de informações logicamente relacionadas, podendo representar programas ou dados. 12 • Um arquivo pode ser entendido como um conjunto de registros definidos pelo sistema de arquivos. • Arquivos podem ser armazenados pelo sistema operacional em diferentes dispositivos físicos, como fitas • • • • magnéticas, discos magnéticos e discos ópticos. O tipo de dispositivo no qual o arquivo é armazenado deve ser isolado pelo sistema operacional, de forma que exista uma independência entre os arquivos a serem manipulados e o meio de armazenamento. Um arquivo é identificado por meio de nome, formando uma seqüência de caracteres. Em alguns sistemas de arquivos é feita distinção entre caracteres alfabéticos maiúsculos e minúsculos. Regras como extensão máxima do nome e quais são os caracteres válidos também podem variar. Organização de Arquivos • • • • • • • • • • • • A organização de arquivos consiste no modo como os seus dados estão internamente armazenados. A estrutura dos dados pode variar em função do tipo de informação contida no arquivo. Arquivos-textos possuem propósitos completamente distintos de arquivos executáveis. No momento da criação de um arquivo, é possível definir que organização será adotada. Esta organização pode ser uma estrutura suportada pelo sistema operacional ou definida pela própria aplicação. A forma mais simples de organização de arquivos é através de uma seqüência não-estruturada de bytes. O sistema de arquivos não impõe nenhuma lógica para os dados. A aplicação deve definir toda a organização, estando livre para estabelecer seus próprios critérios. A grande vantagem desse modelo é a flexibilidade para cria diferentes estruturas de dados, porém todo o controle de acesso ao arquivo é de inteira responsabilidade da aplicação. Alguns sistemas operacionais estabelecem diferentes organizações de arquivos. Neste caso, cada arquivo criado deve seguir um modelo suportado pelo sistema de arquivos. As organizações mais conhecidas e implementadas são a seqüencial, relativa e indexada. Nesses tipos de organização, podemos visualizar um arquivo como um conjunto de registros. • Quando definidos sempre com o mesmo tamanho, tais registros são ditos registros de tamanho fixo, e caso contrário, são chamados de registros de tamanho variável. Métodos de Acesso • Inicialmente, os primeiros sistemas operacionais só armazenavam arquivos em fitas magnéticas. • Com isso, o acesso era restrito à leitura dos registros na ordem em que eram gravados, sendo a gravação de novos registros possível apenas no final do arquivo. • Esse tipo de acesso, chamado de seqüencial. • Com discos magnéticos, foram introduzidos métodos de acesso mais eficientes. • O primeiro a surgir foi o acesso direto,que permite a leitura/gravação de um registro diretamente na sua • • • • • • • • posição. Esse método é realizado através do número do registro, que é a sua posição relativa ao início do arquivo. O aceso direto somente é possível quando o arquivo é definido com registros de tamanho fixo. O acesso direto pode ser combinado com o acesso seqüencial. Com isso é possível acessar diretamente um registro qualquer de um arquivo e, a partir deste, acessar seqüencialmente os demais. Um método de acesso mais sofisticado, que tem como base o acesso direto, é o chamado acesso indexado ou acesso por chave. O arquivo deve possuir uma área de índice onde existam ponteiros para os diversos registros. Sempre que a aplicação desejar acessar um registro, deverá ser especificada uma chave através da qual o sistema pesquisará, na área de índice, o ponteiro correspondente. A partir desta informação, realiza-se um acesso direto ao registro desejado. Operações de Entrada/Saída • O sistema de arquivos oferece um conjunto de system calls que permite às aplicações realizar operações de • E/S, como tradução de nomes em endereços, leitura e gravação de dados e criação/eliminação de arquivos. Na realidade, as system calls de E/S têm como função oferecer uma interface simples e uniforme entre a aplicação e os diversos dispositivos. Operações de Entrada Atributos 13 • Cada arquivo possui informações de controle denominadas atributos. • Dependendo do sistema de arquivos, os atributos variam, porém alguns, como tamanho do arquivo, proteção, identificação do criador e data de criação, estão presentes em quase todos os sistemas. • Alguns atributos especificados na criação do arquivo não podem ser modificados em função de sua • • • própria natureza, como organização e data/hora de criação. Outros são alterados pelo próprio sistema operacional, como tamanho e data/hora do último backup realizado. Existem ainda atributos que podem ser modificados pelo próprio usuário, como proteção do arquivo, tamanho máximo e senha de acesso. Na tabela são apresentados os principais atributos presentes nos sistemas de arquivos. Atributos de Arquivos Diretórios • A estrutura dos diretórios é o modo como o sistema organiza logicamente os diversos arquivos contidos em um disco. • O diretório é uma estrutura de dados que contém entradas associadas aos arquivos onde são armazenadas informações como localização física, nome, organização e demais atributos. • Quando um arquivo é aberto, o sistema operacional procura a sua entrada na estrutura de diretórios, armazenando informações sobre atributos e localização do arquivo em uma tabela mantida na memória principal. • Esta tabela contém todos os arquivos abertos, sendo fundamental para aumentar o desempenho das operações com arquivos. • É importante que ao término do uso de arquivos, este seja fechado, ou seja, que se libere o espaço na tabela de arquivos abertos. • A implementação mais de uma estrutura de diretórios é chamada de nível único (single-level directory). • Existe apenas um único diretório contendo todos os arquivos do disco • Este modelo é bastante limitado, já que não permite que usuários criem arquivos com o mesmo nome. • Como o sistema de nível único é bastante limitado, foi implementada uma estrutura onde, para cada usuário, existiria um diretório particular denominado User File Directory (UFD). • Com esta implementação, cada usuário poderia criar arquivos com qualquer nome, sem a preocupação de conhecer os demais arquivos do disco. • Para que o sistema possa localizar arquivos nesta estrutura, deve haver um nível de diretório adicional para controlar os diretórios individuais dos usuários. • Este nível, denominado Master File Directory (MFD), é indexado pelo nome do usuário e,nele, cada entrada aponta para o diretório pessoal. • A estrutura de diretórios com dois níveis é analógica a uma estrutura de dados em árvore, onde o MDF é a raiz, os galhos são os UFD e os arquivos são as folhas. • Nesse tipo de estrutura, quando se referencia a um arquivo, é necessário especificar o seu nome, bem como o diretório onde ele se encontra. • A extensão do modelo de dois níveis para um de múltiplos níveis permitiu que os arquivos fossem logicamente mais bem organizados. • Este novo modelo, chamado estrutura de diretórios em árvore (treestructure directory), é atualmente adotado pela maioria dos sistemas operacionais. • Na estrutura em árvore, é possível ao usuário criar quantos diretórios desejar, podendo um diretório conter arquivos ou outros diretórios. • Cada arquivo, nesta estrutura, possui um path único que descreve todos os diretórios desde a raiz (MFD) até o diretório no qual o arquivo está ligado. • Na maioria dos sistemas, os diretórios também são tratados como arquivos, possuindo identificação e atributos, como proteção, identificação do criador e data de criação. Alocação de Espaço em Disco • A criação de arquivos em disco exige que o sistema operacional tenha o controle de quais áreas ou blocos estão livres. • Este controle é realizado através de uma estrutura de dados que armazenam informações que possibilitam ao sistema de arquivos gerenciar o espaço livre do disco. • Nesta estrutura é possível identificar blocos livres que poderão ser alocados para um novo arquivo. • A forma mais simples de implementar uma estrutura de espaços livres é através de uma tabela denominada mapa de bits (bit map). 14 • Cada entrada de tabela é associada a um bloco do disco representado por um bit, que pode assumir valor igual a 0 (indicando bloco livre) ou 1 (indicando bloco alocado). • O principal problema é um excessivo gasto de memória, já que para cada bloco do disco deve existir uma entrada na tabela. • Uma segunda maneira de realizar este controle é por meio da ligação encadeada de todos os blocos livres • • • • • • do disco. Cada bloco possui uma área reservada para armazenamento do endereço do próximo bloco.. A partir do primeiro bloco livre pode-se ter acesso seqüencial aos demais de forma encadeada . Este esquema representa algumas restrições se considerarmos que, além do espaço utilizado no bloco com informação de controle, o algoritmo de busca de espaço livre sempre deve realizar uma pesquisa seqüencial na lista. Uma outra solução leva em conta que blocos contíguos são geralmente alocados ou liberados simultaneamente. Podemos enxergar o disco como um conjunto de segmento de blocos livres. É possível manter uma tabela com o endereço do primeiro bloco de cada segmento e o número de blocos livres contíguos que se seguem. Técnicas de Alocação de Espaço Alocação Contígua • Consiste em armazenar um arquivo em blocos seqüencialmente dispostos no disco. • O sistema localiza um arquivo através do endereço do primeiro bloco e da sua extensão em blocos. • O acesso a arquivos dispostos contiguamente no disco é bastante simples tanto para a forma seqüencial quanto para a direta. • Principal problema é a locação de espaço livre para novos arquivos. • Caso um arquivo deva ser criado com n blocos, é necessário que exista uma cadeia de n blocos dispostos seqüencialmente no disco. • No momento em que o sistema operacional deseja alocar espaço para armazenar um novo arquivo, pode existir mais de um segmento livre disponível com o tamanho exigido. • É necessário que alguma estratégia de alocação seja adotada para selecionar qual o segmento na lista de blocos livres deve ser escolhido. *First-fit • O primeiro segmento livre com tamanho suficiente para alocar o arquivo é selecionado. • A busca na lista é seqüencial, sendo interrompida tão logo se localize um segmento de tamanho adequado. *Best-fit • Seleciona o menor segmento livre disponível com tamanho suficiente para armazenar o arquivo. • A busca em toda a lista se faz necessária para a seleção do segmento, a não ser que a lista esteja ordenada por tamanho. * Worst-fit • • • • • • • • • O maior segmento é alocado. Mais uma vez a busca em toda a lista se faz necessária, a menos que exista uma ordenação por tamanho. A alocação contígua apresenta um problema chamado fragmentação dos espaços livres. Como os arquivos são criados e eliminados freqüentemente, os segmentos livres vão se fragmentando em pequenos pedaços por todo o disco. O problema pode tornar-se crítico quando um disco possui blocos livres disponíveis, porém não existe u segmento contíguo em que o arquivo possa ser alocado. O problema da fragmentação pode ser contornado através de rotinas que reorganizem todos os arquivos no disco de maneira que só exista um único segmento de blocos livres. Este procedimento, denominado defragmentação, geralmente utiliza uma área de trabalho no próprio disco ou em fita magnética. Existe um grande consumo de tempo nesse tipo de operação. A alocação contígua apresenta alguns inconvenientes, sendo o principal problema a determinação do espaço em disco necessário a um arquivo. 15 • Nem sempre no momento da criação de um arquivo é possível determinar qual o seu tamanho em definitivo, podendo posteriormente existir a necessidade de extensão. • A pré-locação de espaço é uma solução que, apesar de resolver o problema, pode ocasionar que parte do espaço alocada permaneça ociosa por um longo período de tempo. Alocação Encadeada • Um arquivo pode ser organizado como um conjunto de blocos ligados logicamente no disco, independentemente da sua localização física. • Cada bloco deve possuir um ponteiro para o bloco seguinte do arquivo e assim sucessivamente. • A fragmentação dos espaços livres, não ocasiona nenhum problema na alocação encadeada, pois os blocos • livres alocados para um arquivo não precisam necessariamente estar contíguos. Ocorre a fragmentação de arquivos, que é a quebra do arquivo em diversos pedaços denominados extents. • A fragmentação resulta no aumento do tempo de acesso aos arquivos, pois o mecanismo de leitura/gravação do disco deve se deslocar diversas vezes sob sua superfície para acessar cada extent. • Para otimizar o tempo das operações de E/S nesse tipo de sistema, é importante que o disco seja periodicamente desfragmentado. • O procedimento de desfragmentação é idêntico ao já apresentado na alocação contígua. • A alocação encadeada só permite que se realize acesso seqüencial aos blocos dos arquivos. • Isto constitui uma das principais desvantagens dessa técnica, já que não é possível o acesso direto aos blocos. • Essa técnica desperdiça espaço nos blocos com o armazenamento de ponteiros. Alocação Indexada • A alocação indexada soluciona uma das principais limitações da alocação encadeada, que é a impossibilidade do acesso direto aos blocos dos arquivos. • O princípio desta técnica é manter os ponteiros de todos os blocos do arquivo em uma única estrutura denominada blocos de índice. • A alocação indexada, não utiliza informações de controle nos blocos de dados como existente na alocação encadeada. Proteção de Acesso • Considerando que os meios de armazenamento são compartilhados entre diversos usuários, é de • • • fundamental importância que mecanismos de proteção sejam implementados para garantir a proteção individual de arquivos e diretórios. Qualquer sistema de arquivos deve possuir mecanismos próprios para proteger o acesso ás informações gravadas em discos e fitas, além de possibilitar o compartilhamento de arquivos entre usuários, quando desejado. E geral, o tipo de acesso a arquivos é implementado mediante a concessão ou não dos diferentes acessos que podem ser realizados, como leitura (read), gravação (write), execução (execute) e eliminação (delete). Existem diferentes mecanismos e níveis de proteção. Senha de Acesso • O controle de acesso se resume ao usuário ter o conhecimento da senha e, conseqüentemente, ter a • • • liberação do acesso ao arquivo concedida pelo sistema. Como cada arquivo possui apenas uma senha, o acesso é liberado ou não na sua totalidade. Não é possível determinar quais tipos de operação podem ou não ser concedidas. Outra desvantagem desse método é a dificuldade de compartilhamento de arquivos, pois além do dono do arquivo todos os demais usuários teriam que conhecer a senha de acesso. Grupos de Usuários • A proteção baseada em grupos de usuários é implementada por diversos sistemas operacionais. • Tem como princípio a associação de cada usuário do sistema a um grupo. 16 • Os grupos de usuários são organizados logicamente com o objetivo de compartilhar arquivos e diretórios, sendo que os usuários que desejam compartilhar arquivos entre si devem pertencer a um mesmo grupo. • Esse mecanismo implementa três níveis de proteção ao arquivo: owner (dono), group (grupo) e all (todos). • Na criação do arquivo, o usuário especifica se o arquivo deve ser acessado somente pelo seu criador, pelos • usuários do grupo ao qual ele pertence ou por todos os usuários do sistema. É necessário associar o tipo de acesso (leitura, escrita, execução e eliminação) aos tr6es níveis de proteção. Lista de Controle de acesso • Consiste de uma lista associada a cada arquivo, onde são especificados quais os usuários e os tipos de • • • • acesso permitidos. Quando um usuário tenta acessar um arquivo, o sistema operacional verifica se a lista de controle autoriza a operação desejada. O tamanho dessa estrutura de dados pode ser bastante extenso se considerarmos que um arquivo pode ter seu acesso compartilhado por diversos usuários. Além deste fato, existe um overhead adicional, se comparado com o mecanismo de proteção por grupos de usuários, devido à pesquisa seqüencial que o sistema deverá realizar na lista sempre que um acesso for solicitado. Em determinados sistemas de arquivos é possível encontrar tanto o mecanismo de proteção por grupos de usuários quanto o de lista de controle de acesso, oferecendo, desta forma, uma maior flexibilidade ao mecanismo de proteção de arquivos e diretórios. Implementação de Caches • O acesso a disco é bastante lento se comparado ao acesso à memória principal. • Este é o principal fator para as operações de E/S com discos serem um problema para o desempenho do • • • • • • sistema. Com o objetivo de minimizar este problema, a maioria dos sistemas de arquivos implementa uma técnica denominada buffer cache. O sistema operacional reserva uma área da memória para que se tornem disponíveis caches utilizados em operações de acesso ao disco. Quando uma operação é realizada, seja leitura ou gravação, o sistema verifica se a informação desejada se encontra no buffer cache. Em caso positivo, não é necessário a acesso ao disco. Caso o bloco requisitado não se encontre no cache, a operação de E/S é realizada e o cache é atualizado. Como existe uma limitação no tamanho do cache, cada sistema adota políticas para substituição de blocos, como o FIFO (First in First out) ou a LRU (least Recently Used). • No caso de blocos de dados permanecerem por um longo período de tempo na memória principal, a • • ocorrência de problemas de energia pode ocasionar a perda de tarefas já realizadas e consideradas já salvas em disco. O sistema operacional possui uma rotina que executa periodicamente em um intervalo de tempo, atualizando em disco todos os blocos modificados do cache. Uma segunda alternativa é toda vez que um bloco do cache for modificado, realizar imediatamente uma atualização no disco (write-through caches). Gerenciamento do Processador Processador: Executa programas. Processo: Execução de um PGM com os seus dados. “Job”: Requisição para a criação de um ou mais processos. Solicitação ao S.º para a posterior execução do programa. Dois Tipos de Processos: • Foreground: Vanguarda, resposta imediata - On-line • Background: Retaguarda (Batch), não são executados agora, somente quando tempo, baixa prioridade. Processadores Reais e Virtuais Processamento Virtual: Cria uma ilusão de que cada processo ocupa o processador independentemente dos demais, ou a ilusão de que vários processos ocupam o mesmo espaço ao mesmo tempo. 17 Multiprogramação com um Único Processador • Ilusão de que cada processo utiliza ciclos de processador independentemente dos demais processos, ou de que processos independentes executam instruções ao mesmo empo (processador virtual). • O processador virtual sempre será mais lento que o processador real, mas permite um maior número de programas ativos na memória. Linguagens Concorrentes: Divide processos em tarefas e executa-as em paralelo. • Ocorre a chegada de jobs em lotes na fila ENTRADA e 1 job é selecionado por vez. • Um exemplo de processador seria pegar o conteúdo do seu processador virtual e colocar no processador real para a execução. • Ativar um processo seria pegar o conteúdo do seu processador virtual e colocar no processador real para a execução. • Um processo fica bloqueado quando, por exemplo perde o processador por pedido de E/S, é removido para a fila pronto. Seleção de “Jobs”: Selecionador (software) • • • • • É também conhecido como “SCHEDULER”. Se existe o recurso pedido, cria um processo ‘BATCH”para cada job selecionado. Coloca o processo no estado PRONTO Aloca os recursos necessários (memória, arquivos...). Libera os recursos alocados. Ativação de Processos: Ativador (software) • • • • É também conhecido como “DISPATCHER”. Aloca um contador de instruções (processador) a um processo no estado PRONTO. Um job é selecionado apenas uma vez durante sua execução. O SELECIONADOR (fila ENTRADA para ganhar o processador virtual) e o ATIVADOR (fila PRONTO para ganhar o processador real) gerenciam filas de jobs ou de processos que esperam a sua aceitação por um processador real ou virtual. Como ativar os Processos(Dispatching): • O ATIVADOR tem como função selecionar para execução o processo PRONTO que possui mais alta • prioridade. Sempre que o processador se encontra livre, um processo é chamado. Fatores Utilizados para Determinar a Prioridade de um Processo • • • • • • Hora de criação do processo. Hora de seleção do seu job (para ganhar um processo virtual da fila de entrada para a fila pronto). Tempo de serviço requisitado. Tempo já gasto processando. Tempo já gasto sem processar. Recursos requisitados ou utilizados. Escolha dos Mecanismos de Ativação • Deve-se determinar o tempo de espera de um processo na fila PRONTO. • O processo que estiver bloqueado não pode ser ativado. • A escolha de um mecanismo não afeta o tempo de um processo no estado bloqueado pois ele está dependendo de um evento e não do processador. Processos “Batch”: • Não depende do usuário em relação a dados e recursos. • O mecanismo deve considerar o tempo total gasto no sistema. 18 Processos Interativos: • Depende do usuário. • Deve ser considerado o tempo para atender a mais recente requisição de serviço. • Existe um grande número de mecanismos para implementar as diferentes políticas. Mecanismos de Fila Única: • • • • Possui apenas uma fila única a espera do processador (fila pronto). Oferece o mesmo serviço a todos os usuários. Para isto nenhum processo deverá esperar em média mais tempo que um outro na fila PRONTO. Política apenas razoável. Espera Média. • Soma dos tempos dividida pelo número de vezes que o processador ficou na fila PRONTO até receber o processador. • Estas medidas não são práticas, são apenas conceituais (Teoria das Filas) Espera Média Global: • Soma dos tempos de todos os processos na fila PRONTO dividido pelo número de vazes que eles entraram na fila PRONTO. A) Política: Mesmo serviço. • Prover a cada processo o mesmo tempo de espera médio. • Assim estará garantindo o processador a todos os processos. • Cada processo é atendido pela ordem de chegada (tempo de criação). • Um processo executa até o seu término, a não ser que entre no estado bloqueado. • Implementado como uma fita simples (FIFO) caso os processos não se bloqueassem. F.C.F.S - Primeiro quem é o Primeiro Servido. • Atende os processos PRONTO na ordem de chegada no sistema. • Utilizado para processos bloqueados também. Vantagens do F.C.F.S • Simplicidade. Desvantagens do F.C.F.S • Processos pequenos esperam tanto quanto os grandes. • Processo utilizando o processador sem se bloquear causa uma espera intolerável nos demais processos. B) Política: Minimizar a Espera Média Global. Existem 4 mecanismos, que são: 1) S.J.N. - Shortest Job Next • Menor Job será o próximo a ser servido. • A prioridade de ativação se baseia na duração estimada de um processo e não no seu tempo de criação. • Mecanismo não PREEMPTIVO (perda forçada do processador), processo não perde o processador se aparecer outro com menor duração. Vantagens: • A espera global média é menor que no F.C.F.S. pois se colocam os menores processos na frente, assim • eles terminam mais rápido e não atrapalham os outros. Processos pequenos tem menor espera média que os grandes. 19 Desvantagens • Espera média para grandes processos é maior que no F.C.F.S. • Primeiro que chega é o primeiro a ser atendido. * S.J.N tende a diminuir o número de processos na fila PRONTO pois tende a diminuir o número de processos pequenos* 2) S.R.T. - Shortest Remaining Time • Prioridade se baseia no tempo que falta para terminar um processo (tempo restante). Vantagens: • Vai dar mais prioridade aos processos próximos do fim - muito útil para implementar PREEMPÇÃO. • Processos pequenos são ainda mais favorecidos que os grandes. • Alcança a menor média de espera global possível pois termina mais rapidamente o processo e passa o processador para outro. Desvantagens: • SJN e SRT necessitam de uma estimativa inicial de tempo de execução, logo, são inapropriados para ativar processos interativos. • O usuário que estimar o menor tempo para um processo terá a maior prioridade, logo, um PGM que dure 10 horas e o usuário coloque 10 minutos, poderá ser executado rapidamente. Como evitar a Sub-Estimação Proposital do Tempo? • Eliminando do sistema os processos que não terminarem no tempo estimado. • Aumentar a tarifa a cobrar de um processo após o término do tempo estimado. 3) Dar Maior Prioridade de Ativação a quem Requisitar Menor Tempo do Processador • A fila PRONTO é mantida em ordem ascendente de tempo desde o último comando de E/S 5’ 10’ 25’ 1”10’ 1”51’ Vantagem: • Favorece processos com alta atividade de E/S. Desvantagens: • Uma fila única ordenada por atividade de E/S torna impossível considerar outros fatores de ativação. Risco: • Todos os mecanismos de Espera média Global vistos até aqui podem causar POSTERGAÇÃO INDEFINIDA de processos grandes ativos com o processador virtual sem nunca terminar. Solução: • O que se tem que fazer é minimizar o tempo de espera, mas assegurando o término de todos os processos. 4) “Round-Robin”: • • • • • • Mecanismo PREEMPTIVO pois perde o processador mesmo que não esteja bloqueado. Política de gerência de fita muito simples. Estabelece uma fatia de tempo para cada processo. No final da sua fatia de tempo, o processo é removido do processador em favor do próximo da fila PRONTO. Processos removidos, desbloqueados ou que iniciaram são incluídos no final da fila PRONTO. A prioridade na fila fica sendo a de ordem ascendente de espera desde a última fatia de tempo. 20 • Com “n”processos executáveis, cada um recebe 1/n do tempo do processador (no somatório geral do tempo). Vantagens: • Favorece processos curtos, que terminam primeiro, mas sem penalizar em excesso os processos grandes. Desvantagens: • Devido ao tempo de troca de processos (PREEMPÇÃO), a Espera Média Global é maior que no F.C.F.S. *”ROUND-ROBIN” é a política básica para gerenciar o processador*. Que Tamanho deveria possuir a Fatia de Tempo “q”? “q”Muito Grande: • O tempo total de um processo é aumentado pela chegada de novos processos ou desbloqueios e diminuído pelo bloqueio de outros. “q”Muito Pequeno: • O processo vai muitas vezes para o final da fila demorando cada vez mais para acabar. • Maior freqüência de troca de processos no processador causa um maior OVERHEAD do sistema. • É necessário um valor adequado de “q”: [200 milisegundos, 2000 milisegundos] Mecanismos de Fila Múltipla: • Mecanismos de uma fila única não permitem dar diferentes tratamentos para classes diferentes de processos. • Sistemas multiprogramados em lotes podem querer privilegiar processos “I/O BOUND”em relação a “CPU BOUND”. • Pode ser implementado um sistema com diferentes tratamentos para diferentes classes de processos. 3 filas PRONTO • 1)TEMPO REAL 2)INTERATIVOS 3)LOTES (batch) Múltiplas filas: possuem mais de uma fila para cada estado e permite usar mais de um mecanismo de ativação, um por fila. Associação Estática de Processos a Fila Pronto: • Uma vez associado a uma fila PRONTO, o processo sempre retorna a ela. • ATIVADOR seleciona o primeiro processo da primeira fila não vazia na ordem de prioridade. • Fila podem ser gerenciadas “ROUND-ROBIN” ou F.C.F.S. Associação dinâmica de Processos a Fila Pronto • • • • Cada fila com uma fatia de tempo “q”diferente. Processo volta para a próxima fila PRONTO na prioridade. Processos curtos possuem mais alta prioridade. Desta maneira pode-se colocar processos em REAL-TIME em fila com maior prioridade que os processos em ROUND-ROBIN para assim executá-los mais rapidamente. QUESTÕES: 1) O que é memória virtual? Memória virtual consiste em gerenciar memória principal e secundária passando ao usuário a impressão de existir uma única memória principal, isso faz com que os programas não sejam limitados ao tamanho da memória. 2) Qual o mecanismo de tradução do endereçamento virtual para o endereçamento físico? Mapeamento. Sendo que cada processo possui sua tabela de mapeamento, relacionando os endereços virtuais do processo à memória física. 21 3) O que é paginação? E qual é o mecanismo onde as páginas dos processos são transferidas da memória secundária para a principal? A paginação consiste em dividir em blocos de mesmo tamanho, os endereçamentos virtuais e reais, sendo chamado de página. As páginas são transferidas da memória principal para a secundária, quando necessária na memória principal (referenciado) esse processo chama-se “Paginação por demanda”. 4) O que significa working set de um processo? O working set, baseia a análise de taxa de paginação dos processos. É o conjunto de páginas constantemente referenciadas pelo processo, devendo permanecer na memória principal para que execute de forma eficiente. 5) Explique brevemente a realocação de páginas: Maior problema de realocação é saber qual página remover. Nisso o S.O intervém, recolhendo, entre as diversas quais liberar. Sempre que for liberado uma página, antes deve-se gravá-la na memória secundária ( arquivo de paginação). 6) Quais as principais estratégias para a realocação de páginas, explicando-as: First-In-First-Out: a página que primeiro for utilizada será a primeira a ser escolhida. Least-Recently-Used: seleciona a pagina utilizada menos recentemente. Not-Recently-Used: a página que não foi recentemente utilizada. Existe um flag de referência que indica quando a página foi referenciada ou não. Least-Frequently-Used: a página que menos é utilizada. É criado um contador de número de freqüências. 7) Em relação ao tamanho de página, ela está associada a quê? E por quê as páginas pequenas geram menor fragmentação? Está associado ao hardware e varia de sistema para sistema. Páginas pequenas, usam tabelas de mapeamento maiores, provocam maior taxa de paginação e conseqüentemente aumentam o número de acessos à memória secundária, gerando, menos fragmentação. 8) Qual a diferença entre a paginação e a segmentação? A diferença é que enquanto a primeira divide o programa em partes de tamanho fixo, sem qualquer ligação com a estrutura do programa, a segmentação permite uma relação do programa na divisão da memória. 9) Descreva o sistema que implementa segmentação paginada: Segmentação paginada, permite a divisão lógica dos programas em segmentos e, por sua vez, cada segmento é dividido, fisicamente em páginas. 10) Por quê a proteção é tão necessária para sistemas? A proteção é necessária para impedir que um processo, ao acessar uma página/segmento do sistema, a modifique ou mesmo tenha acesso a ela. 11) Quando existe novos processos que desejam ser processados e não existe memória real suficiente, o sistema seleciona um ou mais processos que deverão sair da memória para ceder espaço aos novos processos, para isso existe dois critérios. Quais são? Os mais utilizados são a prioridade e o estado do processo. 12) Qual a definição de Thrashing. E quais os motivos que levam um processo a sofrer Thrashing? Thrashing é a excessiva transferência de páginas/segmentos entre a memória principal e a memória secundária. Thrashing em dois níveis: Processo: ocorre devido ao grande número de Page faults, gerado pelo programa de execução. Sistema: é a não obediência de localidade, o programa faz referência a comandos localizados fora do working set do processo. 13) Quais são os tipos de sistemas operacionais? Explique cada um: Monotarefa: o ambiente mais simples é aquele onde um usuário executa um aplicativo de cada vez. Comportam apenas um usuário, que pode, executar várias atividades ao mesmo tempo. 14) O que são programas em tempo real? Exemplifique: 22 É usado quando respostas imediatas são essenciais. Ex: robôs, controladores de veículos, reatores nucleares, controle de equipamentos de fábricas. 15) O que é um processo no sistema operacional? É um programa em execução, sendo constituído do código executável os dados referentes ao código, da planilha de execução, do valor do contador de programa, do valor do apontador de pilha e outras informações necessárias. 16) Que necessidades os sistemas operacionais necessitam para atender às necessidades de um processo? Memória: para armazenar suas instruções e dados. CPU: para executar as instruções. Dispositivos: impressoras, unidade de fita e disco. Arquivos: para que o S.O o localize e localize um registro dentro dele. 17) Defina alocação de memória contígua simples: Na alocação contígua simples o usuário tem controle sobre toda a memória principal, pode acessar qualquer posição de memória e alterar o S.O. Não permite a utilização eficiente do processador. 18) Qual foi a solução encontrada para resolver o problema onde os usuários estavam limitados ao tamanho da memória principal disponível ? Foi dividir o programa em partes, de forma que pudessem executar independentemente uma da outra, utilizando uma mesma área de memória. 19) Defina alocação de memória particionada realocável: A geração de código realocável é possível, podendo carregar os programas em qualquer partição. 20) Qual o problema enfrentado nas alocações de memória utilizando o método da questão 19. Os programas não preenchem totalmente as partições onde eram carregados. 21) Na alocação de memória particionada dinâmica, ocorre a fragmentação, qual a solução para o reaproveitamento dos espaços da memória? Os espaços adjacentes são reunidos, produzindo um espaço de tamanho maior. Realocação de todas as partições, eliminando os espaços entre elas criando uma área livre contígua. 22) Cite as estratégias utilizadas pelo S.O para diminuir o problema da fragmentação. Explique qual é a melhor na sua opinião. Best-fit, worst-fit, first-fit. A melhor é first-fit, pois é a mais rápida consumindo menos recurso do sistema. 23) Defina realocação dinâmica: É realizada através de um registrador que recebe o endereço inicial de memória que o programa irá ocupar. 24) Defina memória virtual: É a técnica sofisticada e poderosa de gerência de memória, as memórias principal e secundária são combinadas, dando ao usuário a ilusão de existir uma memória principal. 25) O que é mapeamento em S.O ? Permite ao S.O traduzir um endereço localizado no espaço virtual para um no espaço real. 26) Defina espaço de endereçamento virtual: Conjunto de endereços virtuais que os processos podem endereçar. 27) Comparando os sistemas operacionais de 1950 e os de hoje, o que melhorou? Melhorou tudo, permite que o usuário execute múltiplas tarefas ao mesmo tempo, envia dados a um disco impressora e outros dispositivos de saída; mantém compiladores, editores e outros programas em locais de memória distintos. 28) O que acontece com um programa maior que as partições livres disponíveis em uma alocação particionada estática absoluta? Sempre que fosse necessária a alteração do tamanho de uma partição, o sistema deveria ser desativado e reiniciado com uma nova configuração. 23 29) Quais as responsabilidades principais de um sistema operacional? Processamento de E/S, gerenciamento de disco e gerenciamento de memória. 30) Defina programa interativo e dê exemplos: É aquele que o usuário ativa por meio de um terminal . Em geral o usuário introduz um pequeno comando. Ex: Word, excel. 31) Quais são as preocupações dos sistemas operacionais com relação aos recursos da memória? Um processo precisa de memória para armazenar suas instruções e dados. O S.O deve garantir ao processo uma quantidade de memória suficiente. 32) O que é um S.O multitarefa Monousuário? Comportam apenas um usuário, que pode, executar várias atividades ao mesmo tempo. 33) O que é um Programa Interativo? Programa interativo é aquele que o usuário ativa por meio de um terminal. Em geral o usuário introduz um pequeno comando. O S.O interpreta esse comando, executa a função e envia uma mensagem ao usuário. Os usuários esperam respostas imediatas. 34) O que faz um Programa em Lote? O usuário pode armazenar comandos em um arquivo, colocá-lo em uma fila de lotes e se desconectar ao sistema e executar alguma outra tarefa. O arquivo com os comandos permanecem na fila e é eventualmente tratado pelo sistema. O usuário não espera retorno imediato. 35) O que é e o que faz o sistema operacional? Sistema operacional é um programa que permite às pessoas usar o Hardware do computador (CPU, Memória e Armazenamento Secundário). O que faz o Sistema operacional: Permite que os programas armazenem e obtenham informações. Isola os programas dos detalhes específicos de Hardware. Controla o fluxo de dados entre os componentes. Permitem que programas sejam executados sem interferência de outros. Permite que programas independentes cooperem e compartilhem informações. Responde aos erros ou solicitações do usuário. Impõe um escalonamento entre programas que solicitem recursos. 36) Exemplifique programas em tempo real: Controle de tracógrafo aéreo, robôs, reatores nucleares, etc. 37) O que é Kernell? Kernell é o núcleo (coração) do S.O . Ele contém rotinas mais críticas e mais freqüentemente utilizadas. 38) O que é processo? Processo é basicamente um programa em execução, sendo constituído do código executável, dos dados referentes ao código, além de um conjunto de outras informações necessárias à execução do programa. 39) Qual a responsabilidade básica do S.O em relação aos programas? É com os programas que devem ser executados e competem aos recursos 40) Qual a responsabilidade do S.O em relação a memória? 41) Que recursos o S.O deve gerenciar para atender às necessidades de um processo? Respostas das questões 40 e 41. O S.O deve garantir ao processo uma quantidade de memória suficiente. O S.O não deve permitir que o processo ocupe tanta memória a ponto de impedir que outros processos sejam executados. A privacidade e a segurança exigem que um processo seja impedido de acessar a memória de outro processo. 42) O que é concorrência? Muitos processos existem simultaneamente, freqüentemente acessão o mesmo arquivo. são concorrentes. Processos concorrentes 43) Como funciona alocação contígua simples? 24 A memória principal é dividida em 2 partes: uma para o S.O e outra para o programa do usuário. O programador deve desenvolver suas aplicações preocupando-se em não ultrapassar o espaço da memória disponível. O usuário tem controle sobre toda a memória principal, podendo acessar qualquer posição. Alguns sistemas implementam proteção através de um registrador, que delimita as áreas do S.O e do usuário. 44) O que é overlay? É a divisão do programa em módulos, de forma que pudessem executar independentemente utilizando uma mesma área de memória. 45) Como funciona alocação particionada estática? A memória dividida em partições de tamanhos fixos; estabelecido pelo desenvolvidor. Conforme o tamanho dos programas. Sempre que fosse necessária uma alteração no tamanho de uma partição, o sistema deveria ser desativado e reiniciado com uma nova configuração. Os programas só podiam executar em uma das partições. 46) Como funciona alocação particionada dinâmica? Eliminando o conceito de partições de tamanho fixo. Cada programa utilizaria o espaço que necessitasse, passando esse pedaço a ser sua partição. 47) Como se soluciona o problema da fragmentação na alocação particionada dinâmica? Solução de programa de fragmentação na alocação particionada dinâmica: Existem 2 soluções: Os espaços adjacentes são reunidos, produzindo um espaço de tamanho maior. Relocação de todas as partições, eliminando os espaços entre elas e criando uma única área livre contígua. 48) Quais as estratégias para escolha da partição a ser utilizada pelo programa? O sistema possui uma lista de áreas livres (free list), com o endereço e tamanho de cada uma delas. Best-fit (melhor partição): menos espaço sem utilização. Worst-fit (pios partição): maior espaço sem utilização. First-fit: primeira partição livre de tamanho suficiente para carregar o programa. 49) Como o S.O executa o Swapping? O sistema escolhe um programa residente que é levado da memória para o disco (swap out), retornando posteriormente para a memória principal (swap in), como se nada tivesse ocorrido. É utilizado para ceder espaço aos novos processos. 50)O que é mapeamento? Mecanismo que transforma os endereços virtuais em endereços reais. Permite ao S.O traduzir um endereço localizado no espaço virtual para um no espaço real. 51) Qual a função do registrador na tabela de mapeamento? O registrador presente na tabela de mapeamento tem por função indicar a posição inicial da tabela, onde toda vez que houver mudança de contexto, o mesmo é atualizado com o endereço da nova tabela. 52) O que permite ao sistema localizar a página real do processo? Cada página virtual possui uma entrada na tabela de páginas, com informações de mapeamento que permitem ao S.O localizar a página real correspondente. 53) Como é calculado o endereço físico? Forma-se o endereço do frame localizado na tabela de páginas com o deslocamento contido no endereço virtual. 54)Explique o “bit de validade”: O bit de validade indica se uma página está ou não na memória física. 55) O que o sistema faz caso a página que contém o endereço referenciado não estiver na memória principal? O que ocorre nesses casos? Neste caso, o S.O tem de transferir a página da memória secundária para a memória física. 56) O que é paginação por demanda? Paginação por demanda é um mecanismo no qual as páginas dos processos são transferidas da memória secundária para a principal apenas quando são referenciadas. 57) Fale sobre Page Fault: 25 Quando a página referenciada não está na memória principal, o S.O tem de transferir a página da memória secundária para a física. Toda vez que o sistema é solicitado para isso, ocorre o page fault (falha de página). 58) O que é localidade? Localidade é a tendência que existe em um programa de fazer referências a posições de memória de forma uniforme, ou seja, instruções próximas. 59) Quando um processo é criado, onde estão todas as suas páginas? E o que acontece a medida que acontecem referências às páginas virtuais? Quando um processo é criado, todas as suas páginas estão na memória secundária. À medida que acontecem referências às páginas virtuais, elas são transferidas para o Working set do processo na memória principal. 60) Como funciona o compartilhamento de memória? Com o compartilhamento de código e dados entre vários processos, as entradas das tabelas de páginas/segmentos devem apontar para as mesmas páginas/segmentos na memória principal. 61)Como sabemos se uma página virtual esta ou não na memória principal? Através do bit de validade que indica se está ou não na memória principal, 1 não está na memória principal, 0 está na memória principal. Operações em Processos: 1) Execução: •O pai executa concorrentemente (adotada em FORK/JOIN). •O pai espera que o filho acabe (adotada em comandos concorrentes). 2) Compartilhamento: •Pai e filho compartilham todas as variáveis (FORK/JOIN e comandos concorrentes) •Pai e filho compartilham um subconjunto de variáveis do pai (adotada no UNIX). 3) Término de Processos •Em circunstâncias especiais um processo poderá acabar antes de executar seu último comando. •Um processo pode causar a morte de outro com o uso de instruções do tipo ABORT id ou KILL id. •Quem mata um processo é o pai dele a partir de sua identificação (id). Porque Matar um Processo? •Filho excedeu o uso de recursos. •O trabalho atribuído ao filho não é mais necessário. •O filho se encontra em “LOOP”. •PROCESSO é um programa em estado de execução, incluindo os valores correntes do PC, registradores e variáveis. Hierarquia de Processos: •“Um grafo de processo é uma árvore cujos nodos correspondem a um processo”. •Uma aresta de um nodo Pi para um nodo Pj significa que Pj foi criado por Pi (Pi é o pai de Pj e Pj é filho de Pi). •Cada processo possui um pai, exceto o inicial, cujo pai é ele mesmo. •Cada pai pode ter vários filhos. Processos Paralelos •Cada processo possui sua própria CPU virtual. •Em sistemas com multiprogramação: * Uso da CPU compartilhada entre os diferentes processos. * Ilusão de paralelismo. •Os objetivos procurados vão aumentar o número de programas processados por unidade de tempo (“throughput”- aumenta a quantidade de processos) e dar tempo de resposta rápida a programas interativos. Processos Concorrentes •Quando dois ou mais processos necessitam se comunicar entre si, são chamados de processos “concorrentes”ou “cooperantes”. 26 Problema: •Como controlar a comunicação entre os processos sem comprometer a segurança dos dados de cada um, uma vez que envolve variáveis comuns entre eles? Solução: •Implementando um mecanismo de sincronização. Exclusão Mútua: •Acesso exclusivo de um processo a variáveis comuns a outros processos, ou seja: garantir que quando um processo estiver utilizando variáveis comuns, nenhum outro processo as utilize também. Regiões Críticas: •Consiste em uma ou mais variáveis comuns utilizadas por diversos processos. Um sistema pode ter várias regiões críticas distintas. Definição do Problema: •Sistema operacional com “n”processos. •Cada processo possui seções críticas nas quais atualiza variáveis comuns, tabelas, etc. •Só é permitido a um processo executar em sua seção crítica se nenhum outro estiver executando sua própria seção crítica. •A execução da seção crítica por um processo deve ser feita de forma mutuamente exclusiva no tempo. Soluções para o Problema devem Satisfazer às Seguintes Condições: •1) Exclusão Mútua. •2) Processo: somente os processos que não estão executando no restante da seção crítica podem participar da decisão de~”qual irá entrar”. A seleção não pode ser postergada indefinidamente. •3) Espera Limitada: deve haver um limite de vezes em que um processo entre na sua seção crítica após outro processo haver requisitado a entrada na sua seção crítica. Não deve ser feita nenhuma suposição sobre velocidade dos processos. Sistemas Monoprocessável: •Inibir interrupções na entrada da seção crítica e ativando-as na saída da seção crítica. Desta maneira o processo irá executar os comandos de sua seção crítica, do início ao final, ininterruptamente. Sistemas Multiprocessável: •Apenas inibir as interrupções é insuficiente pois dois processadores podem estar executando dois processos distintos que queiram executar a mesma seção crítica. Construções “Fork”e “Join”: •Definida por Conway (1963) e por Dennis e Van Horn (1966). •Primeiras notações de linguagem para especificar concorrência. •Utiliza um grafo de precedência para a construção “fork”. “Um grafo de precedência é um grafo sem ciclos, dirigido, cujo nodos correspondem a um comando individual.” “Uma aresta de um nodo Si para um nodo Sj significa que o comando Sj somente poderá ser executado após o comando Si ter completado sua execução. Funcionamento de “Fork”e “Join”: •FORK produz duas execuções concorrentes no processo. •Uma execução começa no rótulo L. •A outro execução combina no comando seguinte ao FORK. •Divide uma computação em duas independentes. •JOIN combina duas execuções concorrentes em uma. •Cada uma das duas deve requisitar um JOIN com outra. •Uma das computações termina antes da outra. •A que executa o Join primeiro, termina enquanto que à outra é permitido continuar. •Existindo três computações, às duas primeiras é permitido terminar, enquanto que a terceira deve continuar. •JOIN tem um parâmetro que especifica o número de computações. Join parâmetro count:=count-1; if count< > o then quit; JOIN combina execuções em uma, ou seja, após o JOIN , só uma execução deverá continuar. *O primeiro processo chega a JOIN e count:=count - 1 (execução acabe). *Quando count=0, o processo continua. 27 •As construções FORK e JOIN desestruturam um programa. •São semelhantes ao comando GOTO. Comando Concorrente: •Dijkstra (1965). •Construção de mais alto nível. •Não deve existir prioridade entre processos que queiram entrar na seção crítica. •O fato de um processo se bloquear fora da seção crítica não impede que outros processos entrem nela. •Dois ou mais processos não podem se bloquear mutuamente na entrada de uma seção critica. Forma: Parbegin S1, S2,..., Sn Parend: •Todos os comandos entre as construções Parbegin/Parend podem ser executados concorrentemente. •O comando seguinte ao Parend somente será executado após todos os anteriores terem terminado. •Pode ser facilmente adicionado a uma linguagem de alto nível estruturada em blocos. Semáforos: •Dijkstra (1965). •Um semáforo “s” é uma variável inteira que pode ser acessada somente através das operações P e V para permitir a entrada e a saída da Região Crítica, respectivamente. •Se s >0, significa que a seção crítica está livre e a operação P(s) pode ser completada com sucesso. “s”, é decrementado e o processo entra na seção crítica. •Se s=0, o processo será bloqueado ao executar P(s) e será colocado em uma fila de espera associada ao semáforo “s”. •A operação V(s) incrementa “s”(se e somente se a fila estiver vazia) e,se um ou mais processos estiverem bloqueados na fila de espera associada ao semáforo “s”, um deles será acordado, isto é, colocado no estado ativo poderá executar novamente a operação P(s). •A escolha do processo a ser acordado deverá ser “justa’, isto é, nenhum processo na fila “s” ficará indefinidamente bloqueado por causa desta escolha. Exemplo com Semáforo: Problema: realizar a comunicação entre duas classes de processos denominadas de “produtores” e “consumidores”. •O produtor produz uma mensagem. •O consumidor consome uma mensagem. •Semáforo s=1 (para a seção crítica). •Semáforo n>0 ou n=0 (contador das mensagens). •O semáforo “s”terá apenas os valores 0 e 1. •O semáforo “n”terá valor maior e igual a zero. Semáforos para sincronizar Processos VAR a, b, c, d, e, f, g: Semáforo “valor inicial=0” BEGIN PARABEGIN BEGIN S1; V(a); V(b); V(d); END BEGIN P(a); S2; S4; V( c ); END; BEGIN P(b); S3; V(e); END; BEGIN P( c ); S5; V(f); EM’; BEGIN P(d); P(e); S6; V(g); END; BEGIN P(f); P(g); S7; END; PAREND; END; Problema do Jantar dos Filósofos •Proposto e resolvido por Dijkstra em 1965. •Cinco filósofos pensam e comem. •Compartilham uma mesa com cinco lugares •existem cinco pauzinhos (chopstick). •Um prato de arroz para cada filósofo. •De tempos em tempos o filósofo sente fome e tenta pegar o “pauzinho”à esquerda e o “pauzinho” à direita. •De posse de ambos os “pauzinhos”, ele come. •Quando termina de comer, libera os “pauzinhos”e novamente pensa. Problema do Jantar dos Filósofos 28 Solução Simples •Representar cada “pauzinho”por um semáforo. •VAR chopstick: array 0..4 of semaphore; •VAR I Integer; •Cada semáforo inicializado com 1. •CADA FILÓSOFO (1) REPEAT •P(chopstick(i-1)); •P (chopstick (i mod 5)); ------COME -------•V(chopstick (l-1)); •V (chopstick (l mod 5)); -----PENSA -------UNTIL false; Operações de Entrada/Saída: • Sempre que um processo realiza uma operação de E/S, o sistema deve tornar a tarefa o mais simples possível para o usuário e suas aplicações. • • • • • • • • • • O sistema operacional deve ser projetado de forma a poder se comunicar com qualquer dispositivo que possa ser conectado ao hardware do computador. Esse conceito, denominado independência de dispositivos, está presente em qualquer sistema de arquivos. A maneira mais simples de ter acesso a um dispositivo é através das bibliotecas de comandos de entrada/saída, oferecidas pela maioria da linguagens de programação. Para obter a independência de dispositivos, as operações de E/S devem ser realizadas através de system calls. Dessa forma, é possível escrever um programa que manipule arquivos, estejam eles em disquetes, discos rígidos ou fita magnética, sem ter que alterar o código para cada tipo de dispositivo. As system calls responsáveis por essa comunicação são denominadas system calls de entrada/saída. Estas rotinas estão presentes na camada de mais alto nível implementada pelo sistema operacional, permitindo ao usuário realizar operações de E/S, sem se preocupar com detalhes do dispositivo que está sendo acessado. A comunicação entre os comandos de E/S oferecidos pelas linguagens de programação de alto nível e as system calls de E/S é feita simplesmente através de passagem de parâmetros. Um dos objetivos principais das system calls de E/S é simplificar a interface entre as aplicações e os dispositivos. Com isso, elimina-se a necessidade de duplicação de rotinas idênticas nos diversos aplicativos, além de esconder do programador características específicas associadas à programação de cada dispositivo. Subsistema de Entrada/Saída: • O subsistema de entrada/saída é responsável por realizar as funções que são comuns a todos os dispositivos, ficando os aspectos específicos de cada periférico a cargo dos device drivers. • Podemos considerar que o subsistema de E/S é realmente a parte do sistema operacional responsável pela gerência dos dispositivos. • Uma de suas funções é mapear o nome do dispositivo com o seu respectivo driver. • As camadas superiores conhecem apenas o nome do dispositivo e utilizam esse nome para terem acesso ao • • periférico. Cada dispositivo trabalha com unidades de informação de tamanhos diferentes, como caracteres, bytes, registros ou blocos. O subsistema de E/S é responsável por criar uma unidade lógica de informações independente do dispositivo e repassa-la para os níveis superiores. Normalmente, o tratamento de erros nas operações de E/S é realizada pelas camadas mais próximas do hardware. 29 • • • • • Existem, porém, certos erros que podem ser tratados e reportados de forma uniforme independente do dispositivo pelo subsistema de E/S. O subsistema de E/S é responsável também por implementar todo um mecanismo de proteção de acesso aos dispositivos . No momento que o usuário realiza uma operação de E/S, é verificado se o seu processo possui permissão para realizar a operação. Bufferização é outra tarefa do subsistema de E/S. Essa técnica permite reduzir o número de operações de E/S, utilizando uma área de memória intermediária, chamada buffer. • Por exemplo, quando um dado é lido do disco, o sistema traz para o buffer, além do dado solicitado, um • bloco de dados. Na próxima vez que um novo dado que pertença ao bloco for lido , ele já estará no buffer, evitando uma nova operação de E/S. Device Drivers: • O device driver, ou somente driver, tem como principal função a comunicação com dispositivos de E/S • • • • em nível de hardware, geralmente através de controladores, especificando características físicas de cada dispositivo. Enquanto o subsistema de E/S trata de funções que afetam a todos os dispositivos, os drivers tratam apenas dos seus aspectos particulares. Cada device driver manipula somente um tipo de dispositivo ou grupo de dispositivos semelhantes. Os drivers têm como função receber comandos gerais sobre acessos aos dispositivos e traduzi-los para comandos específicos, que poderão ser executados pelos controladores. Sua função principal é receber comandos abstratos, geralmente das system calls de E/S, e traduzi-los para comandos que o controlador do dispositivo possa entender e executar. Controladores: • • • • • • Os controladores ou interfaces são componentes eletrônicos (hardware) responsáveis por manipular diretamente os dispositivos de E/S. O sistema operacional (device drivers) se comunica com os dispositivos através dos controladores. Em geral, o controlador possui memória e registradores próprios, para executar instruções enviadas pelo device driver. Essas instruções de baixo nível são responsáveis pela interface entre o controlador e o dispositivo. Em operações de leitura, o controlador deve armazenar em seu buffer interno uma seqüência de bits vinda do dispositivo e verificar a ocorrência de erros. Não havendo erro, o bloco pode ser transferido para a memória principal. 30