Olá pessoal, estou ciente que para meu próprio bem eu devia pesquisar e fazer sozinho o trabalho, mas infelizmente peguei muitas matérias nesse semestre e estou sem tempo. Por isso peço a ajuda de alguém, que entende de Sistemas operacionais, para fazer esse exercício de SO, ofereço um valor de R$ 60,00 para quem mandar ele pronto. O exercício segue abaixo. Me avise antes de começar a fazer. Obrigado
1 Travessia do rio Paraná
Você foi contratado para coordenar a travessia do rio Paraná entre a sua margem direita
e esquerda. Para tanto, você dispõe de um único barco capaz de acomodar no máximo
3 (três) pessoas. O barco vai a pique se mais que 3 pessoas embarcarem. O objetivo
deste exercıcio é familiarizá-lo com os conceitos e uso de mecanismos de sincronização em
Linux. Você deverá modelar esse problema de sincronização e implementá-lo utilizando
Linux, fazendo uso de processos e mecanismos Unix IPC. Você é livre para utilizar threads
padrão POSIX e seus respectivos mecanismos de sincronização (bilbioteca pthreads em
C).
1.1 Estrutura do programa
Cada passageiro será representado por uma thread. Para isso, ao executar a simulação, o programa recebe como entrada a quantidade mínima (min) e máxima (max) de
passageiros e sorteia um numero inteiro aleatoriamente nesse intervalo. Esse número
será a quantidade total de passageiros durante a simulação. Você deverá sortear, para
cada passageiro, a margem na qual ele será criado e imprimir na tela seu identificador.
Exemplo:
$ ./travessia 0 50
Criando 37 passageiros ...
Passageiro 0 (PID=1172) esperando na margem ESQUERDA
...
Passageiro 36 (PID=1209) esperando na margem DIREITA
Seu programa DEVE conter as seguintes funçoes:
#define ESQUERDA 0
#define DIREITA 1
void embarca(int margem)
{
/* Aqui o passageiro embarca na margem especificada se possível,
ou espera o barco chegar à sua margem do rio */
}
1
void desembarca(int margem)
{
/* Aqui o passageiro desembarca do barco vindo da margem especificada
e realiza quaisquer outras tarefas para dar continuidade à viagem
de outros passageiros */
}
void atravessa(int margem)
{
/* O barco atravessa o rio a partir da margem especificada */
}
1.2 Implementação
Obviamente a sincronização deve ocorrer na chegada e saída do barco onde a função
atravessa() não possui papel no problema, devendo imprimir na tela do terminal que a
travessia está em execução, em qual sentido, e quem está atravessando.
A função embarca() não deve retornar até que seja seguro para uma pessoa atravessar
o rio em um determinado sentido (deve garantir que o barco não afundará e que ninguém
cairá no rio caso o barco esteja na margem contrária). O barco só inicia a travessia
se existirem exatamente 3 pessoas no barco na margem certa do rio (a margem que o
barco está estacionado). Se o barco não aparecer em 10 segundos, o passageiro desiste
da viagem, imprime este fato e realiza um outro percurso mais longo de ônibus.
A função desembarca() é chamada para indicar que o chamador terminou de atravessar o rio e pode preparar a travessia de outras pessoas que estão esperando.
Inicialmente, o primeiro passageiro que chegar deve criar todos os recursos necessários
para que futuros passageiros possam interagir com o sistema de travessia. Adicionalmente, ele também decidirá de forma aleatória a margem em que o barco se encontra.
Quando qualquer passageiro terminar sua viagem ou mesmo desistir dela, ele deve verificar o estado da simulação. Caso não exista nenhuma ati- vidade (ninguém atravessando
ou esperando pelo barco, ou mesmo desembarcando), ele deve imprimir este fato, se
identificar, remover quaisquer recursos alocados previamente e sair do sistema sem deixar rastros.
2 Instruções de Entrega
Você deve entregar todos os arquivos fonte (em C ou C++) e quaisquer outros arquivos
adicionais (e.g. Makefile). Crie um arquivo compactado .zip, .tar.gz, .tgz ou .bz2 contendo todos os arquivos pertencentes ao seu EP. Não inclua código executável, somente
código fonte (.h, .c, .S) e arquivos textos contendo quaisquer descrições suas. Identifique
o seu EP de acordo com o exemplo abaixo:
EP2-Joao.zip
Pergunta
MJJ
Olá pessoal, estou ciente que para meu próprio bem eu devia pesquisar e fazer sozinho o trabalho, mas infelizmente peguei muitas matérias nesse semestre e estou sem tempo. Por isso peço a ajuda de alguém, que entende de Sistemas operacionais, para fazer esse exercício de SO, ofereço um valor de R$ 60,00 para quem mandar ele pronto. O exercício segue abaixo. Me avise antes de começar a fazer. Obrigado
1 Travessia do rio Paraná
Você foi contratado para coordenar a travessia do rio Paraná entre a sua margem direita
e esquerda. Para tanto, você dispõe de um único barco capaz de acomodar no máximo
3 (três) pessoas. O barco vai a pique se mais que 3 pessoas embarcarem. O objetivo
deste exercıcio é familiarizá-lo com os conceitos e uso de mecanismos de sincronização em
Linux. Você deverá modelar esse problema de sincronização e implementá-lo utilizando
Linux, fazendo uso de processos e mecanismos Unix IPC. Você é livre para utilizar threads
padrão POSIX e seus respectivos mecanismos de sincronização (bilbioteca pthreads em
C).
1.1 Estrutura do programa
Cada passageiro será representado por uma thread. Para isso, ao executar a simulação, o programa recebe como entrada a quantidade mínima (min) e máxima (max) de
passageiros e sorteia um numero inteiro aleatoriamente nesse intervalo. Esse número
será a quantidade total de passageiros durante a simulação. Você deverá sortear, para
cada passageiro, a margem na qual ele será criado e imprimir na tela seu identificador.
Exemplo:
$ ./travessia 0 50
Criando 37 passageiros ...
Passageiro 0 (PID=1172) esperando na margem ESQUERDA
...
Passageiro 36 (PID=1209) esperando na margem DIREITA
Seu programa DEVE conter as seguintes funçoes:
#define ESQUERDA 0
#define DIREITA 1
void embarca(int margem)
{
/* Aqui o passageiro embarca na margem especificada se possível,
ou espera o barco chegar à sua margem do rio */
}
1
void desembarca(int margem)
{
/* Aqui o passageiro desembarca do barco vindo da margem especificada
e realiza quaisquer outras tarefas para dar continuidade à viagem
de outros passageiros */
}
void atravessa(int margem)
{
/* O barco atravessa o rio a partir da margem especificada */
}
1.2 Implementação
Obviamente a sincronização deve ocorrer na chegada e saída do barco onde a função
atravessa() não possui papel no problema, devendo imprimir na tela do terminal que a
travessia está em execução, em qual sentido, e quem está atravessando.
A função embarca() não deve retornar até que seja seguro para uma pessoa atravessar
o rio em um determinado sentido (deve garantir que o barco não afundará e que ninguém
cairá no rio caso o barco esteja na margem contrária). O barco só inicia a travessia
se existirem exatamente 3 pessoas no barco na margem certa do rio (a margem que o
barco está estacionado). Se o barco não aparecer em 10 segundos, o passageiro desiste
da viagem, imprime este fato e realiza um outro percurso mais longo de ônibus.
A função desembarca() é chamada para indicar que o chamador terminou de atravessar o rio e pode preparar a travessia de outras pessoas que estão esperando.
Inicialmente, o primeiro passageiro que chegar deve criar todos os recursos necessários
para que futuros passageiros possam interagir com o sistema de travessia. Adicionalmente, ele também decidirá de forma aleatória a margem em que o barco se encontra.
Quando qualquer passageiro terminar sua viagem ou mesmo desistir dela, ele deve verificar o estado da simulação. Caso não exista nenhuma ati- vidade (ninguém atravessando
ou esperando pelo barco, ou mesmo desembarcando), ele deve imprimir este fato, se
identificar, remover quaisquer recursos alocados previamente e sair do sistema sem deixar rastros.
2 Instruções de Entrega
Você deve entregar todos os arquivos fonte (em C ou C++) e quaisquer outros arquivos
adicionais (e.g. Makefile). Crie um arquivo compactado .zip, .tar.gz, .tgz ou .bz2 contendo todos os arquivos pertencentes ao seu EP. Não inclua código executável, somente
código fonte (.h, .c, .S) e arquivos textos contendo quaisquer descrições suas. Identifique
o seu EP de acordo com o exemplo abaixo:
EP2-Joao.zip
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.