Você está na página 1de 2

Universidade Federal de Mato Grosso do Sul

Faculdade de Computação

Aluno: __________________________________________________________________________

Introdução a Sistemas Operacionais


Lista de Exercícios 04
Profª Valéria Q. dos Reis
1. Por que cada thread precisa de um conjunto próprio de registradores lógicos? (Lembre-se
que uma máquina tem somente um conjunto físico de registradores).
2. Neste problema, você deve comparar a leitura de um arquivo usando um servidor de
arquivos monothread e um servidor multithread. São necessários 15 ms para obter uma
requisição de trabalho, despachá-la e fazer o restante do processamento necessário,
presumindo que os dados essenciais estejam na cache de blocos. Se for necessária uma
operação de disco – como ocorre em um terço das vezes – , será preciso um tempo adicional
de 75 ms, durante o qual o thread dorme. Quantas requisições/segundo o servidor pode tratar
se for monothread? E se for multithread?
3. Em sua versão mais simples, um código para a crição de threads as quais imprimem
mensagens gera execuções em que as mensagens das threads são intercaladas
aleatoriamente. Há algum modo de impor que a ordem seja estritamente thread1 criada,
thread 1 imprime mensagem, thread 1 sai, thread 2 criado, thread 2 imprime mensagem,
thread 2 sai e assim por diante? Em caso de resposta afirmativa, qual é esse modo e qual é o
método da classe Thread a ser chamado ? Em caso de resposta negativa, por que não?
4. Verdadeiro ou Falso. Em uma máquina com uma única CPU, se um processo tem múltiplas
threads de controle, então ele pode executar literalmente mais de uma tarefa
simultâneamente.
5. Todo programa pode ser reescrito para ser multithread, ou seja, ter mais de uma linha de
execução “em paralelo”? Explique.
6. Podemos pensar em um código que cria duas threads para calcular o fatorial de n. Uma das
threads acumula a multiplicação de todos os números pares menores ou igual a n e a outra
tread acumula todos os números ímpares menores ou igual a n. O processo pai espera que as
duas threads sejam finalizadas e, então, realiza a multiplicação de ambos os acumuladores.
Considerando esse exemplo, o uso de threads traz melhoria de desempenho em relação a
uma versão puramente sequencial em que o processo pai calcula o valor de fatorial sozinho?
Por que? Considere máquinas mono e multiprocessadas.
7. Quais informações uma thread compartilha com o processo que a criou? Quais informações
são particulares de cada thread.
8. Por que a troca de contexto de threads é mais rápida que a troca de contexto de processos?
9. Em quais situações, o uso de processos é mais apropriado do que o uso de threads?
10. Uma solução multithreads usando múltiplas threads em nível de usuário pode conseguir
desempenho melhor em um sistema de multiprocessadores do que em um sistema de único
processador?
11. A API Java fornece várias arquiteturas de banco de threads diferentes:
a) newFixedThreadPool(int)
b) newCachedThreadPool()
c) newSingleThreadExecutor()
Discuta os méritos de cada uma.
12. Escreva um programa multithread em Java que gere números primos. Esse programa deverá
atuar da seguinte maneira: o usuário executará o programa e informará um número na linha
de comandos. O programa, então, criará uma thread separada, que gerará todos os números
primos menores ou iguais ao número digitado pelo usuário.
13. A sequência de Fibonacci é a série de números 0, 1, 1, 2, 3, 5, 8, … Formalmente, ela pode
ser expressa como:
fib 0=0
fib 1=1
fib n=fibn−1+ fibn−2
Escreva um programa multithread que gere a sequencia de Fibonacci usando Java. Esse
programa deverá funcionar da seguinte maneira: o usuário digitará na linha de comandos a
quantidade de números de Fibonacci que o programa deve gerar; o programa, então, criará
uma thread separada que gerará os números de Fibonacci, colocando a sequência nos dados
que são compartilhados pelas threads. Quando a thread terminar sua execução, a thread mãe
exibirá a sequência gerada pela thread filha. Como a thread mão não pode começar a exibir
a sequência de Fibonacci antes que a thread filha termine, será preciso que a thread mãe
espere que a filha termine.
14. Crie uma solução multithread Java que realize a multiplicação de matrizes. Dadas duas
matrizes, A e B, onde A é uma matriz com M linhas e K colunas, e a matriz B contém K
linhas e N colunas, a matriz produto de A e B é C, onde C contém M linhas e N colunas. A
entrada na matriz C para a linha i coluna j (Cij) é a soma dos produtos dos elementos para a
linha i na matriz A e coluna j na matriz B, ou seja,
k
Ci , j=∑ A i ,n x Bn , j
n=1

Por exemplo, se A fosse uma matriz 3 por 2 e B fosse uma matriz 2 por 3, o elemento C3,1
seria a soma de A3,1 x B1,1 e A3,2 x B2,1.
Calcule cada elemento Ci,j em uma thread de trabalho separada. Isso envolverá a criação de
M x N threads de trabalho. A thread principal – ou mãe – inicializará as matrizes A e B e
alocará memória para a matriz C, que manterá o produto das matrizes A e B. As matrizes A
e B podem ser inicializadas estaticamente.
Quando todas as threads de trabalho tiverem sido concluídas, a thread principal exibirá o
produto contido na matriz C. Isso exige que a thread principal espere até que todas as
threads de trabalho terminem para poder exibir o valor da matriz produto.

Você também pode gostar