Please enable JavaScript.
Coggle requires JavaScript to display documents.
Sistemas operacionais II, programas prontos para serem trazidos para a…
Sistemas operacionais II
-
-
-
-
-
-
-
-
carga dinâmica
- apenas o programa inicial é carregado incialmente
- rotiana(s) não são carregadas até que sejam chamadas
-
-
- visão esquemática do swapping
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- programas prontos para serem trazidos para a memória formam uma fila de entrada (input queue)
- em sistemas monotarefas são carregados no endereço 000
- em sistema multitarefa, vários programas residem na memória
- conceito de espaçamento e endereçamento lógico que é vinculado à um espaço de endereçamento físico separado é central para o gerenciamento adequado da memória
- espaço lógico: gerado pela CPU (virtual address)
- espaço de endereços físico: endereço visto/recebido pela unidade de memoria
- elementos físicos de 0+R a max+R
-
-
- apenas o SO pode carregar esses registradores, através de instruções privilegiadas
- SO tem seu acesso irrestrito tanto a sua memória quanto a memória de usuários
-
- ligador (linker) ou carregador (loader) vincula endereços relocáveis a endereços absolutos
- cada vinculação (binding) mapeia um espaço de endereços a outro
- nenhum suporte especial exigido no sistema operacional
- implementado durante o projeto do programa
- SO pode ajudar fornecendo bibliotecas
- stub substitui a si mesmo com o endereço da rotina e a executa
- SO checa se rotina está no espaço de endereços do processo
- o processo swapped-out precisa voltar para os mesmos endereços físicos quando swapped-in?
- depende do método de vinculção de endereço
- outra solução seria sempre transferir i/o para o espaço kernel, então para o dispositivo de i/o
conhecida como double buffering, possui maior overhead
- mais versões modificadas são comuns
- swapping apenas quando memória extremamente cheia
- Método permite que o tamanho do kernel seja alterado dinamicamente
Adicionar/remover código transiente do kernel (buffers de drivers, por
exemplo)
- Partições variáveis (tamanho)
- Problema com fragmentação externa
- Encontra um quadro livre na memória (lista de quadros livres)
- Copia página para o quadro (disco → memória)
- Atualiza tabelas (bit = v), página agora está na memória
- Reinicia instrução que causou a falta de página
- o programa deve ser trazido do armazenamento secundário para a memória e um processo é criado para controlar sua execução
- a memória vê apenas fluxos de endereços independente de como foram gerados e para que servem
- a memória principal e os registradores são os únicos armazenamentos que a CPU pode acessar diretamente
- a unidade de memória vê apenas fluxos de endereços junto a requisições (read/write)
- acesso a registradores duram apenas um clock de CPU ou menos
- acesso a memória principal pode durar vários ciclos (stall)
- o cache fica entre memória principal e os registradores da CPU
- proteção de memória é necessária para garantir a operação correta
- um par de registradores base e limite define o espaço de endereços lógicos
- a CPU deve checar cada acesso à memória gerado em modo de usuário para se certificar que está entre base e limite do usuário
:
- geralmente em posições diferentes do endereço 0000
- esquema de vinculação de endereços em tempo de execução resulta em endereços lógicos e físicos diferentes
- espaço de endereços lógicos é o conjunto de todos os endereços lógicos gerados por um programa
- espaço de endereços físicos é o conjunto de endereços físicos gerados por um programa
- endereços são representados de forma diferente em diferentes estágios de vida do programa
- endereços de código fonte geralmente são simbólicos (nome da variável)
- compilador vincula (bind) endereços simbólicos a endereços relocáveis e gera o código compilado (relócavel)
- a vinculação de endereços de instruções e de dados para endereços de memória pode acontecer em 3 estágios
- tempo de compilação: se o local de memória conhecido como a prioridade, código absoluto pode ser gerado pelo compilador. código deve ser recompilado se o local mudar
- tempo de carga: compilador gera código relocável se o código não for conhecido,vinculação final é adiada até o momento de carga
- tempo de execução: vinculação é adiada até o momento de execução. processo pode ser movido, durante sua execução, de um segmento de memória para outro
- dispositivo de hardware que em tempo de execução, mapeia(traduz) endereços virtuais para endereços físicos
- o programa do usuário lida apenas com endereços lógicos, nunca lida com endereço físico
- vinculação no tempo de execução ocorre quando é feita uma referência a uma posição de memória
- elementos lógicos de 0 a max
- melhor ultilização do espaço de memória
- todas as rotinas permanece no disco em formato de carregamento relocável
- útil quando grande quantidade de código é necessária para manipular casos infrequents (ex,:rotina de erros)
- vinculação estática (static linking) - bibliotecas de sistema e código do programa são combinados pelo carregador (loader) gerando a imagem do programa binário
- vinculação dinâmica (dinamic linking) - ligação é adiada até o tempo de execução
- pequena peça de código, stub, é usada para localizar a rotina de biblioteca correspondente residente em memória
- se não estiver, adiciona ao espaço de endereços
- ligação dinâmica particularmente útil para bibliótecas
- sistema também conhecido como bibliotecas compartilhadas (shared libraries)
- aplicabilidade em correções (patching) de bibliotecas de sistema
- controle de versões pode ser necessário
- um processo pode temporariamente ser transferido para um processo de retaguarda, depois trazido de volta para continuar sua execução
- espaço total da memória para processos pode exceder a memória física
- retaguarda (backing store) - espaço grande o suficiente para armazenar todas as imagens de memória para todos usuários; deve fornecer acesso direto à essas imagens de memória
- roll out, roll in - variante de permutação swapping usada por algoritmos de escalonamento baeado em prioridade; processo de baixa prioridade são swapped-out e processos de prioridade são swapped-in
- maior parte do tempo de swap é transferência tempo de transferência é diretamene proporcional à quantidade de memória transferida
- sistema mantém uma fila de pontos, ready queue, de processos prontos para execução que possui imagens de memória em disco
-
- ainda considere I/O pendente de/para o espaço de memória do processo
- versões modificadas de swapping são encontradas em muito sistemas como (e.g,linux,windows)
- swapping normalmente é desabilitado
- desabilitado novamente quando a demanda por memória diminuir
- pode ser iniciado se ultrapassar um certo limite (threshold) de memória alocada
- se o próximo processo a assumir a CPU não assumir a memória e não houver região de memória livre, outro processo é removido (swap out) da memória para que o processo seja inserido (swap in)
- tempo de chaveamento de contextos pode ser muito alto
- exemplo: processo de 100mb, disco de 50MB/seg
- swap out leva 2000 ms (2 segundos)
- tempo total do chaveamento de contexto do swapping: 4000ms (4 segundos)
- outros fatores que restrigem o swapping
- i/o pendente - processo com operações de i/o pendentes não pode sair da memória; i/o poderia ocorrer no processo errado
- por padrão, swapping não é ultilizado em so modernos
- memória principal deve suportar o SO e os processos de usuários
- recurso limitado, deve ser alocado de forma eficiente
- alocação contígua é um método antigo
- cada processo fica contido em uma única seção, que é contígua à seção que contém o próximo processo
- são criadas usualmente duas partições
- sistema operacional residente, usualmente na memória baixa, devido a localização do vetor de interrupções
- processos de usuários mantidos na memória alta
-
- como alocar a memória disponivel para processos que estão na fila de espera, esperando para serem trazidos para a memória?
- proteção da memória na aloacação contígua
- impedir que um processo acesse um espaço na memória que não possui
- registradores de relocação são usados para proteger processos de usuário uns dos outros, e que esses alteram código/dados do SO
- Registrador de Relocação (RR) contém valor do menor endereço físico
- Registrador Limite (RL) contém o intervalo de endereços – cada endereço lógico deve ser menor que esse registrador
- Como parte da mudança de contexto, o dispatcher carrega esses registradores com os valores corretos para o processo (PCB – process control block) que entrará em execução
- MMU mapeia endereços lógicos dinamicamente somando o valor do
RR a cada endereço que a CPU gera
- Partições de tamanho fixo (IBM System/360 – 1964)
- MFT – Multiprogramming with a Fixed number of Tasks
- Partições de tamanhos variáveis melhora eficiência (tamanho do processo)
- MVT – Multiprogramming with a Variable number of Tasks
- SO mantém listas de processos e brechas
- Brecha (hole) – bloco de memória disponível; brechas de tamanhos variados se
espalham por toda a memória no decorrer do tempo
- Quando um processo chega (fila de entrada), aloca-se memória de uma brecha
grande o suficiente para acomodá-lo
- Processos saindo liberam sua partição, brechas adjacentes são combinadas
- Como satisfazer uma requisição de tamanho n a partir de uma lista de brechas?
- Soluções para selecionar uma brecha na lista:
- First-fit: aloca a primeira (first) brecha grande o suficiente
- Pode começar do início ou da locação atual
- Best-fit: aloca a menor brecha grande o suficiente
- Deve percorrer a lista inteira, a menos que esteja ordenada por tamanho
- Produz a brecha com menos espaço sobrando
- Worst-fit: aloca a maior brecha
- Deve percorrer a lista inteira, a menos que esteja ordenada por tamanho
- Produz a brecha com mais espaço sobrando
- First-fit e best-fit melhores que worst-fit em termos de velocidade e utilização de memória.
- Fragmentação Externa – existe espaço de memória total para satisfazer uma requisição, mas espaços disponíveis não são contíguos
- Análise do Fist-fit revelou que dados N blocos alocados, outros 0.5N blocos são
perdidos devido a fragmentação → 1/3 da memória pode ficar inutilizado
- possível solução é a compactação: unir todas as brechas em uma única
- só é possível se a relocação for dinâmica e feita em tempo de execução
- Relocação: quando um processo muda de local físico na memória e, por isso, os endereços precisam ser corrigidos
- Se relocação for feita em tempo de carga, processo não pode mudar de lugar
- Fragmentação Interna – memória alocada pode ser levemente maior que memória requisitada
- Esta diferença é memória interna à partição, mas não pode ser usada
- Acontece quando a memória é particionada em blocos de tamanho fixo
- Exemplo: memória utiliza blocos de 18k e deve atender uma solicitação para alocar um processo de 10k → sobram 8k : fragmentação interna
- Outra solução para fragmentação externa:
- Permitir que o espaço de endereçamento dos processos seja não contíguo
-
- Segmentação → Esquema de gerenciamento de
memória que suporta visão do usuário sobre a
memória
- Programador referencia os módulos/segmentos de um programa pelo nome/número e um deslocamento
- Não se preocupa com os endereços dos segmentos na memória
- Segmentos de tamanhos variados compõem o
espaço de endereçamento lógico
- Normalmente, quando um programa é compilado, o compilador constrói automaticamente segmentos que refletem o programa de entrada
- O carregador toma esses segmentos e designa a eles números identificadores
- Endereço lógico consiste de uma dupla:
<número_do_segmento, deslocamento>
- Tabela de Segmentos – mapeia esses endereços bidimensionais para endereços unidimensionais da memória física; cada entrada da tabela tem:
- base – endereço físico do início do segmento na memória
- imite – especifica o tamanho do segmento
- Segment-table base register (STBR) – aponta para o local da tabela de segmentos na memória
- Segment-table length register (STLR) – indica número de segmentos usados pelo programa
-
-
- Com cada entrada na tabela de segmentos associa-se:
- validation bit = 0 segmento inválido
- Bits de proteção são associados a segmentos
- compartilhamento de código ocorre ao nível de segmento
- Como o comprimento dos segmentos varia, alocação de memória para novos segmentos é um “problema de alocação dinâmica”
- First fit; Next fit; Best fit; Worst fit
- A técnica de paginação (a seguir) elimina a necessidade de problema de alocação dinâmica e da fragmentação externa
- Técnica de gerenciamento de memória que permite que o espaço de endereçamento físico de um processo seja não-contíguo;
- Assim como na técnica de segmentação
-
- Evita fragmentação externa
- Evita pedaços de memória de tamanhos variados
- divide memória física em blocos de tamanho fixo, quadros (frames)
- Tamanho é potência de 2, varia entre 512 bytes e 1G bytes
- Facilita a composição do endereço lógico (núm. de página + desloc.)
- Divide memória lógica em blocos de mesmo tamanho, páginas (pages)
- Páginas e quadros são sempre do mesmo tamanho
- SO precisa manter controle sobre todos os quadros livres (lista)
- Para executar um programa de N páginas, precisa encontrar N quadros livres e carregar o programa
- Durante carregamento do processo na memória, configura tabela de páginas (page table) para o processo
- Tabela de páginas, uma por processo, é usada para, em tempo de execução, traduzir endereços lógicos para endereços físicos
- Armazenamento de retaguarda (swap) também dividido em páginas
- Uma Página/Quadro pode apresentar fragmentação interna (pequena)
- Assim, como na abordagem por segmentação, é preciso resolver o problema de onde armazenar as tabelas de páginas
- Endereço gerado pela CPU é dividido em:
- Número de página (p) – usado como índice na tabela de páginas que contém endereço base de cada página na memória física (quadro)
- Deslocamento na página (offset) (d) – combinado com o endereço base define o endereço físico
- Considerando o endereço lógico com m bits e páginas de n bits, tem-se
- Espaço de endereçamento lógico de até 2m bytes
- Cada página contendo 2
n bytes
- Número máximo de páginas igual a 2m-n
- Não há fragmentação externa na paginação
- pode haver fragmentação interna
- Exemplo de cálculo de fragmentação interna
- Tamanho da página = 2.048 bytes (2k)
- Tamanho do processo = 72.766 bytes
- Visão de processo e de memória física são diferentes na paginação
- Paginação permite usar memória física maior do que pode ser endereçado pelo ponteiro de endereçamento da CPU
- SO mantém uma tabela de páginas para cada processo
- Há um custo maior no tempo de mudança de contexto entre processos
- Por implementação, cada processo pode acessar apenas sua própria memória (páginas que estão em sua própria tabela de páginas) → proteção
- É a visão lógica de como o processo é
armazenado na memória
- Inicia na posição 0 e seguem endereços
contíguos até o final do espaço lógico/virtual
- Memória física é organizada em quadros
de página (não contíguos)
- MMU é responsável pelo mapeamento
- Usualmente, espaço de endereços lógicos da
pilha é projetado para iniciar em Max e crescer para baixo enquanto o heap cresce para cima
- Espaço de endereços não utilizado entre os
dois não necessita de memória física, a menos que a pilha ou o heap cresçam
- conhecido como espaço de endereçamento
esparso, com lacunas deixadas para crescimento, bibliotecas de vinculação
dinâmica, etc
- Bibliotecas de sistema compartilhadas via mapeamento de páginas no espaço de endereçamento virtual de ambos os processos
- Cada processo considera a biblioteca parte de seu espaço virtual, porém, páginas da biblioteca são carregadas apenas uma vez no espaço físico
- Não apenas bibliotecas, mas páginas de dados podem servir para comunicação entre processos
- Páginas podem ser compartilhadas durante o fork(), acelerando a criação de processos
- Estratégia de carregar uma página
(do disco) para memória apenas quando esta for necessária
- Técnica utilizada em sistemas de
memória virtual
- Similar a sistema de paginação
com permuta (swapping)
- Quando um endereço lógico faz
referência a uma página não presente na memória
- Página é buscada no disco e
- Carregada na memória
- Carregamento de processo usa um
Lazy swapper – nunca traz página para memória a menos que página seja necessária
- Swapper: permutador
(processos)
- Pager: paginador (páginas)
- Em tempo de carga, o paginador avalia quais páginas serão usadas
- Se página necessária já está residente na memória
- Nenhuma diferença na paginação comum
- Se página necessária não estiver residente na memória
- Busca página no disco e carrega para a memória
- Se houver uma referência a uma página que não está na memória, a primeira referência à página acionará o Sistema Operacional:
-
- Sistema operacional consulta uma tabela interna (PCB) para decidir se referência é válida ou inválida
- Se referência inválida (bit = i): aborta processo
- Se referência é válida, mas página não está na memória:
- Caso extremo – processo é iniciado sem nenhuma página na memória
- Primeira instrução gera falta de página
- Todo primeiro acesso a uma página, gera falta de página
- Uma instrução pode acessar várias páginas: múltiplas faltas de página
- Considere buscar e decodificar instrução que soma dois números da memória e armazena o resultado de volta na memória
- Números podem estar em páginas diferentes
- Situação é improvável devido à localidade de referência
- Suporte de hardware necessário à paginação por demanda
- Tabela de páginas com bit válido/inválido
- Memória secundária (dispositivo com swap space)
- Reinicialização de instrução
- Exemplo de instrução com três operandos indiretos:
- ADD A,B,C
- C = A + B, cada operando em uma posição de memória
- Passos para execução da instrução:
- Buscar e decodificar a instrução (ADD)
- Buscar o operando A, acessando uma posição de memória
- Buscar o operando B, acessando outra posição de memória
- Somar A com B (Unidade Lógico Aritmética)
- Armazenar a soma em C, uma terceira posição de memória
- Uma falta de página causa a ocorrência da sequência a seguir
- Ações desempenhadas e controladas pelo SO:
- Salva registradores e estado do processo de usuário (Pa)
- Determina que a interrupção é do tipo “falta de página”
- Verifica se a referência à página foi legal e determina a localização da página no disco
- Seleciona um quado da lista de quadros livres
- Dispara uma leitura de disco para transferir a página para um quadro livre
- Espera em uma fila pelo dispositivo até a requisição de leitura seja atendida