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);