Buscar

Questões de Sincronização - concluído

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1) Suponha que sejam criados 5 processos para escrever o número de 1 a 500. Utilize semáforos para garantir que o processo 1 escreva os números de 1 até 100, o processo 2 escreva os números de 101 até 200, e assim por diante. Atenção: o processo i+1 só deve entrar em funcionamento quando o processo i já tiver terminado a escrita dos seus números.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREADS 5
pthread_mutex_t mutex;
int contador = 0;
void* função(){
 pthread_mutex_lock(&mutex);
 for (int i = 0; i<100; i++)
 {
 contador++;
 printf("THREAD%d: %d\n", pthread_self(), contador);
 }
 pthread_mutex_unlock(&mutex);
}
int main(){
 pthread_t T[THREADS];
 for (int i = 0; i < THREADS; i++) pthread_create(&T[i], NULL, função, NULL);
 for (int i = 0; i < THREADS; i++) pthread_join(T[i], NULL);
}
2) Suponha um sistema que pode utilizar três impressoras diferentes para impressão. Quando o programa quer enviar dados para uma impressora utiliza a função print(obj), que permite imprimir na impressora que está livre. Se nenhuma impressora estiver livre, a função retorna “erro”. Escreva um pseudocódigo que possibilita a implementação desta função.
semaphore impressora = 3;
void impressora{
 if(impressora>0){
 DOWN(impressora);
 print(obj);
 UP(impressora);
 }
 else{
 return(“erro”);
 }
}
3) Considere a seguinte solução para o problema dos leitores-escritores abaixo e mostre se a solução apresentada está correta. Justifique sua resposta.
	down (mutex);
Readcount += 1;
up (mutex);
…
Reading is performed
…
down (mutex);
Readcount -= 1; 
if(Readcount == 0)
up (writer);
up (mutex);
Sim, ele garante que não haverá leitores enquanto houver escritores atuando, mas nessa solução pode ocorrer starvation. É necessário que cada leitor tenha um limite de tempo para evitar que novos leitores passem a frente do escritor por conta de um leitor demorado.
4) Considere que existe uma estrutura de dados compartilhados que está sendo acessada por 3 atores: 
Searchers: Que acessam a estrutura sem alterá-la. Logo, searchers podem acessar a estrutura concorrentemente de forma segura;
Inserters: Têm a habilidade de adicionar novos elementos à estrutura. Somente um inserter podem acessar a estrutura em um dado momento, mas pode trabalhar concorrentemente com qualquer número de searchers;
Deleters: Podem remover itens da estrutura. Qualquer deleters requer acesso exclusivo à estrutura.
Escreva um pseudocódigo capaz de controlar o acesso desses atores à estrutura.
typedef struct atores{
int searchers = 0;
int inserters = 0;
int deleters = 0;
}atores;
void add_inserters(atores ator){
if(ator.inserters = 0){
ator.inserters++;
insere();
ator.inserters--;
}
}
void add_deleters(atores ator){
if(ator.inserters = 0 && ator.searchers = 0){
ator.deleters++;
deleta();
ator.deleters--;
}
}
void add_searchers(atores ator){
ator.searchers++;
search();
ator.searchers--;
}
5) A administração de um grande parque deseja controlar através de um sistema computacional as entradas e saídas deste parque a fim de saber, a qualquer momento, quantas pessoas encontram- se no interior do parque. Sabendo que existem duas catracas, uma para entrar e outra para sair, apresente um pseudo-código para resolver o problema.
int aux=0;
void catraca_entrada(){
id = fork();
aux++;
}
void catraca_saida(){
id = fork();
aux--;
}
void verifica_catrata(){
wait()
if(id==0){
print(aux);
}
}
6) O problema trata de um grupo de macacos que utiliza uma corda para atravessar um precipício. Vários macacos podem atravessar simultaneamente, desde que eles estejam cruzando na mesma direção. Se um macaco cruzando para o leste encontra uma macaco cruzando para oeste no meio da corda, ocorre deadlock, porque um não consegue cruzar com o outro e nem andar para trás.
int cruzandoLeste = 0, irLeste = 0, cruzandoOeste = 0, irOeste = 0;
sem oeste; oeste.valor = 0;
sem leste; leste.valor = 0;
sem mutex; mutex.valor = 1;
cruzaOeste(){
 P(mutex);
 cruzandoOeste++;
 if (!cruzandoLeste) V(oeste);
 else irOeste++;
 V(mutex);
 P(oeste);
 Cruza();
 P(mutex);
 cruzandoOeste--;
 if (!cruzandoOeste && irLeste){
 irLeste--;
 V(leste);
 }
 V(mutex);
}
cruzaLeste(){
 P(mutex);
 cruzandoLeste++;
 if (!cruzandoOeste) V(leste);
 else irLeste++;
 V(mutex);
 P(leste);
 Cruza();
 P(mutex);
 cruzandoLeste--;
 if (!cruzandoLeste && irOeste){
 irOeste--;
 V(oeste);
 }
 V(mutex);
}

Continue navegando