TRABALHO - Fundamentos de Sistemas Operacionais - FSO - 2019/1 |
Bruno César Ribas |
Prólogo
Para o trabalho de sistemas operacionais deste semestre, iremos implementar um CHAT. O CHAT será dividido em 3 checkpoints, a saber:
- Troca de mensagens local por meio de FILAS POSIX e THREAD;
- Troca de mensagens local por meio de FILAS POSIX,THREAD e CHAT GLOBAL (ou assinatura de mensagens);
O primeiro checkpoint vale 30 pontos e o segundo checkpoint vale 70 pontos.
O primeiro Checkpoint
- Entrega e apresentação: 4 de Junho
Neste checkpoint o CHAT deverá funcionar localmente por meio de FILAS POSIX.
FILA POSIX
A FILA POSIX é um arquivo especial controlado pelo kernel para troca de mensagens entre processos.
Cada usuário deverá criar uma FILA (veja mq_overview(7) ) no no padrão, chat-usuario, onde usuario deverá ser substituído por um nome ou apelido.
Exemplo: Usuário 'Leonardo' deverá criar a FILA no seguinte caminho:
/chat-Leonardo
Se esta fila já existir e tiver um dono (owner) diferente do usuário que está criando a fila, uma mensagem deve ser jogada na tela e o programa deve sair.
A permissão da FILA deverá ser de leitura e escrita para o dono e apenas escrita para outros usuários.
Para enviar uma mensagem a um usuário o programa CHAT deverá abrir a FILA do usuário de destino e escrever em texto plano uma mensagem no seguinte formato:
DE:PARA:MENSAGEM
Exemplo: Usuário 'Leonardo' mandando para o usuário 'Marcelo' a mensagem "Ola amigo", deverá possuir o seguinte formato:
Leonardo:Marcelo:Ola amigo
E para este exemplo, o CHAT de Leonardo deverá escrever esta mensagem em:
/chat-Marcelo
As mensagens deverão, obrigatoriamente, encerrar com a quebra de linha.
O problema desta abordagem acontece quando ninguém manda mensagem para o usuário e já que a função de verificar se há mensagens na FILA é do tipo blocante, ou seja, o processo fica bloqueado até que receba alguma mensagem.
Padrões
- A mensagem apresentada ao usuário deverá ser formatada, excluindo o seu
nome da mensagem impressa na tela. Por exemplo a mensagem a enviada
para Marcelo de Ana, tem o seguinte formato:
Ana:Marcelo:Ola
O chat de marcelo deverá apresentar a mensagem da seguinte forma:Ana: Ola
Note o espaço em branco após o ':' e a remoção da string do nome do receptor - A FILA deverá ter permissão de escrita para todos usuários (habilitar o bit de WRITE para todos usuários), mas somente a escrita para todos os usuários, para o dono da fifo a permissão deverá ter também a de leitura;
- O nome do usuário terá no máximo 10 caracteres. O corpo da mensagem terá no máximo 500 caracteres;
- O chat deverá bloquear a saída quando o usuário apertar ^c (control+c), e deverá avisar que para sair deverá digitar o comando "sair". Quando o chat encerrar o FIFO e o arquivo contendo o PID deverão ser excluídos do sistema;
- O chat não deverá ficar bloqueado enquanto uma mensagem é enviada, mesmo que o receptor demore para efetuar a leitura da mensagem;
- Se a fila do destinatário não existir deverá ser aprosentada a seguinte
mensagem:
UNKNOWNUSER PARA
exemplo:UNKNOWNUSER BrUnO
- acontece se não existir a fila `/BrUnO`
- Se não for possível enviar uma mensagem para um usuário (por exemplo se a
fila estiver cheia) esta mensagem deve reenviada depois de um tempo. O seu
programa deverá reenviar uma mensagem no máximo 3 vezes, se após a
terceira tentativa não for entregue uma mensagem deverá ser apresentada
seguindo o formato abaixo:
ERRO DE:PARA:MSG
exemplo:ERRO Marcelo:Matheus:Está por aí?
- O comando "list", deverá ser implementado no chat. Este comando lista todos os usuários disponíveis;
- Quando o destinatário da mensagem for 'all' o chat deverá enviar a
mensagem para todos os usuários disponíveis, colocando no campo de destino
o nome "all".
- O chat deverá inibir que algum usuário tente entrar com o login "all".
- Exemplo de mensagem enviada para todos os usuários:
Marcelo:all:Fala aí moçada.
- Quando o chat receber uma mensagem endereçada a 'all' deverá exibir na
tela que a mensagem foi um broadcast da origem, exemplo para a mensagem
acima no chat de Matheus:
Broadcast de Marcelo: Fala aí moçada.
Fluxo de mensagens
Exemplo de fluxo de mensagens e sinais para o envio de uma mensagem do usuário A para o usuário B.
Neste exemplo a:
- THREAD 1, representada por T1, será a thread que estará preparada para receber mensagens, ficando em um loop de leitura da FILA;
- THREAD 2, representada por T2, será a thread que está preparada para enviar mensagens a um usuário;
- MAIN, thread principal, representada por Main, será responsável por ler a mensagem do usuário e enviá-la à thread responsável pelo envio de mensagens.
/----------------\ 3)T1B está preparado para rece- /----------------\ |U _______ | ber conteúdo na ,->---------------, _______ | |S | | | tela, processa a / |S \> | | |U | T1A | | informação e / |U | T1B | | |A | | | apresenta na tela./ |A | | | |R ------- _.---------->--------' |R ------- | |I _______/ | |I _______ | |O | | |2)T2A consome a fila de mensagens |O | | | | | T2A | | a enviar e faz o procedimento de | | T2B | | |A | |<-\| envio de mensagem, escrevendo |B | | | | ------- ^| na FILA do destinatário | ------- | | _______ ^| | _______ | | | | || | | | | | |MainA| || | |MainB| | | | |-/ | | | | | | ------- |1)Usuário A digita a mensagem e | ------- | | | pressiona enter para enviar. | | \----------------/ Esta mensagem é enviada para T2A \----------------/
Entrega e apresentação
Este checkpoint deverá ser apresentado na data limite por no máximo 10 minutos.
A apresentação deverá conter uma explicação do processo implementado, das principais dificuldades e o que foram feitas para contorná-las.
Além da apresentação os alunos deverão mostrar ao professor o CHAT em funcionamento.
O CHAT funcionar com o CHAT de outra equipe agrega 10 pontos ao checkpoint.
O segundo Checkpoint
- Entrega e apresentação: 04/07/2019
- Escopo: chat global ou assinatura de mensagens
- Os grupos serão, obrigatoriamente, os mesmos do primeiro checkpoint IDEIAS:
- CHAT GLOBAL: Funcionar como uma sala
- CHAT GLOBAL2: Funcionar como uma sala e ter um dono rotativo
- Assinatura de mensagens: Colocar algum mecanismo (simples) que certifique que uma mensagem foi realmente enviada por quem disse que enviou.
Para o segundo checkpoint os trabalhos devem implementar o suporte a:
- Assinatura de mensagens, todas as mensagens enviadas devem conter uma assinatura que comprove que aquela mensagem foi enviada pelo seu programa.
- Sala de chat: O seu programa deve ser capaz de criar uma sala e
gerenciá-la, ou seja, toda mensagem enviada à sala deve ser recebida por
todos os membros da sala.
- Entrando na sala
- Enviando mensagem para sala
- Mostrando mensagem da sala
- Saindo da sala
- Destruindo a sala
- Protocolo decidido em sala
Entrega e apresentação
Este checkpoint deverá ser apresentado na data limite por no máximo 10 minutos.
A apresentação deverá conter uma explicação do processo implementado, das principais dificuldades e o que foram feitas para contorná-las.
Além da apresentação os alunos deverão mostrar ao professor o CHAT em funcionamento.
Os alunos deverão demonstrar o domínio da solução implementada.
---
Last Modified: Wed Jun 12 15:13:48 2019.