Baixe o app para aproveitar ainda mais
Prévia do material em texto
INSTITUTO FEDERAL GOIANO -CAMPUS URUTAÍ KASSIO FELIPPE DOS SANTOS SILVA SISTEMAS DE INFORMAÇÃO SISTEMAS OPERACIOANAIS: ATIVIDADE 6 Urutaí - março/2019 Atividade do slide 1 - O que é pseudoparelismo? Pseudo-paralelismo,permite que sistemas monoprocessados executem vários processos em um determinado intervalo de tempo. O pseudo paralelismo consiste em um mecanismo usado pela CPU para que essa venha a realizar várias vezes a troca de um processo para outro, mesmo que virtualmente cada processo tenha uma CPU virtual. 2 - Podemos criar programas baseados somente no critério tempo? Justifique. Sim. Os Sistema Operacional de Tempo Real são feitos dessa forma, são sistemas operacionais destinado à execução de múltiplas tarefas onde o tempo de resposta a um evento (externo ou interno) é pré-definido; não importando, como é comum pensar-se, se a velocidade de resposta é elevada ou não. Esse tempo de resposta é chamado de prazo da tarefa e a perda de um prazo, isto é, o não cumprimento de uma tarefa dentro do prazo esperado, caracteriza uma falha do sistema. 3 – Cite eventos que causam a criação de processos. Há várias razões para o início de um processo, os principais são: Inicio do sistema; Solicitação de chamada de execução ao sistema de criação de processo; Solicitação do usuário; Início de um job em lote. Quando se cria um processo, o sistema operacional realiza os seguintes passos: Atribui um identificador único ao processo. Cria-se o BCP, mas só se preenche o campo do identificador. Atribui memória ao processo. Inicializa o BCP. Inserir o processo na lista de processos que corresponda. Por exemplo na lista de processos prontos. Outras operações, como atualizar todas as estruturas de controle que mantenha o sistema opera 4 – Cite os eventos que causam o termino de um processo. Os processos podem terminar de forma voluntária e involuntária. Aqui estão alguns exemplos de motivos para os processos cessarem sua execução e sua forma: Saída normal: A tarefa anteriormente solicitada já terminou sua execução (saída voluntária); Saída por erro: O arquivo não é encontrado (saída voluntária); Erro fatal: é efetuado uma divisão por 0 (saída involuntária); Cancelamento por um outro processo: kill, TerminateProcess (saída involuntária). 5 – Quais os estados de um processo? Comente. Não Submetido É o processo que ainda não está submetido à CPU, está nas mãos do usuário. "Até onde interessa aos sistemas, ele não existe, porque o usuário ainda não o submeteu. Ele é simplesmente apresentado como sendo o primeiro passo na vida de um processo. O Sistema Operacional, naturalmente, não reconhece esse estado.". Pode por exemplo, ser um arquivo executável que está armazenado no HD. Suspenso É o processo que já foi submetido, porém permanece suspenso até que o horário ou evento programado ao usuário venha acontecer. Processo suspenso é aquele que esta no aguarde de uma entrada de dados de forma continua. Pronto O processo já foi submetido e está pronto para receber a CPU, porém ainda aguarda o escalonador de processos para ter controle da CPU. Processos que estão esperando E/S não se aplicam a esse estado. Executando A execução propriamente dita. O código está sendo processado. Se ocorrer durante a execução uma requisição de E/S o processo é colocado no estado de espera e outro processo da fila de prontos poderá então concorrer a CPU. Espera É o processo que foi colocado na fila de espera de E/S devido ao processador de E/S ser mais lento que a CPU principal. O processo tornaria a CPU mais escrava dele se não houvesse esse estado, pois como ele não está concorrendo à CPU ao executar um E/S, pode-se então colocá-lo no estado de espera para que os demais processos do estado pronto possam concorrer a CPU. Ex: parte de um código em C scanf(“%d”, &VALOR); SOMA=VALOR+JUROS; Como podemos notar, a instrução scanf (uma requisição de entrada e saída) é gerada se não fosse possível colocar o processo em estado de espera; caso o usuário não entrasse com nenhum valor, o programa ficaria suspenso e não liberaria a CPU para outros processos. Completo Neste estado temos a finalização do processo. 6 – Quais as vantagens de utilizarmos threads? Uma das vantagens é que eles facilitam o desenvolvimento, visto que torna possível elaborar e criar o programa em módulos, experimentando-os isoladamente no lugar de escrever em um único bloco de código. Outro benefício dos threads é que eles não deixam o processo parado, pois quando um deles está aguardando um determinado dispositivo de entrada ou saída, ou ainda outro recurso do sistema, outro thread pode estar trabalhando. 7 - O que são processos multithread? Cite um exemplo. Multithreading é a capacidade que o sistema operacional possui de executar várias threads simultaneamente sem que uma interfira na outra. Estas threads compartilham os recursos do processo, mas são capazes de ser executadas de forma independente. Para possuir processamento multithread “real”, os processadores precisam ser capazes de atender duas ou mais threads ao mesmo tempo e não simular este efeito, atendendo-as uma por vez em um curto período de tempo. Um Exemplo de multithread é que você pode construir uma suite e separar seu processamento em várias instâncias para agilizar a conclusão gravando em disco os resultados. 8 – Porque não há proteção entre threads? Threads de uma mesma tarefa, não tem proteção entre umas das outras, pois elas compartilham dados umas com as outras, ou seja, elas cooperam. Já quando se pensa em threads de processos distintos a proteção das threads é importante, já que elas podem ser hostis, pois ela competem pelo processador. 9 – O que são Pthreads? Os threads que usam a API (Interface de Programação de Aplicativos) de thread POSIX são chamados de Pthreads. É suportado pela maioria dos sistemas UNIX. A especificação POSIX determina que os registradores do processador, a pilha e a máscara de sinal sejam mantidos individualmente para cada thread. A especificação POSIX especifica como os sistemas operacionais devem emitir sinais a Pthreads, além de especificar diversos modos de cancelamento de thread. Um novo thread é criado usando a chamada pthread_create. Quando um thread terminou o trabalho para o qual foi designado, pode concluir chamando pthread_exit. 10 - Cite as vantagens e desvantagens de se implementar threads no espaço do usuário. A maior vantagem de implementar threads no espaço do usuário é que elas são escalonadas pelo programador, tendo grande vantagem de cada processo usar um algoritmo de escalonamento que melhor se adapte a situação, o sistema operacional neste tipo de thread não faz o escalonamento. Neste modo o programador é responsável por cria, executar, escalonar e destruir a thread. A maior desvantagem é se um thread fizer uma chamada bloqueante, todo o processo estará bloqueado, pois o kernel não tem acesso ao mesmo. 11 - Cite as vantagens e desvantagens de se implementar threads no núcleo. O núcleo oferece suporte a threads. O uso delas é mais lento. O Sistema Operacional pode escalonar mais eficientemente as threads, inclusive em máquinas multi-processadas. No entanto, uma das desvantagens é que com vários threads o trabalho fica mais complexo, justamente por causa da interação que ocorre entre eles. 12 – O que são ativações do escalonador? Ativações do escalonador servem para imitar a funcionalidade dos threads de núcleo, ganha desempenho de threads de usuário, evita transições usuário/núcleo desnecessárias, núcleo atribui processadores virtuais para cada processo – deixa o sistema supervisor alocar threads para processadores Problema: Baseia-se fundamentalmente nos upcalls - o núcleo (camada inferior) chamandoprocedimentos no espaço do usuário (camada superior). 13 – O que são threads pop-up? Threads pop-up são threads novas, criadas para processar algum evento , requisição de serviço Iniciam em um novo contexto, são mais rápidas, não há contexto a restaurar, latência para iniciar processamento é mínima e geralmente criadas no núcleo. 14 - Cite duas dificuldades para converter códigos monothreads em multithreads. O código de um thread em geral consiste em múltiplas rotinas, exatamente como um processo. Essas rotinas podem ter variáveis locais, variáveis globais e parâmetros. Variáveis locais e de parâmetros não causam problema algum, mas variáveis que são globais para um thread, mas não globais para o programa inteiro, são um problema. Essas são variáveis que são globais no sentido de que muitos procedimentos dentro do thread as usam (como poderiam usar qualquer variável global), mas outros threads devem logicamente deixá-las sozinhas. O próximo problema em transformar um programa de um único thread em um programa com múltiplos threads é que muitas rotinas de biblioteca não são reentrantes. Isto é, elas não foram projetadas para ter uma segunda chamada feita para uma rotina enquanto uma anterior ainda não tiver sido concluída. 15 – Defina condição de corrida. Uma condição de corrida é uma falha num sistema ou processo em que o resultado do processo é inesperadamente dependente da sequência ou sincronia doutros eventos. Apesar de ser conhecido em português por 'condição de corrida' uma tradução melhor seria 'condição de concorrência' pois o problema está relacionado justamente ao gerenciamento da concorrência entre processos teoricamente simultâneos. O fenômeno pode ocorrer em sistemas eletrônicos, especialmente em circuitos lógicos, e em programas de computador, especialmente no uso de multitarefa ou computação distribuída. 16 – Defina região crítica. Em programação concorrente, uma região crítica - também conhecida por seção crítica ou secção crítica - é uma área de código de um algoritmo que acessa um recurso compartilhado que não pode ser acedido concorrentemente por mais de uma linha de execução. 17 - Cite e comente 3 soluções para exclusão mútua com espera ociosa. 1a solução: O algoritmo de Peterson é um algoritmo de programação concorrente para exclusão mútua, que permite a dois ou mais processos ou subprocessos compartilharem um recurso sem conflitos, utilizando apenas memória compartilhada para a comunicação. Ele foi formulado por Gary L. Peterson em 1981. Embora a formulação original de Peterson funcionasse apenas com dois processos, o algoritmo pode ser estendido para mais processos. Como funciona: qi, i= 1,2: variável compartilhada, só alterada pelo processo Pi valor 0 fora da RC e colocada em 1 quando processo Pi "quer" entrar na RC, permanecendo em 1 até Pi entrar e sair da RC. vez: variável compartilhada, alterada por P1 e P2 P1 P2 loop forever loop forever q1:= 1 q2:= 1 vez := 1 vez := 2 loop while(vez =1 and q2 = 1) loop while(vez = 2 and q1 = 1) RC RC q1:= 0 q2:= 0 RNC RNC endloop endloop O código executado por um processo desde o instante em que deseja entrar na RC até o momento em que entra na RC é chamado de protocolo de entrada da RC e o código executado ao liberar a RC é chamado de protocolo de saída da RC. Normalmente eles seriam encapsulados em duas funções, digamos, enter_cs() e leave_cs(). No algoritmo acima o protocolo de entrada de P1 começa com a atribuição q1 := 1 e termina na saída do laço loop while(). O protocolo de saída é simplesmente a atribuição q1 := 0. 2a solução: Ela lê o conteúdo da memória, a palavra LOCK, no registrador RX. Armazena um valor diferente de zero (no caso, 1) no endereço da memória LOCK. As operações de leitura e armazenamento da palavra são seguramente indivisíveis – nenhum outro processo pode terminar. A CPU que está executando a instrução TSL impede o acesso ao barramento de memória para proibir que outras CPUs tenham acesso à memória enquanto ela não terminar. enter_region: TSL RX, LOCK CMP RX, #0 JNE enter_region RET leave_region: MOVE LOCK, #0 RET 3a solução: Algoritmo da "padaria" idéia básica: para entrar na RC cada processo calcula o valor de um "billhte" ou "senha" > que o maior bilhete ainda não usado pelos seus pares. O processo com o bilhete de menor número tem preferência para entrar na RC. Pode haver empates no cálculo concorrente do valor do bilhete. Nesse caso o processo com menor número tem preferência (regra de desempate) Notação: qi, i= 1,2, ... N: tem o mesmo objetivo que acima, vale 0 fora da RC e colocada em 1 por Pi quando Pi "quer" entrar na RC permanecendo em 1 até Pi sair da RC. ci, i= 1,2, ... N : vale 0 fora da RC e após Pi ter obtido o seu "bilhete"; colocada em 1 por Pi quando este está calculando o valor do seu bilhete Observe que tanto qi quanto ci só sâo escritas pelo processo Pi, mas são lidas por todos os outros. Código de Pi loop forever ci:= 1 qi:= 1 + max (q1, q2, ..., qN) ci:= 0 for j =1, step 1 until N do loop while (cj != 0) loop while (qj != 0 and (qj, j) < (qi, i) ) (*) endfor RC qi := 0 RNC endloop (*) (qj, j) < (qi, i) se qj < qi ou qj = qi e j < i (comparação lexicográfica) 18 - Descreva o funcionamento do chaveamento obrigatório. Chaveamento obrigatório Utiliza a variável inteira turn . A variável turn indica a vez de quem é de entrar na região crítica; Se um dos processos for mais lento que o outro requer a solução estritamente alternada; Espera ocupada: teste contínuo do valor esperando por uma mudança. while (TRUE) { while (TRUE) { while (turn != 0); while (turn != 0); turn = 1; turn = 1; critical_region(); critical_region(); turn = 0; turn = 0; noncritical_region(); noncritical_region(); } } (a) (b) 19 - Descreva o funcionamento da instrução TSL. • Testa e modifica o conteúdo de uma posição de memória de forma atómica. • A instrução corresponde à função: int TSL(int *m){ int r; r= *m; *m= 1; return r; } • A execução da função TSL(m) tem de ser indivisível, i.e. nenhum outro processo pode aceder à posição de memória m até que a instrução tenha sido executada. 20 - Qual o problema de se trabalhar com espera ociosa. O problema de se trabalhar com espera ociosa é que o processo ficará conferindo se o processo em execução já saiu da zona crítica e isso por si só já consome processamento sem o processo em espera estar realmente em execução. 21- De forma resumida, diga no que consiste o problema do produtor-consumidor. Chamado de Produtor e o Consumidor (também conhecido como o problema do buffer limitado), consiste em um conjunto de processos que compartilham um mesmo buffer. Os processos chamados produtores põem informação no buffer. Os processos chamados consumidores retiram informação deste buffer. 22 – Como funciona as variáveis de condições? Variáveis tipo condição associadas a um mutex (i. é, a uma RC - Região Crítica) e operações sobre as mesmas foram introduzidas na biblioteca pthreads com o objetivo específico de evitar "uma situação de corrida onde um thread se prepara para esperar por uma condição e um outro thread sinaliza a condição imediatamente antes do primeiro thread realmente esperar por ela" (do man page: pthread_cond_wait). 22 – O que são os monitores? O monitor consiste de um conjunto de procedimentos para permitir a manipulação de um recurso compartilhado, uma trava de exclusão mútua, as variáveis associadas ao recurso e uma invariante que define as premissas para evitar disputa de recursos. 23 - Cite as vantagens e desvantagens dos monitores sobre os semáforos. Monitores dependem de uma linguagem de programação – poucas linguagens suportamMonitores; Nenhuma das soluções provê troca de informações entre processo que estão em diferentes máquinas; Sistemas baseados em algoritmos de exclusão mútua ou semáforos estão sujeitos a erros de programação. Embora estes devam estar inseridos no código do processo, não existe nenhuma reivindicação formal da sua presença. Assim, erros e omissões (deliberados ou não) podem existir e a exclusão mútua pode não ser atingida. 24 – Quais os principais problemas enfrentados pela troca de mensagem? Se nenhuma mensagem estiver disponível, o receptor pode bloquear até que uma chegue. Alternativamente, ele pode retornar imediatamente com um código de erro. Outro fator importante a considerar é o da autenticação, de forma a garantir que os dados estão sendo realmente recebidos do servidor requisitado, e não de um impostor, e também para que o servidor saber com certeza qual cliente que requisitou. Em geral a encriptação das mensagens com alguma chave é útil. 25 - Porque nos computadores pessoais o escalomanento não é tão importante quanto nos servidores e estações de trabalho? Com os Sistemas de tempo compartilhado, o algoritmo de escalonamento tornou-se mais complexo porque, em geral, havia vários usuários esperando por um serviço. Alguns computadores de grande porte ainda combinam serviços em lote de tempo compartilhado, exigindo assim, que o escalonador decida se um Job em lote ou um usuário interativo em um terminal deve ser atendido. Com o advento dos computadores pessoais, a situação mudou de duas maneiras. Primeiramente, na maior parte do tempo existe apenas um processo ativo. É improvável que um usuário esteja, simultaneamente, entrando com um documento em um processador de textos e copilando um programa em segundo plano. A maioria dos programas para computadores pessoais é limitada pela velocidade com que o usuário pode entrar dados e não pela taxa na qual a CPU é capaz de processá- los. Quando nos concentramos em servidores e estações de trabalho de alto desempenho em rede, a situação muda. Nesse caso, é comum haver múltiplos processos competindo pela CPU, e, portanto, o escalonamento torna-se importante. 26 - Em qual(is) situação(ões) deve ser tomada a decisão de escalonar um processo? A decisão de escalonar um processo deve ser tomada quando a mais de um processo tentado requisitando o acesso a zona crítica. 27 - Diferencie vazão e tempo de retorno. A vazão é o número de tarefas por horas que o sistema completa. Considerados todos os fatores, terminar 50 tarefas por hora é melhor que terminar 40 tarefas por hora. O tempo de retorno é estatisticamente o tempo médio do momento em que a tarefa em lote é submetida até o momento em que ela é concluída. Ele mede quanto tempo o usuário médio tem de esperar pela saída. Aqui a regra é: menos é mais. 28 - Um dos objetivos dos sistemas interativos é a proporcionalidade. O que vem a ser proporcionalidade? Proporcionalidade é satisfazer às expectativas dos usuário. 29 - O escalonador nem sempre toma as melhores decisões. Como melhorar isto? A solução desse problema é separar o mecanismo de escalonamento da política de escalonamento, um princípio há muito estabelecido (LEVIN et al., 1975). O que isso significa é que o algoritmo de escalonamento é parametrizado de alguma maneira, mas os parâmetros podem estar preenchidos pelos processos dos usuários. 30 - Diferencie o funcionamento dos algoritmos: menor tempo restante e tarefa mais curta primeiro. O algoritmo de escalonamento proporciona os menores tempos médios de execução e de espera é conhecido como menor tarefa primeiro, ou SJF (Shortest Job First). Como o nome indica, ele consiste em atribuir o processador à menor (mais curta) tarefa da fila de tarefas prontas. Uma versão preemptiva da tarefa mais curta primeiro é o tempo restante mais curto em seguida (shortest remaining time next). Com esse algoritmo, o escalonador escolhe o processo cujo tempo de execução restante é o mais curto. De novo, o tempo de execução precisa ser conhecido antecipadamente. Quando uma nova tarefa chega, seu tempo total é comparado com o tempo restante do processo atual. Se a nova tarefa precisa de menos tempo para terminar do que o processo atual, este é suspenso e a nova tarefa iniciada. Esse esquema permite que tarefas curtas novas tenham um bom desempenho. 31 - Como funciona o algoritmo de escalonamento round-robim. Round-robin (RR) é um dos algoritmos mais simples de agendamento de processos em um sistema operacional, que atribui frações de tempo para cada processo em partes iguais e de forma circular, manipulando todos os processos sem prioridades. Escalonamento Round-Robin é simples e fácil de implementar. Este escalonamento também pode ser aplicado em outros problemas de agendamento, como agendamento de transmissão de pacotes de dados em redes de computadores. O nome do algoritmo vem do principio de round-robin conhecido em outras áreas, onde cada pessoa compartilha equatorialmente uma determinada tarefa 32 - Diferencie escalonamento por prioridade e escalonamento por filas múltiplas. No escalonamento por prioridades a cada processo é designada uma prioridade, e o processo executável com a prioridade mais alta é autorizado a executar. Para evitar que processos de prioridade mais alta executem indefinidamente, o escalonador talvez diminua a prioridade do processo que está sendo executado em cada tique do relógio (isto é, em cada interrupção do relógio). Se essa ação faz que a prioridade caia abaixo daquela do próximo processo com a prioridade mais alta, ocorre um chaveamento de processo. Um dos primeiros escalonadores de prioridade foi em CTSS, o CTSS tinha o problema que o chaveamento de processo era lento, pois o 7094 conseguia armazenar apenas um processo na memória e isso era mais lento. Os projetistas do CTSS logo perceberam que era mais eficiente dar aos processos limitados pela CPU um grande quantum de vez em quando, em vez de dar a eles pequenos quanta frequentemente (para reduzir as operações de troca), e dar a processos grandes quantidades de quanta é ruim, porque demanda tempo. A solução foi estabelecer classes de prioridade. Processos na classe mais alta seriam executados por dois quanta. Processos na classe se- guinte seriam executados por quatro quanta etc. Sempre que um processo consumia todos os quanta alocados para ele, era movido para uma classe inferior. Assim funcionava o escalonador por filas múltiplas. 32 - Quais os tipos de escalonamento de threads possíveis? • Escalonador de curto prazo: Seleciona entre os processos em estado de pronto que estão na memória, para serem executados pelo processador. O escalonador de curto prazo faz decisões de escalonamento muito mais frequentemente que os de médio e longo prazo. • Escalonador de médio prazo: Seleciona entre os processos que estão na memória virtual. Ele temporariamente remove o processo da memória principal e o coloca na memória secundária (swap) fazendo as operações de swapping in e swapping out. • Escalonador de longo prazo: Seleciona os processos que estão na memória secundária e que serão levados para a memória principal. Geralmente este escalonador é responsável pelo Grau de Multiprogramação. 33 - Descreva no que consiste a idéia básica envolvida no problema do jantar dos filósofos. Em ciência da computação, o problema do jantar dos filósofos é um exemplo ilustrativo de um problema comum de programação concorrente. É mais um problema clássico de sincronização multi-processo. O problema pode ser resumido como cinco filósofos sentados ao redor de uma mesa redonda, cada qual fazendo exclusivamente uma das duas coisas: comendo ou pensando.Enquanto está comendo, um filósofo não pode pensar, e vice-versa. Cada filósofo possui um prato cheio de spaghetti à sua frente. Além disso, um garfo é posicionado entre cada par adjacente de filósofos (portanto, cada filósofo tem exatamente um garfo à sua esquerda e exatamente um garfo à sua direita). Como spaghetti é uma comida díficil para se servir e comer com um único garfo, assume-se que um filósofo necessita de dois garfos para poder comer. E, além disso, um filósofo só pode utilizar um garfo que esteja imediatamente à sua esquerda ou imediatamente à sua direita. A falta de disponibilidade de garfos é uma analogia à falta de recursos compartilhados em programação de computadores. Em geral, o problema do jantar dos filósofos é um problema genérico e abstrato que é utilizado para explicar diversas situações indesejáveis que podem ocorrer em problemas que tem como principal idéia a exclusão mútua. Por exemplo, assim como no caso acima, deadlock/livelock é um conceito que pode ser bem explicado através do problema dos filósofos. Não Submetido Suspenso Pronto Executando Espera Completo Escalonador de curto prazo: Escalonador de médio prazo: Escalonador de longo prazo:
Compartilhar