Escolar Documentos
Profissional Documentos
Cultura Documentos
038-7
Lista 4
1- Cada thread precisa de um conjunto próprio de registradores lógicos para que possam ser
executadas simultaneamente em uma única CPU, sem que as informações de uma thread interfiram na
execução de outra.
2- O servidor monothread pode tratar 20 requisições/segundo e o servidor multithread pode tratar mais
de 20 requisições/segundo, dependendo do número de threads utilizadas.
3- Sim, é possível impor uma ordem estrita de execução das threads utilizando o método join() da
classe Thread.
4-Falso. Em uma máquina com uma única CPU, as threads não podem executar literalmente mais de
uma tarefa simultaneamente, pois apenas uma instrução pode ser executada por vez. As threads são
alternadas rapidamente, dando a impressão de que estão sendo executadas simultaneamente.
5-Não, nem todos os programas podem ser reescritos para serem multithread, pois alguns programas
possuem dependências entre as suas instruções, o que limita a capacidade de paralelização.
6- Sim, o uso de threads pode trazer melhoria de desempenho em relação a uma versão puramente
sequencial, principalmente em máquinas multiprocessadas, pois permite que os cálculos sejam
executados em paralelo. No entanto, em máquinas monoprocessadas, o ganho de desempenho pode
ser limitado.
7- Uma thread compartilha informações como o espaço de endereçamento do processo que a criou,
mas cada thread possui seu próprio contexto de execução, como o conjunto de registradores, o
contador de programa e a pilha de execução.
8- A troca de contexto de threads é mais rápida que a troca de contexto de processos porque as threads
compartilham o mesmo espaço de endereçamento e contexto de execução, o que torna a troca de
contexto mais simples e rápida.
9- O uso de processos é mais apropriado do que o uso de threads em situações em que é necessário
isolar recursos entre os processos, como em sistemas de segurança ou quando os processos precisam
ser executados em diferentes ambientes. Além disso, os processos são mais robustos em relação a
falhas, pois não compartilham o mesmo espaço de endereçamento.
10- Sim, uma solução multithread 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, pois em um sistema multiprocessado, as threads podem ser distribuídas entre os
processadores disponíveis, permitindo a execução simultânea em vários núcleos de processamento.
Isso pode levar a um aumento significativo de desempenho em comparação com um sistema de único
processador, onde as threads são executadas em um único núcleo de processamento.
11- a) O newFixedThreadPool(int) cria uma piscina de threads com um número fixo de threads
pré-criadas. Quando uma tarefa é submetida à piscina e todas as threads estiverem ocupadas, ela é
colocada em uma fila até que uma thread esteja disponível. Esse tipo de arquitetura é adequado para
situações em que há um número previsível de tarefas a serem executadas e se deseja limitar a
quantidade de threads criadas.
c) O newSingleThreadExecutor() cria uma piscina de threads com apenas uma thread. Isso é adequado
para situações em que as tarefas precisam ser executadas sequencialmente e em ordem, e garante que
apenas uma tarefa seja executada de cada vez.
12-
Java
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;
@Override
public void run() {
for (int i = 2; i <= numeroLimite; i++) {
if (isPrimo(i)) {
primos[i].set(true);}}}
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();}
13-
Java
import java.util.Scanner;
Java
public class MatrixMultiplication {
private static final int THREAD_POOL_SIZE = 4;
ExecutorService executor =
Executors.newFixedThreadPool(THREAD_POOL_SIZE);
while (!executor.isTerminated()) {
// Espera até que todos os trabalhadores terminem}
@Override
public void run() {
int sum = 0;
for (int k = 0; k < K; k++) {
sum += matrixA[row][k] * matrixB[k][col]; }
matrixC[row][col] = sum;}}}