Buscar

Prévia do material em texto

JONISSON DE JESUS GOMES
SISTEMAS OPERACIONAIS
SALVADOR-BA
2023.1
Alocação de Recursos
Com o objetivo de compreender os problemas que podem ocorrer em um sistema por existência de concorrência por seus recursos. Será realizada a verificação de um programa com três threads, que iram competir por recursos do sistema ao serem executados concorrentemente. Essa verificação pretende tornar possível identificar as linhas do sistema que podem causar problemas, deixar claro as dificuldades que podem ocorrer e trazer uma proposta de correção no algoritmo para que haja correção dos problemas e o sistema possa ser executado sem erros. Esse procedimento foi denominado como Proc A, Proc B e Proc C, no qual vão concorrer pela utilização de três recursos:
· Impressora
· Plotter
· Scaner
Tendo em vista, que cada um destes recursos pode estar alocado a somente um procedimento por vez. O controle do acesso aos recursos é realizado por intermédio de semáforos, fazendo com que, se um recurso estiver em uso por um procedimento, e um segundo procedimento tentar aloca-lo, este segundo procedimento ficará bloqueado até que ocorra a liberação.
Var
// Variaveis de controle das threads
thread thread_A, thread_B, thread_C: thread;
// Semáforos 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 ();
libera_plotter ();
Fim Enquanto;
Fim;
//Proc_A () aloca o potter, processa e depois libera
Procedimento Proc_B ()
Início
Enquanto (verdadeiro) Faça // Procedimento nunca termina
processa_algo ();
aloca_scanner ();
processa_algo ();
aloca_impressora ();
processa_algo (); 
aloca_plotter (); 
processa_algo ();
libera_plotter ();
libera_impressora (); 
libera_scanner (); 
 Fim Enquanto;
 Fim; 
//Proc_B () enquanto o scanner não "libera" o sistema não conseguirá
 aloca a i mpressora e nem mesmo o potter.
Procedimento Proc_C ()
Início Enquanto (verdadeiro) Faça // Procedimento nunca termina
processa_algo (); 
aloca_impressora (); 
processa_algo (); 
aloca_scanner ();
processa_algo (); 
libera_impressora (); 
libera_scanner (); 
Fim Enquanto;
Fim;
//Proc_C () ao alocat a impressora, processar_algo o sistema não
 consegue aloca o scaner sem ter feito o "libera_impressora", desta
 forma o sistema vai ficar confuso e não conseguirá alocar o scanner. 
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;
Com base na verificação da execução dos recursos, o sistema não conseguirá alocar a impressora e o plotter pois o scanner vai estar alocado, ou seja, o thread_A pode ser processado que não ocorra problemas, a thread_B alocará o scanner, depois de liberar o scanner ela alocará a impressora, feito isto ela irá alocar o potter mas o sistema só executará se a thread_A já estiver finalizado como não é o caso, isso fará, com que o sistema fique confuso, tentará enfileirar e entrará em deadlock. Já em thread_C, o sistema não conseguirá alocar o scanner pois a impressora vai estar alocada será visto novamente a o sistema provocando deadlocks por haver engarrafamento ao tentar alocar recursos de um periférico enquanto outro periférico ainda o utiliza e o semáforo ainda não registrou a liberação dos recursos. Para que corra uma correção no algoritmo e o sistema execute sem erros deve ser feito alterações nos comandos de Proc_B e Proc_C.
	
	
	
image1.png

Mais conteúdos dessa disciplina