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 [2016/11/26 15:43] – [Filas de mensagens] 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]] | ||