Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Salvador - BA 
2023
MATHEUS LINO LIMA 
TRABALHO DA DISCIPLINA – AV2 
SISTEMAS OPERACIONAIS 
 
 
 
 Linhas de código que podem causar problemas 
 
1. Enquanto (verdadeiro) Faça // Procedimento nunca termina 
 
2. 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 
 
3. pthread_create(thread_A, Proc_A); // Inicia Proc_A como uma thread 
pthread_create(thread_B, Proc_B); // Inicia Proc_B como uma thread 
pthread_create(thread_C, Proc_C); // Inicia Proc_C como uma thread 
 
pthread_join(thread_A); 
pthread_join(thread_B); 
pthread_join(thread_C); 
 
 
 
 
 Problemas que podem ocorrer 
Nas linhas (1), onde há comentários de “Procedimento nunca termina”, 
ocorrem loops infinitos que fazem com que a execução permaneça para 
sempre, sem uma condição de término do procedimento. 
1. Enquanto (verdadeiro) Faça // Procedimento nunca termina ... 
Já nas linhas (2) a seguir Caso os semáforos fossem compartilhados entre as 
threads sem que haja proteção correta, podem surgir condições de corrida no 
código. 
2. 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 
No caso dos semáforos (3), Caso os semáforos fossem compartilhados entre 
as threads sem que haja proteção correta, podem surgir condições de corrida no 
código. 
3. pthread_create(thread_A, Proc_A); // Inicia Proc_A como uma thread 
pthread_create(thread_B, Proc_B); // Inicia Proc_B como uma thread 
pthread_create(thread_C, Proc_C); // Inicia Proc_C como uma thread 
 
pthread_join(thread_A); 
pthread_join(thread_B); 
pthread_join(thread_C); 
 
 
 
 
 
 
 
 
 Como solucionar os problemas 
 
1. Enquanto (verdadeiro) Faça // Procedimento nunca termina... 
 
 
2. 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 
 
 
3. pthread_create(thread_A, Proc_A); // Inicia Proc_A como uma thread 
pthread_create(thread_B, Proc_B); // Inicia Proc_B como uma thread 
pthread_create(thread_C, Proc_C); // Inicia Proc_C como uma thread 
 
pthread_join(thread_A); 
pthread_join(thread_B); 
pthread_join(thread_C); 
 
 Nos casos (1), (2) e (3) é possível utilizar mutexes para a coordenação do acesso 
aos recursos a serem compartilhados, o que diminui as chances de termos condições 
de corrida na execução do código, deixando-os dessa forma: 
 
 Para o Procedimento A: 
Início 
 Enquanto (verdadeiro) Faça 
 processa_algo(); 
 mutex_plotter.lock(); 
 aloca_plotter(); 
 processa_algo_utilizando_plotter(); 
 libera_plotter(); 
 mutex_plotter.unlock(); 
 Fim Enquanto; 
Fim; 
 
 
 
 Para o Procedimento B: 
Início 
Enquanto (verdadeiro) Faça 
processa_algo(); 
mutex_scanner.lock(); 
aloca_scanner(); 
processa_algo_utilizando_scanner(); 
mutex_impressora.lock(); 
aloca_impressora(); 
processa_algo_utilizando_scanner_impressora(); 
mutex_plotter.lock(); 
aloca_plotter(); 
processa_algo_utilizando_scanner_impressora_plotter(); 
libera_plotter(); 
libera_impressora(); 
libera_scanner(); 
mutex_plotter.unlock(); 
mutex_impressora.unlock(); 
mutex_scanner.unlock(); 
Fim Enquanto; 
Fim; 
 Para o Procedimento C: 
Início 
Enquanto (verdadeiro) Faça 
processa_algo(); 
 mutex_scanner.lock(); 
 aloca_scanner(); 
 processa_algo_utilizando_scanner(); 
 
 
 
 mutex_impressora.lock(); 
 aloca_impressora(); 
 processa_algo_utilizando_scanner_impressora(); 
 mutex_plotter.lock(); 
 aloca_plotter(); 
 processa_algo_utilizando_scanner_impressora_plotter(); 
 libera_plotter(); 
 libera_impressora(); 
 libera_scanner(); 
 mutex_plotter.unlock(); 
 mutex_impressora.unlock(); 
 mutex_scanner.unlock(); 
 Fim Enquanto; 
Fim; 
 
 Para o caso (2): 
Início 
 mutex_ lock(); 
 se (sema_impressora não inicializado) então 
 sema_impressora = 1; // Inicia semaforo de controle da impressora 
 se (sema_plotter não inicializado) então 
 sema_plotter = 1; // Inicia semaforo de controle do plotter 
 se (sema_scanner não inicializado) então 
 sema_scanner = 1; // Inicia semaforo de controle do scanner 
 mutex_ unlock(); 
Fim 
 
 E por fim, para o caso (3) : 
mutex_lock(); 
 
 
 
pthread_create(thread_A, Proc_A); 
pthread_create(thread_B, Proc_B); 
pthread_create(thread_C, Proc_C); 
mutex_unlock(); 
 
pthread_join(thread_A); 
pthread_join(thread_B); 
pthread_join(thread_C);

Mais conteúdos dessa disciplina