Organização de Computadores - Soluções da 3ª Lista de Exercícios...
IME Organização de Computadores 3ª Lista de Exercícios
Respostas Patrick Baptista Amaral de Lara (
[email protected])
Seção de Engenharia de Computação
INSTITUTO MILITAR DE ENGENHARIA PRAÇA GENERAL TIBÚRCIO 80 – CEP 22290-270 RIO DE JANEIRO – BRASIL
1ª Questão
Com relação à organização da memória cache, quantos bits no total são necessaries para uma cache diretamente mapeada com 32Kbytes de dados e blocos de 8 palavras, considerando um endereço de 32 bits? Endereço da memória cache com 32 KBytes de dados (1K células de 32 Bytes cada); 1K células / endereços: 210 (10 bits para o campo índice do endereço relativo); 32 Bytes: 25 (5 bits para o campo OFFSET do endereço relativo); Cada bloco possui 8 palavras e 32 Bytes: 32Bytes / 8 palavras (4 Bytes / palavra). Endereço 1
bit validade
TAG
1bit
17bits
DADOS
32 Bytes
Endereço 2 .....
Endereço K
Endereço relativo: Endereço de 32 bits. Temos 10 bits para o índice e 5 bits para o OFFSET, sobram 17 bits para etiqueta (TAG). TAG
17 bits
índice
OFFSET
10 bits
5 bits
Então o tamanho da memória cache total será de: 1K blocos * (17 bits de TAG + (8 palavras x 4 Bytes x 8 bits de dados) + 1 bit validade). 1K blocos * (17 + 256 + 1) = 274 Kbits.
2
2ª Questão
Uma falha de cache é caracterizada por uma requisição de dados da cache que não pode ser atendidada porque os dados não estão presents na cache. Explique detalhadamente o controle do processador no tratamento de uma falha de cache. A falha de cache ocorre quando uma requisição de dados da memória cache não pode ser atendida porque os dados não estão presentes na memória cache. Se a cache reportar um acerto, o computador continua usando os dados como se nada tivesse ocorrido. Caso contrário, o tratamento da falha de cache é feito pela unidade de controle do processador, e com um controlador separado que inicia o acesso à memória e preenche novamente a memória cache. É criado então um “stall”, semelhante aos de pipeline, no processador inteiro, basicamente congelando o conteúdo dos registradores temporários e visíveis ao programador, enquanto espera-se a memória. Se um acesso à instrução resultar em uma falha, o conteúdo do registrador de instrução será inválido e para colocar a instrução correta na memória cache é necessário instruir o nível inferior na hierarquia de memória a realizar uma leitura. Como o contador do programa é incrementado no primeiro ciclo de clock da execução nos processadores multiciclo e em pipeline, o endereço da instrução que gera uma falha de memória cache é igual ao valor do contador do programa menos 4. Assim, uma vez tendo o endereço, a memória principal é instruída a fazer uma leitura. Espera-se a memória responder (o acesso deverá levar vários ciclos) e então as “words” são escritas na memória cache.
As etapas a serem realizadas em uma falha de memória cache de instruções são as seguintes: a) Enviar o valor do PC (programm counter) original (PC atual – 4) para a memória principal (MP); b) Instruir a MP a realizar uma leitura e esperar que a memória complete seu acesso; c) Escrever na entrada da cache, colocando os dados da memória na parte dos dados da entrada, escrevendo os bits mais significativos do endereço (vindo da ULA) no campo TAG e ligando o bit de validade; e d) Reiniciar a execução da instrução na primeira etapa, o que buscará novamente a instrução, desta vez encontrando-a na cache – acerto. O controle da cache sobre um acesso de dados é basicamente idêntico: em uma falha, simplesmente suspende-se o processador até que a memória responda com os dados.
3
3ª Questão
Dado um projeto de sistemas operacionais generic, defina suscintamente a funcionalidade dos seguintes blocos abaixo. (a) Processador de Comandos é um programa que transforma comandos do usuário em comandos a serem executados pelo computador. Um exemplo desse tipo de programa é o Command.com, que acompanhava os antigos computadores equipados com MS-DOS. (b) Sistema de Arquivos é o sistema que cuida do armazenamento dos arquivos em díscos rígidos e outros dispositivos. (c) IOCS é o sistema de controle de entrada e saída (E/S ou em inglês “I/O”) – trata do acesso e controle de periféricos de E/S. (d) Rotina de Tratamento de Interrupções. Existem dois tipos de interrupção: de hardware, que é gerada por um evento físico qualquer, como o acionamento de uma tecla, ou a abertura de uma porta, as interrupções de softwares. Em qualquer caso, a ocorrência de uma interrupção faz com que o processador pare o que está fazendo e execute uma rotina previamente programada para cada tipo de interrupção. É a rotina de tratamento de interrupções que identifica a interrupção ocorrida e trata o fluxo convenientemente. (e) Spooler é um dispositivo de armazenamento temporário, para onde os dados são enviados enquanto espram sua necessidade em algum periférico. Um exemplo são os spoolers de impressão, para onde os dados a serem impressão são enviados rapidamente, enquanto a impressora, que é um periférico lento, imprime os mesmos. (f) Despachante é o modulo que dá controle da CPU ao processo selecionado pelo escalonador. Ele envolve a troca de context, troca de usuário, seleção da parte apropriada da memória do pragrama do usuário, etc. (g) Escalonador é a parte do Sistema Operacional que determina quais são os processos que serão executados a cada instante.
4
4ª Questão
Explique sucintamente a conversão dinâmica de endereços em um sistema que gerencia sua memória por segmentação com paginação. Na segmentação com paginação temos que: a) cada programa é segmentado, ou seja, é dividido logicamente em partições ou segmentos: tabela de segmentos; b) cada segmento do programa é então paginado, ou seja, é dividido em outros segmentos de tamanho fixo, chamados páginas, que ocupam espaços não contíguos na Memória Principal: tabela de alocação de páginas; Sendo assim, cada programa possui 1 tabela de segmentos; cada segmento: 1 tabela de páginas; e cada programa: várias tabelas de páginas. O endereço na segmentação com paginação é dividido em três partes: segmento (SEG), página (PAG) e deslocamento (OFFSET), e a conversão dinâmica de endereços envolve duas operações de pesquisa em tabela, de acordo com o esquema abaixo, onde: a) A partir do campo SEG, localizar na tabela de segmentos em qual página aquele segmento foi alocado: indicação da tabela de página; b) na tabela de página indicada, localizar o campo PAG e seu respectivo ponto de carga (endereço absoluto): endereço absoluto do ponto de carga; c) A partir deste endereço absoluto do ponto de carga do programa, efetuar o deslocamento OFFSET, obtendo então o valor absoluto da instrução desejada: endereço absoluto da instrução desejada.
Figura 1: conversão de endereços – segmentação com paginação.
5
5ª Questão
Na arquitetura pipeline, qual a finalidade dos buffers entre os blocos de hardware dos diferentes subciclos do ciclo de instrução? Caso estes sejam retirados, em que isto afetaria a funcionalidade desta arquitetura? Os buffers servem para que os sinais de controle e dados referentes à execução de uma instrução sejam enviados para os estágios seguintes de sua execução, de forma que estes não sejam afetados pelos sinais de controle das novas instruções que entram no pipeline. Eles são necessários para a implementação de “Forwarding” e “Stall” e sem as suas existências, o pipeline seria inviável, porque não teria seus distúrbios tratados, e esse encargo teria que ser resolvido via software, alterando-se a sequência de instruções e colocando-se nos em locais estratégicos.
6ª Questão
O que é memória virtual? Como pode a memória virtual melhorar o throughput? Memória virtual é uma técnica que usa a memória principal (MP) como uma memória cache para armazenamento secundário, normalmente implementada com discos magnéticos e visando, principalmente, permitir o compartilhamento seguro e eficiente da memória entre vários programas. “Throughput” é a quantidade de dados transferidos de um lugar a outro, ou a quantidade
de dados processados em um determinado espaço de tempo. Pode ser considerada como a taxa de transferência efetiva de um sistema, ou seja, sua eficiência. Para entender melhor, considere um grupo de programas executados ao mesmo tempo em um computador. A memória total exigida por todos os programas pode ser muito maior do que a quantidade de memória disponível no computador, mas apenas uma fração dessa memória está sendo usada ativamente em um dado momento. A memória principal precisa conter apenas as partes ativas dos muitos programas, exatamente como uma memória cache contém apenas a parte ativa de um programa. Portanto, o princípio da localidade possibilita a utilização da memória virtual e das caches. A memória virtual nos permite compartilhar eficientemente o processador e a MP, permitindo que mais programas sejam executados ao mesmo tempo, aumentando a eficiência do sistema, ou o seu “throughput”.
Para permitir que vários programas compartilhem a mesma memória, se deve ter a capacidade de proteger os programas uns dos outros, garantindo que um programa só possa ler e escrever nas partes da memória principal atribuídas a ele. Em resumo, a memória virtual é uma memória auxiliar, que funciona como uma extensão da memória principal. Pode ficar armazenada em discos rígidos, em discos flash ou em outros dispositivos de velocidade menor, mas em geral com capacidade maior do que o tamanho da memória principal. Ela funciona como uma extensão da memória principal do computador, e como permite que mais programas sejam executados ao mesmo tempo, aumenta a eficiência do sistema (throughput).
6
7ª Questão
O que é uma interrupção? Explique a relação entre interrupção e o despachante. Interrupção é um evento de hardware, sendo por exemplo a mudança do estado de um sinal elétrico, ou um evento de software, como por exemplo a ocorrência de uma exceção, que desvia o fluxo de execução do processador para rotinas pré-determinadas. Pode ser usado, por exemplo, pelo despachante que, ao receber uma interrupção do relógio do computador, execute a troca de contexto. Lembrando que o despachante é o módulo que dá o controle da CPU ao processo selecionado pelo escalonador. Ele envolve a troca de contexto, troca de usuário, seleção da parte apropriada da memória do programa do usuário, etc.
8ª Questão
Geralmente, quanto maior a quantidade de programas na memória, maior será a utilização do processador. Explique por quê. O Sistema Operacional necessita de uma determinada quantidade de ciclos de processamento para realizar as tarefas necessárias ao escalonamento dos diversos programas em execução. Somente um programa pode ocupar a CPU por vez. Todos os demais ficam em estados latentes, ou na fila de pronto, onde aguardam sua vez na execução, ou na fila de espera, onde aguardam o término de alguma solicitação feita. Quando um programa tem seu tempo de execução esgotado, mas ainda não atingiu o término de sua execução, vai para o final da fila de pronto, enquanto outro programa ganha sua vez de execução. Para não haver perda dos dados processados, o estado dos registradores é guardado na memória, e resgatado imediatamente antes do retorno do programa à execução. A configuração dos registradores da CPU é chamada contexto do programa. Com poucos programas concorrendo para a CPU, o somatório do tempo gasto para gerenciar um ciclo completo de escalonamento é pequeno, quando comparado com o tempo de execução de cada programa. Esse tempo de utilização de CPU, que é aparentemente perdido pelo usuário, é chamado de “overhead”. Quanto mais programas na memória, maior será o “overhead”, então mais tempo de CPU
será gasto em trocas de contexto e escalonamento dos programas. Ou seja, quanto mais programas em memória, maior será a presença do escalonador na CPU, ocupando ciclos de processamento que poderiam ser gastos com as aplicações do usuário.
7
9ª Questão
Explique a diferença entre um endereço absoluto e um endereço relativo. Por que ambos os tipos são necessários? A memória é um conjunto limitado de semicondutores. Cada célula de memória é capaz de reter informações, que precisam ser guardadas e recuperadas. Essa recuperação é feita através do endereço da célula. O endereço absoluto de uma célula de memória é o seu endereço real, o endereço físico, do barramento, utilizado pelo hardware. Cada localização de memória no computador tem um único endereço absoluto, então o endereço absoluto de uma célula de memória será sempre o mesmo. Embora imprescindível para o hardware, o endereço absoluto é inconveniente para o software, principalmente pelos seguintes fatores: a) a referência a endereços absolutos pode restringir um programa a um ponto de carga fixo, o que seria aceitável em sistemas monousuários, mas em multiprogramação, a especificação de endereços absolutos pode obrigar o programa a esperar que uma determinada região da memória se torne disponível, o que pode nunca acontecer. b) outro problema é o tamanho da instrução. Uma instrução normalmente consiste no código de operação e dois operandos, podendo cada um deles ser um endereço na memória principal. Assim, uma instrução que cite duas localizações da memória principal teria que conter dois operandos com, por exemplo, 32 bits cada, perfazendo uma instrução de pelo menos 64 bits. Com instruções tão grandes, seria necessário muita memória para executar uma simples função, além da transferência de 64 bits (barramentos de 32 bits) requerer duas operações de busca. Múltiplas operações de busca tomam tempo, o que significa poucas instruções por segundo. Então, o endereço relativo é uma solução muito utilizada, onde os programas são escritos como se começassem no endereço “0” e todas as partes de um programa são endereçadas relativamente ao seu ponto de entrada. Quando o programa é carregado na memória, o endereço absoluto de seu ponto de entrada é carregado em um registrador base. Quando o programa é executado, e as instruções são localizadas, os endereços nos operandos são expressos em termos relativos. O endereço absoluto de qualquer localização referenciada é calculado pelo processador por meio da soma de seu deslocamento com o endereço baixo, como mostrado a seguir: Registrador-base
Endereço Relativo
BASE 10000
BASE B
OFFSET 100
Endereço absoluto 10000
+
100
O emprego do endereçamento base + deslocamento apresenta vantagens, por exemplo: a) um programa pode ser relocado na memória a cada vez que é carregado. Se o programa for carregado no endereço absoluto 10000, por exemplo, seu 100º byte estará no endereço absoluto 10100. Se em sua execução seguinte for carregado na posição 20000, seu 100º byte estará no endereço absoluto 20100. Em qualquer caso, a referência ao endereço base mais 100 resultará no 100º byte do programa. b) tamanho de instrução reduzido, por não utilizar o endereço absoluto do operando, reduzindo o tamanho necessário ao campo operando da instrução. Como os softwares manipulam endereços relativos, o que permite que um programa seja armazenado em qualquer posição da memória, já que suas posições relativas serão mantidas em relação ao endereço “base” onde ele estiver carregado, e o hardware exige endereços absolutos (a instrução a ser executada tem os endereços de seus operandos convertidos), a existência dos dois tipos de endereços é importante para que vários programas possam ser alocados na memória simultaneamente de forma mais otimizada. O endereço passa a ser feito por partes fixas, mais as partes relativas, referentes a distribuição de cada programa na memória. 8
10ª Questão
Por que os sistemas de gerenciamento de memória orientados para páginas são mais fáceis de implementar do que os sistemas de gerenciamento de memória orientados para segmentos? Tanto a paginação quanto a segmentação são sistemas de gerenciamento da memória que dividem o programa em segmentos que são alocados posteriormente em partições não contíguas da memória. A principal diferença entre paginação e segmentação é relativa ao tamanho deste segmento. Na paginação, o segmento tem um tamanho fixo, que é o tamanho da página, geralmente de tamanho bem pequeno (8K). A memória física (sistema) e a memória lógica (processo) são divididos em blocos de tamanho fixo e idênticos: blocos físicos são chamados de “frames” e blocos lógicos são chamados de páginas. Na segmentação, o programa é dividido logicamente, ou seja, a alocação é de maneira não fixa, pois o tamanho depende da lógica do programa. A necessidade de divisão da memória em função da lógica do programa traz uma complexidade extra para as implementações orientadas à segmentação. Não é possível prever em quantos segmentos a memória será dividida. Esta imprevisibilidade torna o algoritmo de controle excessivamente complexo. Na paginação, uma vez definido o tamanho da página, é simples definir a quantidade de páginas existentes. Desta forma, em alguns casos, a segmentação, mesmo sendo mais eficiente, é preterida, em função da complexidade envolvida, no desenvolvimento do Sistema Operacional.
9
11ª Questão
Com relação ao Gerenciador de Memória e à conversão dinâmica de endereços, explique sucintamente: (a) a diferença entre um endereço absoluto e um endereço relativo e por que ambos os tipos são necessários Como já explicado na resposta da 9ª questão, o endereço absoluto é o endereço físico de hardware. São os endereços utilizados pelo hardware para o acesso à memória. O endereço relativo é aquele que corresponde a um local na memória que deve ser traduzido para um endereço físico quando o acesso é feito. Esta tradução é feita pois o endereço relativo é composto por dois campos: BASE, indicando o endereço do registrador-base, que armazena o endereço absoluto referente ao ponto de carga do programa, e OFFSET, indicando o deslocamento da instrução referenciada, em relação ao ponto de carga. É conveniente para o software. Ambos os tipos de endereço são necessários pois a memória pode ser acessada pelo seu endereço absoluto (acesso ao nível da máquina) e pelo seu endereço relativo (acesso ao nível do programador), sendo este último, um nome ao qual o computador faz corresponder um determinado endereço físico. A Unidade Central sempre realiza a conversão de endereços, pois o hardware trabalha com endereços absolutos. (b) a implementação da alocação dinâmica de memória A alocação dinâmica de memória consiste em disponibilizar a divisão dos blocos de memória de uma maneira dinâmica da primeira vez que o acesso é realizado. Sendo assim, em cada novo primeiro acesso, os blocos contidos podem assumir determinados valores não pré-alocados. Porém, após este primeiro acesso ser realizado, os blocos permanecem com os tamanhos alocados dinamicamente até uma reinicialização dos acessos. Podemos definir que antes do primeiro acesso, o gerenciamento realizado é dinâmico, e após isso, passa a ser um gerenciamento equivalente ao de “Partições Variáveis”. (c) a implementação da segmentação e a sua conversão de endereços A segmentação divide o espaço de endereçamento em segmentos, que podem ter tamanho arbitrário. Cada segmento é definido segundo a lógica e armazenados em espaços não-contíguos da Memória Princial. Quando a segmentação é usada com memória virtual, o tamanho do espaço de endereçamento de cada segmento pode ser muito grande, e portanto a memória física dedicada a cada segmento não é reservada até ser necessária. Na conversão de endereços da segmentação, o endereço relativo que deve ser convertido é formado pelo campo de índice da Tabela de segmentos e pelo campo OFFSET (deslocamento da instrução). A partir do índice da tabela de segmentos, é coletado o ponto de carga referente aquele índice. Este ponto de carga é somado ao campo OFFSET, resultando no endereço absoluto. (d) a implementação da paginação e a sua conversão de endereços Na paginação o espaço de endereçamento é particionado em blocos de tamanhos iguais (geralmente 8KB), chamados de páginas. A paginação faz com que a memória física demonstre ser maior do que realmente é mapeando o espaço de endereçamento de memória física a um espaço de endereçamento de memória virtual, que é normalmente armazenado em disco. Na Conversão de endereços da paginação, o endereço relativo que deve ser convertido é formado pelo campo de índice da Tabela de páginas e pelo campo OFFSET (deslocamento da instrução). A partir do índice da tabela de páginas, é coletado o ponto de carga referente aquele índice. Este ponto de carga é somado ao campo OFFSET, resultando no endereço absoluto.
10
(e) a implementação da segmentação com paginação e a sua conversão de endereços Na segmentação com paginação, cada segmento é carregado em um conjunto de páginas (espaço virtual segmentado, e espaço físico divido em páginas). Cada entrada na tabela de segmentos permite fazer acesso à tabela de páginas para esse segmento. Para obter o endereço real, é coletado no segmento referenciado na palavra, o endereço na tabela de páginas daquele segmento; o ponto de carga da página referenciada é buscado na tabela de páginas do segmento; então, para obter o endereço real, é adicionado a este valor o deslocamento da instrução (OFFSET), juntamente com o ponto de carga da página.
12ª Questão
Uma falha de cache é caracterizada por uma requisição de dados da cache que não pode ser atendida porque os dados não estão presents na cache. Explique detalhadamente o controle do processador no tratamento de uma falha de cache. Questão já explicada na resposta da 2ª Questão.
11
13ª Questão
Por que um compilador poderia realizar a seguinte otimização? /* Antes */ for (j=0; j