Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
| so:filas_de_mensagens [2020/08/05 00:08] – maziero | so:filas_de_mensagens [2023/05/03 20:37] (atual) – maziero | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | ====== Filas de mensagens ====== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Uma fila de mensagens é uma estrutura usada pelas tarefas para comunicação através de troca de mensagens de tamanho fixo. Cada fila pode armazenar até N mensagens de tamanho fixo, respeitando uma política de acesso FIFO. | ||
| + | |||
| + | O acesso à fila é **bloqueante**, | ||
| + | |||
| + | As funções a implementar são descritas a seguir. | ||
| + | |||
| + | ==== Inicia uma fila de mensagens ==== | ||
| + | |||
| + | <code c> | ||
| + | int mqueue_init (mqueue_t *queue, int max_msgs, int msg_size) | ||
| + | </ | ||
| + | |||
| + | Inicia a fila de mensagens apontada por '' | ||
| + | |||
| + | Exemplo: inicia uma fila para guardar até 100 números de tipo '' | ||
| + | |||
| + | <code c> | ||
| + | mqueue_t fila1 ; | ||
| + | |||
| + | if ( mqueue_init (& | ||
| + | { | ||
| + | | ||
| + | exit (1) ; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Envia uma mensagem para a fila ==== | ||
| + | |||
| + | <code c> | ||
| + | int mqueue_send (mqueue_t *queue, void *msg) | ||
| + | </ | ||
| + | |||
| + | Envia a mensagem apontada por '' | ||
| + | |||
| + | <note tip> | ||
| + | Sugestão: copie a mensagem do //buffer// para a fila (ou vice-versa) usando funções C como '' | ||
| + | </ | ||
| + | |||
| + | Exemplo: Enviar o valor de uma variável para a fila '' | ||
| + | |||
| + | <code c> | ||
| + | double pi = 3.1415926535897932 ; | ||
| + | |||
| + | if ( mqueue_send (& | ||
| + | { | ||
| + | | ||
| + | exit (1) ; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Recebe uma mensagem da fila ==== | ||
| + | |||
| + | <code c> | ||
| + | int mqueue_recv (mqueue_t *queue, void *msg) | ||
| + | </ | ||
| + | |||
| + | Recebe uma mensagem do início da fila '' | ||
| + | |||
| + | Exemplo: Receber uma mensagem da fila '' | ||
| + | |||
| + | <code c> | ||
| + | double buf ; | ||
| + | |||
| + | if ( mqueue_recv (& | ||
| + | { | ||
| + | printf ("Erro ao receber mensagem\n" | ||
| + | exit (1) ; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | printf (" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Encerra uma fila ==== | ||
| + | |||
| + | <code c> | ||
| + | int mqueue_destroy (mqueue_t *queue) | ||
| + | </ | ||
| + | |||
| + | Encerra a fila de mensagens indicada por '' | ||
| + | |||
| + | ==== Número de mensagens ==== | ||
| + | |||
| + | <code c> | ||
| + | int mqueue_msgs (mqueue_t *queue) | ||
| + | </ | ||
| + | |||
| + | Informa o número de mensagens presentes na fila indicada por '' | ||
| + | |||
| + | ===== Observações: | ||
| + | |||
| + | Filas de mensagens são na verdade //buffers// limitados acessados por tarefas que produzem e consomem mensagens. O código do sistema produtor/ | ||
| + | |||
| + | As filas de mensagens devem ser genéricas em relação aos tipos de mensagens suportadas. Em outras palavras, a implementação deve suportar o envio de qualquer tipo de dado de tamanho conhecido, não sendo restrita a um tipo ou dois. O buffer interno da fila pode ser implementado com uma estrutura de [[https:// | ||
| + | |||
| + | Seu código deverá funcionar com {{pingpong-mqueue.c|este programa de teste}} e deverá gerar um resultado {{pingpong-mqueue.txt|similar a este}}. A figura abaixo representa graficamente esse programa de teste: | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ===== Outras informações ===== | ||
| + | |||
| + | * Duração estimada: 6 horas. | ||
| + | * Dependências: | ||
| + | * [[Gestão de Tarefas]] | ||
| + | * [[Dispatcher]] | ||
| + | * [[Preempção por Tempo]] | ||
| + | * [[Tarefas suspensas]] | ||
| + | * [[Tarefas dormindo]] | ||
| + | * [[Semáforos]] | ||