Google

segunda-feira, abril 14, 2008

Primeira Lista de Exercícios de Sistemas Operacionais 2

Professora, situação é com S!

Questão 1


O UNIX é composto por três camadas acima do hardware.

  1. Kernel: Acesso direto às funcionalidades do hardware. Possui as chamadas de sistema que dão suporte aos programas de baixo-nível.

  2. Programas de baixo-nível: Camada adjacente ao Kernel que contém os programas de baixo-nível. Podemos caracterizar estes programas como sendo aqueles que fazem uma interface entre o usuário e o Kernel. Por exemplo: who, sh, vi, grepe, comp, gcc, dentre outros.

  3. Programas de alto-nível: Camada mais externa que contém o “cc” e os outros programas. Geralmente a maioria dos programas está nesta camada e são combinações de chamadas de sistema e chamadas a programas de baixo-nível.


A arquitetura em camadas do UNIX favorece o desenvolvimento de programas modulares prezando a coesão com baixo acoplamento, além de possibilitar a portabilidade com pouco trabalho direto no que já foi feito, bastando alterar a camada de Kernel, em tese.


Questão 2


Os dois modos de execução se diferenciam principalmente quanto ao privilégio de acesso aos dados e a algumas instruções de hardware.

  • Modo usuário: Acesso a informações e dados é mais restrito.

  • Modo Kernel: Acesso privilegiado. Requisito para execução de chamadas de sistema.




Questão 3


Porque ao fazer uso do bloco de construção primitiva “|”, faz com que o ouput de um processo seja o input de outro. Isso causa uma execução seqüencial dos processos e não paralela, conforme pretendido ao usar “&” no final dos comandos.


Questão 4


É uma interrupção manipulada. Quando o sistema está executando uma região crítica, as interrupções são proibidas, assim como a troca de contexto. Isso evita que as estruturas de dados (geralmente listas duplamente encadeadas) essenciais para o controle de estado de um processo sejam danificadas, mantendo a consistência dos dados.
O estado asleep de um processo é quanto à execução do mesmo foi interrompida temporariamente e o processo está na memória principal. Neste estado, as mudanças de contexto são permitidas. As interrupções necessitam de eventos externos para sair deste estado, não ele mesmo gerar um.


Questão 5


As regras de transição de estados de um processo são bem definidas e elas que garantem a consistência dos dados das estruturas internas do Kernel.

  1. Mudança de contexto permitida somente quando processo está no estado asleep.

  2. Processos executados em modo Kernel são não-preempitivos.

  3. Preempção pode ser feita pelo sistema em processos do modo usuário.

  4. Interrupções são proibidas, quando em modo Kernel (regiões críticas).

  5. Um processo não pode mudar o estado de outro.




Questão 6


Race condition é a situação quando temos vários processos do sistema acessando e manipulando ao mesmo tempo a mesma informação de maneira concorrente e o resultado da execução depende da ordem particular em que o acesso ocorre. O race condition é considerado um ataque, pois faz com que um invasor eleve seu nível dentro do sistema, conseguindo um uid = 0, ou seja, privilégio de root.
Deve-se ficar atento ao usar as seguintes funções (elas são as principais causas de race condition):

  • access()

  • chown()

  • chgrp()

  • chmod()

  • mktemp()

  • tempnam()

  • tmpfile()

  • tmpnam()




Questão 7



  1. O Kernel deve escrever o conteúdo do buffer no disco para depois usar o buffer. Ele começa uma escrita assíncrona daquele bloco e tenta alocar outro buffer na lista de livres. Quando a escrita termina, aquele espaço é liberado e colocado na cabeça da lista de livres. O Kernel volta apara o início da lista e refaz o algoritmo.

  2. O Kernel remove da lista de livres e começa a escrever os blocos no disco (os do buffer).
    Nas duas situações, o buffer fica bloqueado, pois está sendo usado pelo Kernel.




Questão 8


Ele será colocado no início da fila de livres quando um erro de I/O ocorrer ou quando o buffer for marcado como “old”. Isso acontece justamente devido ao erro ocorrido, o que faz com que o buffer fique livre e pronto para ser usado por outro processo.


Questão 9


O Kernel eleva o nível de prioridade do processador para garantir a execução atômica das chamadas de sistema em modo Kernel. Não há comando específico para elevar a prioridade do processador. Este é o fato pelo qual isto não aparece no algoritmo.


Questão 10


Principalmente devido ao fato de que outros processos que estão em execução podem ter alocado o buffer disputado entre o momento em que foi para asleep e quando foi “acordado”. Assim, recomeçando a busca, o Kernel garante que não haverá disputa pelo mesmo buffer, podendo até otimizar a alocação ao encontrar um buffer livre na cabeça da lista de livres.

Questão 11



  1. O módulo do subsistema de arquivo antecipa à necessidade de leitura de arquivos seqüenciais, requisitando assincronamente à leitura dos dados na memória principal. O processo fica em estado de espera da leitura completa do primeiro bloco. Ao finalizar, o processo é acordado, mesmo sem que a leitura do segundo bloco tenha completado. Quando este é finalizado, o controlador de disco interrompe o sistema, liberando os blocos por se tratar de um I/O assíncrono. Quando o processo necessita do segundo bloco, ele já está em cache. Assim que o primeiro bloco vai para o cache, o Kernel verifica a presença do segundo através da execução do algoritmo descrito acima.

  2. Isso pode ocorrer devido ao fato de que a escrita dos dados em disco são operações assíncronas ou ocorrem com atraso, deixando “lixo” de informação nos buffers.

Nenhum comentário: