FILA / MESSAGE QUEUES

1. FILA / MESSAGE QUEUES

sweetfury
sweetfury

(usa Debian)

Enviado em 12/08/2015 - 22:46h

Olá, pessoal. Boa noite.
Comecei estudos na área de redes e na matéria de S.O. temos um pouco de C/C++. Como sou horrível em prog. estou me batendo.
Tenho o seguinte cód:
void Produtor()
{
Mensagem msg; /* mensagem a enviar */
Mensagem env; /* envelope = mensagem vazia */

while (1) { /* laço infinito */
receive(Consumidor, env); /* espera que mensagem vazia ("envelope") chegue */
msg = produz_msg(); /* gera algo para enviar ao consumidor */
send(Consumidor, msg); /* envia mensagem ao consumidor */
}
}

void Consumidor()
{
Mensagem env;
Mensagem msg;

int i;

for (i=0; i<MAXFILA; i++) /* envia MAXFILA envelopes */
send(Produtor, env);
while (1) { /* laço infinito */
receive(Produtor, msg); /* recebe mensagem do produtor */
send(Produtor, env); /* envia envelope de volta */
consome_msg(msg); /* faz algo com a mensagem */
}
}

Alguém pode ser ainda mais especifico e me explicar o que esse prog faz?


  


2. Re: FILA / MESSAGE QUEUES

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 13/08/2015 - 00:00h


Produtor / Consumidor é um processo de sincronização entre threads, onde duas ou mais threads compartilham recursos independente uma da outra.

Um exemplo prático é a impressora de papel, onde o produtor é um computador e o consumidor é a impressora. Quando queremos imprimir algo, enviamos o arquivo para uma fila de impressão e esta é consumida pela impressora. Podemos enviar vários arquivos de uma só vez para a fila, mas a impressora só irá consumir um por vezes e depois de terminar um impressão completa.

Olhando para esse código:

Existem duas funções, onde cada uma deverá ser executada em thread separada.
A função produtor, está presa a um laço infinito, para dizer que sempre irá processar, o dado compartilhado, são os objetos Mensagem.
Primeiro ele aguarda o tal envelope. Isso serve para dizer, okay, há espaço na fila para inserir uma nova mensagem para ser consumida. A fila possui um tamanho limitado. O segundo passo, produz_msg(), gera uma nova Mensagem e armazena em msg. msg será despachada para a fila, com a função send.
O consumidor envia uma série de envelopes, esse é ponto que diz, a fila tem MAXFILA posições. Seguido disso, aguarda uma mensagem do produtor, uma vez recebida, armazena em msg. Após, envia a notificação de volta para liberar a fila e consome a mensagem. Esses dois últimos passos servem para não bloquear o produtor. Uma vez que tenha recebido a mensagem da fila, a fila deve ser liberada para desbloquear o produtor, que aguarda uma oportunidade para inserir uma nova mensagem.




3. Re: FILA / MESSAGE QUEUES

sweetfury
sweetfury

(usa Debian)

Enviado em 13/08/2015 - 00:13h

Uilian, muito, muito, muitoo obrigada pelo retorno!
Mas assim, como eu poderia determinar o tamanho da fila? Sabemos que ela é finita, mas eu não tenho idéia de como determinar o tamanho.


Muito obrigada novamente!

"The quieter you become, the more you're able to hear …"


4. Re: FILA / MESSAGE QUEUES

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 13/08/2015 - 00:29h


O tamanho está armazenado na variável MAXFILA. Essa constante não está declarada nesse trecho de código que tu postou, mas creio que deve estar em alguma parte do seu código.


5. Re: FILA / MESSAGE QUEUES

sweetfury
sweetfury

(usa Debian)

Enviado em 13/08/2015 - 00:36h

Ok! Muito obrigada, Uilian! :D

"The quieter you become, the more you're able to hear …"






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts