UVA - AVA2 - Sistemas Operacionais
Por: Gabriel Quaresemin • 19/11/2021 • Exam • 782 Palavras (4 Páginas) • 675 Visualizações
Algoritmo "concorrentes"
Var
// Variaveis de controle das threads
thread thread_A, thread_B, thread_C: thread;
// Semaforos de controle
sema_impressora, sema_plotter, sema_scanner: semaforo;
Procedimento Proc_A()
Início
Enquanto (verdadeiro) Faça // Procedimento nunca termina
processa_algo();
aloca_plotter();
processa_algo_utilizando_plotter();
libera_plotter();
Fim Enquanto;
Fim;
Procedimento Proc_B()
Início
Enquanto (verdadeiro) Faça // Procedimento nunca termina
processa_algo();
aloca_scanner();
processa_algo_utilizando_scanner();
aloca_impressora();
processa_algo_utilizando_scanner_impressora();
aloca_plotter();
processa_algo_utilizando_scanner_impressora_plotter();
libera_plotter();
libera_impressora();
libera_scanner();
Fim Enquanto;
Fim;
Procedimento Proc_C()
Início
Enquanto (verdadeiro) Faça // Procedimento nunca termina
processa_algo();
aloca_impressora();
processa_algo_utilizando_impressora();
aloca_scanner();
processa_algo_utilizando_scanner_impressora();
libera_impressora();
libera_scanner();
Fim Enquanto;
Fim;
Início
sema_impressora = 1; // Inicia semaforo de controle da impressora
sema_plotter = 1; // Inicia semaforo de controle do plotter
sema_scanner = 1; // Inicia semaforo de controle do scanner
// Inicia as threads colocando-as em execução paralelamente
pthread_create(thread_A, Proc_A); // Inicia Proc_A como uma thread
pthread_create(thread_B, Proc_B); // Inicia Proc_A como uma thread
pthread_create(thread_C, Proc_C); // Inicia Proc_A como uma thread
// faz com que a thread principal espere as demais acabarem
pthread_join(thread_A);
pthread_join(thread_B);
pthread_join(thread_C);
Fim.
1 - Estão identificadas m vermelho as linhas que podem causar problemas durante a execução do problema, sendo elas 24,26 e 40.
2 – Em todas as ocasiões supracitadas os recursos anteriores não foram liberados pela respectiva função, ocasionando um deadlock no processamento seguinte.
3 – A correção seria a utilização da função de liberação do(s) respectivo(s) recursos(s) após cada processamento que faz uso destes, conforme abaixo:
Proposta de correção
Var
// Variaveis de controle das threads
thread thread_A, thread_B, thread_C: thread;
// Semaforos de controle
sema_impressora, sema_plotter, sema_scanner: semaforo;
Procedimento Proc_A()
Início
Enquanto (verdadeiro) Faça // Procedimento nunca termina
processa_algo();
aloca_plotter();
processa_algo_utilizando_plotter();
...