Baixe o app para aproveitar ainda mais
Prévia do material em texto
CAPÍTULO 1 1 – Quais são as duas principais funções de um Sistema Operacional? Os sistemas operacionais podem ser analisados de dois pontos de vista: como máquinas estendidas e como gerenciadores de recursos. Como máquina estendida, o SO deve fornecer ao usuário uma visão de máquina virtual que seja mais conveniente ao uso do que a máquina real, com abstrações dos detalhes complicados da execução das tarefas. Já como gerenciador de recursos, o SO tem a função de gerenciar de forma adequada as diferentes partes do computador (CPU, memória, acesso ao disco, etc), a fim de que as aplicações impostas pelo usuário sejam executadas o mais rápido possível. 2 – Qual é a diferença entre modo núcleo e modo usuário? Por que a diferença é importante para um Sistema Operacional? O modo núcleo (também chamado de modo kernel ou supervisor) diz respeito ao modo de execução em que todas as instruções do processador podem ser executadas. Os sistemas operacionais (SO) rodam neste modo de execução. Já o modo usuário refere-se à um modo de execução em que o processador pode executar apenas instruções não-privilegiadas. Os processos do usuário (editores de texto, compiladores, etc) rodam neste modo de execução. Esta distinção serve para proteger o hardware da ação direta do usuário. Caso um processo rodando em modo usuário necessite da execução de uma instrução privilegiada (de acesso ao hardware), o processador deve ser chaveado para o modo usuário, por meio de uma chamada de sistema (system call). 3 – O que é multiprogramação? Multiprogramação é a capacidade do sistema operacional de executar concorrentemente vários processos, alternando-os entre CPU e memória. A vantagem da multiprogramação está no fato dela evitar que a CPU fique ociosa enquanto outros processos em execução estão realizando operações que não requerem seu uso (como, por exemplo, operações de entrada/saída). 4 – O que é spooling? Você acredita que computadores pessoais avançados terão spooling como um recurso padrão no futuro? Spooling (Simultaneous Peripheral Operation On Line – Operação Periférica Simultânea On Line). Spooling de entrada consiste na leitura de jobs (por exemplo, cartões) para o disco, para que, assim que o processo em execução termine, haja jobs prontos para serem processados pela CPU. Spooling de saída consiste na prévia transferência dos arquivos de impressão para o disco. Nos computadores pessoais modernos, não faz mais sentido a utilização de spoolings de entrada, já que todos os dados já estão, desde o início, carregados no disco. Talvez ainda possa ser encontrado spoolings de saída em tarefas de impressão, nas quais é necessário armazenar a fila de impressão para que sejam liberados os recursos da CPU. 5 – Nos primeiros computadores, cada byte de dados lidos ou escrito era diretamente tratado pela CPU (isto é, não havia DMA - Direct Memory Access - acesso direto à memória). Quais são as implicações dessa organização para a multiprogramação? A principal função da multiprogramação é não deixar a CPU ociosa enquanto outros processos em execução estão realizando operações que não requerem seu uso (operações de I/O). No caso de não haver DMA, a CPU ficaria ocupada com as operações de I/O, que podem ser muito demoradas, não podendo realizar outras tarefas. 6 – Por que o tempo compartilhado não era comum em computadores de segunda geração? Nos computadores de segunda geração utilizava-se sistemas de processamento em lote (batch systems). Logo, o tempo de compartilhamento não era comum, uma vez que os computadores utilizados para os cálculos (maiores e mais caros) eram otimizados para o processamento dos programas, ao contrário dos utilizados para os programas de leitura de cartões e impressão de resultados (menores e mais baratos), que não requeriam grande capacidade de processamento. 7 – Quais das seguintes instruções devem ser permitidas somente em modo núcleo? (a) Desabilitar todas as interrupções. (b) Ler o relógio de hora do dia. (c) Configurar o relógio de hora do dia. (d) Mudar o mapeamento de memória. (a), (c) e (d) só devem ser permitidas em modo kernel, uma vez que atuam diretamente sobre o hardware. (b) e poder ser realizadas pelo usuário através de system calls. OBS: Chamada de Sistema (system call) constitui uma interface entre programas aplicativos e o sistema operacional. Ela é uma rotina que provê acesso às funcionalidades do SO, tais como manipulação de arquivos, controle de processo, gerenciamento de memória, etc. 8 – Relacione algumas diferenças entre os sistemas operacionais de computadores pessoais e os sistemas operacionais de computadores de grande porte. SO’s de computadores pessoais são sempre interativos, muitas vezer com apenas um usuário. SO’s para mainframes quase sempre dão ênfase ao processamento em lote (batch) ou tempo de compartilhamento (timesharing) com muitos usuários. Proteção e uso dos recursos são muito mais problemáticos nestes computadores. 9 – Dê um motivo pelo qual um sistema operacional patenteado, de código-fonte fechado, como o Windows, deve ter qualidade melhor do que um sistema operacional de código-fonte aberto, como o Linux. Agora, dê um motivo pelo qual um sistema operacional de código-fonte aberto, como o Linux, deve ter qualidade melhor do que um sistema operacional patenteado, de código-fonte fechado, como o Windows. Código aberto: Um bug pode ser corrigido por qualquer um e a correção disponibilizada publicamente. O mesmo vale para melhorias. Código fechado: Maior suporte e padronização para o desenvolvimento de softwares. 10 – Um arquivo do MINIX, cujo proprietário tem UID = 12 e GID = 1, tem o modo rwxr-x---. Outro usuário, com UID =6, GID = 1, tenta executar o arquivo. O que acontecerá ? Proprietário: rwx; Grupo: rx; Outros: (nada). r: read; w: write; x: execute 11 – Em vista do fato de que a simples existência de um superusuário pode levar a todos os tipos de problemas de segurança, por que existe tal conceito? Superusuário é uma abstração no nível do funcionamento so SO. Seu papel é, basicamente, determinar quais usuários e grupos podem ler, escrever e executar quais arquivos. Portanto, o conceito de superusuário é necessário para restringir o acesso irrestrito a apenas alguns usuários especiais. 12 – Todas as versões do UNIX suportam atribuição de nomes de arquivo usando caminhos absolutos (relativos à raiz) e caminhos relativos (relativos ao diretório de trabalho). É possível descartar um deles e usar apenas o outro? Se for assim, qual deles você sugeriria manter? Sim. Ao meu ver, os caminhos relativos são apenas uma abstração do sistema operacional para o usuário, uma vez que o caminho é concatenado e o sistema utiliza-se sempre do caminho absoluto. Portanto, seria possível eliminar a utilização de caminhos relativos, mantendo apenas a utilização de caminhos absolutos. 13 – Por que a tabela de processos é necessária em um sistema de tempo compartilhado? Ela também seria necessária em sistemas operacionais de computador pessoal, nos quais existe apenas um processo, com esse processo tomando conta da máquina inteira até que termine? A tabela de processos é necessária para manter o estado dos processos que estão atualmente suspensos (em estado de espera ou bloqueados). No caso de SO’s com apenas um processo, esta tabela não é necessária, uma vez que o único processo nunca entra em estado suspenso. 14 – Qual é a diferençabásica entre um arquivo especial de bloco e um arquivo especial de caractere? Os arquivos especiais são utilizados para fazer com que dispositivos de I/O se comportem como arquivos normais. Assim, eles podem ser lidos ou escritos utilizando-se as mesmas chamadas de sistema que se usa para arquivos convencionais. Os arquivos especiais de bloco são utilizados para modelar dispositivos que consistem em um conjunto de blocos endereçáveis aleatóriamente, como os discos. Pode-se, por exemplo, acessar um bloco específico deste arquivo sem se preocupar com a estrutura do sistema de arquivos do disco por ele representado. Os arquivos especiais de caractere são utilizados para modelar dispositivos que aceitam como entrada, ou têm como saída, um fluxo de caracteres, tais como impressoras ou modems. 15 – No MINIX 3, se o usuário 2 cria um vínculo (link) para o arquivo pertencente ao usuário 1 e, então, o usuário 1 remove esse arquivo, o que acontece quando o usuário 2 tenta ler o arquivo? O arquivo continuará acessível. Um arquivo pode ser considerado um apontador para a região do endereço contendo seus dados. Links nada mais são outros apontadores para a mesma região da memória de um arquivo. Portanto, ao remover um arquivo, remove-se apenas o apontador, mantendo-se os dados na memória. Somente quando todos os links forem removidos é que os dados serão excluídos. 16 – Os pipes são um recurso fundamental? Alguma funcionalidade importante seria perdida se eles não estivessem disponíveis? Não, uma vez que seria possível criar um arquivo de saída de um processo e utilizá-lo como entrada de outro, o que realizaria a mesma tarefa dos pipes. Entretanto, os pipes facilitam muito a vida do usuário, uma vez que a técnica utilizada acima necessitaria de uma atenção do usuário quanto à exclusão dos arquivos criados, depois de utilizados. 17 – Os instrumentos modernos para o consumidor, como equipamentos estéreos e câmeras digitais, frequentemente têm uma tela na qual podem ser inseridos comandos e os resultados podem ser vistos. Muitas vezes, esses equipamentos têm interiormente um sistema operacional primitivo. A que parte de um software de computador pessoal o processamento de comandos por meio da tela de um equipamento estéreo ou de uma câmera é semelhante? Ao shell, ou seja, ao interpretador de instuções do sistema operacional. 18 – O Windows não tem uma chamada de sistema fork, embora seja capaz de criar novos processos. Dê um palpite abalizado sobre a semântica da chamada de sistema utilizada pelo Windows para criar novos processos. O Windows nao possui a system call “fork”, mas possui o “CreateProcess” (algo similar a fork + execve). 19 – Por que a chamada de sistema chroot é limitada ao superusuário? (Dica: pense nos problemas de proteção). chroot é uma system call utilizada para alterar a raíz da árvore de diretórios. Pode ser utilizado para que usuários normais (sem privilégios de superusuário) só possam acessar a estrutura de arquivos a partir de um certo nível da árvore. Portanto, por se tratar de uma chamada que envolve a segurança do sistema operacional, deve ser limitada apenas ao superusuário. 20 – Examine a lista de chamadas de sistema da Figura 1-9 (As principais chamadas de sistema do MINIX). Qual delas você acha que provavelmente será executada mais rapidamente? Explique sua resposta. exit, pois não precisara armazenar nenhuma informação do processo, já que este está sendo terminado. 21 – Suponha que um computador possa executar 1 bilhão de instruções/segundo e que uma chamada de sistema ocupe 1000 instruções, incluindo a interrupções e toda a troca de contexto. Quantas chamadas de sistema o computador pode executar por segundo e ainda ter a metade da capacidade da CPU para executar código de aplicativos? Precisaria executar 0,5 bilhões de instruções/s. Logo, se cada system call ocupa 1000 instruções, então serão realizadas 500.000 chamadas a system calls/s. 22 – Existe uma chamada de sistema mknod na Figura 1-9, mas não há chamada rmnod. Isso significa que você precisa tomar muito cuidado ao criar i- nodes dessa maneira porque não há meios de remover todos eles? Não. Os arquivos especiais (dispositivos de I/O) são abstraídos de forma a serem tratados como arquivos normais. Desta forma, podemos removê-los normalmente através do uso de “rm”. 23 – Por que o MINIX 3 tem o programa update executando em segundo plano (background) o tempo todo? O programa “update”, que é lançado na inicialização do MINIX, executa uma chamada “sync” a cada 30 segundos, com o objetivo de esvaziar o cache (flushing). Portanto, é necessário que este programa rode em background para não manter o sistema constantemente ocupado. 24 – Faz algum sentido ignorar o sinal SIGALARM? Se um sinal de alarme não for capturado, a ação padrão será executada, e o processo sinalizado será terminado. Portanto, faz sentido o processador ignorar o sinal SIGALARM, no caso do responsável pelo processo desejar que este seja eliminado ao receber um sinal de alarme. 25 – O modelo cliente-servidor é popular em sistemas distribuídos. Ele também pode ser utilizado em um sistema de um único computador? Sim. Um exemplo é o próprio MINIX 3. Nestes casos, o kernel é chamado de microkernel, pois passa requisições do usuário para servidores (FS, PM, etc), que rodam em modo usuário. Estes servidores têm o objetivo de diminuir a quantidade de processos executando em modo kernel. Desta forma, se um servidor falhar, a máquina não será derrubada. Outra vantagem desta arquitetura é sua capacidade de adaptação para uso em sistemas distribuídos. Se um cliente se comunica com um servidor por meio de mensagens, o cliente não precisa saber se a mensagem é manipulada de forma local ou se foi enviada por um servidor em uma máquina remota. Para o cliente, a situação é a mesma: uma requisição foi enviada e uma resposta retornou. 26 – As versões iniciais do Pentium não suportavam um monitor de máquina virtual. Qual característica fundamental é necessária para permitir que uma máquina possa se tornar virtual? A característica fundamental necessária para que uma máquina possa se tornar virtual é o tratamento de sinais de interrupção. CAPÍTULO 2 1 – Por que a multiprogramação é fundamental para a operação de um sistema operacional moderno? Um SO moderno precisa se adequar a um grande compartilhamento de tempo e a uma grande demanda de processos, isso seria praticamente impossível sem a multiprogramação, com uma organização adequada no armazenamento dos processos através, principalmente, da tabela de processos. 2 – Quais são os três principais estados que um processo pode estar? Descreva sucintamente o significado de cada um. Running (executando): processo utilizando a CPU; Ready (pronto): processo executável. Temporariamente parado, de forma a permitir que outro processo seja executado; Blocked (bloqueado): processo incapaz de executar até que algum evento externo aconteça (e desbloqueie este processo); 3 – Suponha que você fosse projetar uma arquitetura de computador avançada que fizesse a troca de processo em hardware, em vez de ter interrupções. De quais informações a CPU precisaria? Descreva como a troca de processo em hardware poderia funcionar. A CPU precisaria saber o momento em que o processo em execução é bloqueado para fazer a troca por um processo no estado Pronto. Em uma arquitetura mais avançada, a CPU precisaria saber o tempo que o processoestá executando e sua prioridade em relação aos outros processos que estão no estado Pronto para realizar alternância entre processos e gerar sensação de simultaneidade de execução de processos. Isto é, o escalonamento de processos precisaria ser implementado em hardware. Para realizar a troca de processos o hardware deve empilhar o registrador de estado e o "program counter" (PC) e salvar o estado dos registradores do processo em execução. Quando este processo voltar a executar, o hardware desempilha o registrador de estado, o "program counter" (PC) e recupera o estado dos registradores do processo que irá executar. 4 – Em todos os computadores atuais, pelo menos parte das rotinas de tratamento de interrupção é escrita em linguagem assembly. Por quê? Pois os tratamentos de interrupções requerem que a rotina começe salvando o estado dos registradores na tabela de processos e configurando o ponteiro da pilha para uma pilha temporária, utilizada no tratamento da interrupção. Entretanto, estas ações não podem ser expressas em linguagens de alto nível, como C, e, portanto, devem ser escritas em assembly. 5 – Redesenhe a Figura 2-2, adicionando dois novos estados: novo e terminado. Quando um processo é criado, ele está inicialmente no estado novo. Quando ele sai, está no estado terminado. 6 – No texto, foi dito que o modelo da Figura 2-6(a) não era conveniente para um servidor de arquivos usando uma cache na memória. Por que não? Cada processo poderia ter a sua própria cache? Se o servidor de arquivos for programado para utilizar o modelo da figura 2-6(a), mostrada abaixo, cada thread deste servidor possuirá uma área específica de endereçamento de memória. Esta área é utilizada para implementar cache. Logo, cada processo teria cache em uma área diferente da memória. Desta maneira, se uma thread realizar operação de escrita no arquivo X e logo em seguida outra thread realizar uma operação de leitura ou escrita no arquivo X, existe o risco de que a operação realizada pela primeira tenha efeito apenas no cache e não no arquivo gravado, por exemplo, no HD. Logo, a segunda thread estaria operando com um arquivo desatualizado. No momento que uma das threads realizar flushing do cache no HD, poderá existir o problema de uma das versões do arquivo, modificada em uma das threads, ser perdida. Desta maneira, concluí-se que cada processo não poderia ter sua própria cache. 7 – Qual é a diferença fundamental entre um processo e uma thread? Uma thread compartilha seu espaço de endereçamento com outras threads mas tem fluxo de controle próprio, ao passo que um processo possui um espaço de endereçamento e fluxo de controle únicos e portanto, não compartilha recursos com outros processos. 8 – Em um sistema com threads, existe normalmente uma pilha por thread ou uma pilha por processo? Explique. Cada thread possui seu próprio controle e fluxo e, portanto, sua própria pilha. Isso é necessário para que cada thread possa ser interrompida (por escalonamento ou bloqueio) e retomada do mesmo ponto, independente uma das outras. 9 – O que é uma condição de corrida? Condição de corrida é a situação em que dois ou mais processos realizam leitura ou escrita de dados compartilhados e o resultado final depende da ordem e tempo de execução dos processos. 10 – Dê um exemplo de uma condição de corrida que poderia acontecer no momento de comprar passagens de avião por duas pessoas que desejam viajar juntas. O comprador A verifica que existem dois acentos juntos disponíveis; Neste mesmo instante, um comprador B realiza a compra de um dos acentos desejados por A; Quando o comprador A tenta concluir sua compra, verifica que um dos acentos não se encontra mais disponível, impossibilitando-o de comprar os dois acentos juntos. Conclusão: o resultado da compra foi afetado pela ordem das compras realizadas pelos compradores A e B. 17 – Na seção 2.2.4, foi descrita uma situação com um processo de alta prioridade, H, e um processo de baixa prioridade, L, que leva H a entrar em um laço infinito. O mesmo problema ocorrerá se for usado escalonamento round- robin, em vez de escalonamento por prioridade? Discuta. Não, uma vez que, no escalonamento round-robin, o controle da ordem dos processos é feito através do quantum. Portanto, caso um processo entre em seu estado crítico, em loop infinito, o escalonamento irá alternar para outro processo da fila após o fim de seu quantum. 18 – Dentro dos monitores, o sincronismo utiliza variáveis de condição e duas operações especiais, WAIT e SIGNAL. Uma forma mais geral de sincronização seria ter uma única primitiva, WAITUNTIL, que tivesse como parâmetro um predicado booleano arbitrário. Assim, alguém poderia escrever, por exemplo: WAITUNTIL x < 0 or y + z < n A primitive SIGNAL não seria mais necessária. Esse esquema é claramente mais geral do que o de Hoare ou Brinch Hansen, mas não é utilizado. Por que não? (Dica: pense a respeito da implementação.) Pois seria de implementação custosa, uma vez que, cada vez que há uma mudança em alguma variável que aparece em um predicado no qual algum processo está esperando, a rotina de sistema reavalia o predicado para ver se o processo pode ser desbloqueado. Com os monitores de Hoare e Brinch Hansen, os processos só podem ser acordados por meio de uma primitiva de sinal. 19 – Um restaurante fast food tem quatro tipos de funcionários: (1) os atendentes, que anotam os pedidos dos clientes; (2) os cozinheiros, que preparam o alimento; (3) os embaladores, que colocam o alimento em saquinhos; e (4) os caixas, que entregam os saquinhos para os clientes e recebem o dinheiro. Cada funcionário pode ser considerado um processo de comunicação seqüencial. Que forma de comunicação entre processos eles utilizam? Relacione este modelo com os processos no MINIX 3. A comunicação entre os empregados se dá por meio de mensagens: pedidos, comida e saquinhos. Se compararmos com a comunicação de processos do MINIX 3, podemos dizer que os quatro processos estão conectados através de pipes. 20 – Suponha que temos um sistema de passagem de mensagens usando caixas de correio (mailbox). Ao enviar para uma caixa de correio cheia ou ao tentar receber de uma caixa vazia, um processo não é bloqueado. Em vez disso, ele recebe um código de erro. O processo responde ao código de erro apenas tentando novamente, repedidamente, até ser bem-sucedido. Esse esquema leva a condições de corrida? Não, uma vez que nada nunca é perdido. Mas trata-se de uma espera ativa (loop de espera). 21 – Na solução do problema da janta dos filósofos (Figura 2-20), por que a variável de estado é configurada como HUNGRY na função take_forks? Pois caso o filósofo seja bloqueado, seus vizinhos podem, depois, por meio de um teste, verificar seu estado (faminto) através da variável, para que este possa ser desbloqueado assim que os garfos estiverem disponíveis. 22 – Considere a função put_forks da Figura 2-20. Suponha que a variável state[i] tenha sido configurada como THINKING após as duas chamadas para test e não antes. Como essa alteração afetaria a solução para o caso de 3 filósofos? E para 100 filósofos? Nessas condições, assim que o filósofo terminasse de comer, nenhum de seus vizinhos seriam escolhidos para comer, mesmo com os garfos disponíveis. Desta forma, o sistema convergiria para um estado em que todos os filósofos ficam pensando (tanto para 3 quanto para 100 filósofos). 23 – O problema dos leitores e escritores pode ser formulado de várias maneirascom relação a qual categoria de processos pode ser iniciada e quando. Descreva completamente três variações diferentes do problema, cada uma favorecendo (ou não favorecendo) alguma categoria de processos. Para cada variação, especifique o que acontece quando um leitor ou um escritor se torna pronto para acessar a base de dados e o que acontece quando um processo tiver terminado de usar a base de dados. Variação 1: leitores têm prioridade. Assim, nenhum escritor pode iniciar enquanto um leitor estiver ativo. Quando um leitor aparece, pode ser iniciado imediatamente, a não ser que um escritor esteja ativo. Neste caso, quando o escritor terminar, se houver leitores esperando, todos são iniciados, independente da presença de escritores esperando. Variação 2: escritores têm prioridade. Neste caso, nenhum leitor pode iniciar enquanto houver escritoires esperando. Quando o último processo ativo terminar, o escritor é iniciado, se houver um. Caso contrário, todos os leitores, se houver algum, são iniciados. Variação 3: versão simétrica. Quando um leitor está ativo, novos leitores podem ser iniciados imediatamente. Quando o escritor terminar, um novo escritor tem prioridade, se algum estiver esperando. Ou seja, uma vez iniciado os leitores, continua-se com leitores até não haver mais nenhum. Da mesma forma, uma vez iniciado escritores, todos os escritores pendentes estão habilitados para rodar. 24 – Os computaodres CDC 6600 podiam manipular até 10 processos de E/S simultaneamente, usando uma forma interessante de escalonamento round- robin, chamada compartilhamento de processador. Uma troca de processo ocorria após cada instrução, de modo que a instrução 1 vinha do processo 1, a instrução 2 vinha do processo 2, etc. A troca de processo era feita por um hardware especial e a sobrecarga era zero. Se um processo precisasse de T segundos para terminar na ausência de concorrência, de quanto tempo ela precisaria se fosse usado compartilhamento de processador com n processos? Iria precisar de n*T segundos. 25 – Normalmente, os escalonadores round-robin mantêm uma lista de todos os processo executáveis, com cada processo ocorrendo exatamente uma vez na lista. O que aconteceria se um processo ocorresse duas vezes na lista? Você pode imaginar um motivo para permitir isso? Se um processo ocorre múltiplas vezes na lista, significa múltiplos quanta por ciclo para este processo. Isto pode ser usado para dar um maior compartilhamento da CPU para processos de maior importância (uma espécie de prioridade). Entretanto, caso este processo seja bloqueado, é preciso remover todas suas entradas na lista de processos Prontos. 26 – Medidas de determinado sistema mostraram que o processo médio é executado por um tempo T antes de ser bloqueado na E/S. Uma troca de processo exige um tempo S, que é efitivamente desperdiçado (sobrecarga). Para escalonamento round-robin com quantum Q, escreva uma fórmula para a eficiência da CPU para cada uma das opções a seguir: (a) Q = infinito (b) Q > T (c) S < Q < T (d) Q = S (e) Q quase 0 (a) (b) (c) (d) (e) ( ) 27 – Cinco tarefas estão esperando para serem executadas. Seus tempos de execução esperados são 9, 6, 3, 5 e X. Em que ordem elas devem ser executadas para minimizar o tempo de resposta médio? (Sua resposta dependerá de X.) Para minimizar o tempo de resposta médio, utiliza-se o algoritmo de escalonamento SJT (Shortest Job First): Se X < 3 X, 3, 5, 6, 9; Se X = 3 X, 3, 5, 6, 9 ou 3, X, 5, 6, 9; Se X = 4 3, X, 5, 6, 9; Se X = 5 3, X, 5, 6, 9 ou 3, 5, X, 6, 9; Se X = 6 3, 5, X, 6, 9 ou 3, 5, 6, X, 9; Se X = 7 ou X = 8 3, 5, 6, X, 9; Se X = 9 3, 5, 6, X, 9 ou 3, 5, 6, 9, X; Se X > 9 3, 5, 6, 9, X;
Compartilhar