{"id":55,"date":"2014-09-17T03:05:20","date_gmt":"2014-09-17T03:05:20","guid":{"rendered":"https:\/\/www.uniessa.hiperlogic.com.br\/?p=55"},"modified":"2014-09-17T03:05:20","modified_gmt":"2014-09-17T03:05:20","slug":"cooperacao-entre-processos","status":"publish","type":"post","link":"https:\/\/www.uniessa.hiperlogic.com.br\/?p=55","title":{"rendered":"Coopera\u00e7\u00e3o entre Processos"},"content":{"rendered":"<p>&nbsp;<\/p>\n<ul>\n<li>Processos independentes n\u00e3o podem afetar ou ser afetados pela execu\u00e7\u00e3o de outros<\/li>\n<li>Vantagens da coopera\u00e7\u00e3o entre processos\n<ul>\n<li>Compartilhamento de informa\u00e7\u00e3o<\/li>\n<li>Aumento da velocidade de processamento<\/li>\n<li>Modularidade<\/li>\n<li>Conveni\u00eancia<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Problema do Produtor\/Consumidor<\/strong><\/p>\n<ul>\n<li>Modelo b\u00e1sico de coopera\u00e7\u00e3o geral\n<ul>\n<li>Produtor produz informa\u00e7\u00e3o e entrega ao consumidor<\/li>\n<li>Consumidor utiliza a informa\u00e7\u00e3o recebida<\/li>\n<\/ul>\n<\/li>\n<li>Comunica\u00e7\u00e3o pode ser feita por um buffer\n<ul>\n<li>Buffer de tamanho limitado imp\u00f5e restri\u00e7\u00f5es<\/li>\n<li>Mesmo buffer ilimitado deve caber na mem\u00f3ria<\/li>\n<\/ul>\n<\/li>\n<li>Comunica\u00e7\u00e3o pode ser tamb\u00e9m por mensagens<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Buffer fixo (Mem. Compartilhada)<\/strong><\/p>\n<ul>\n<li>Dados compartilhados em fila circular<\/li>\n<\/ul>\n<p><span style=\"color: #0000ff;\">#define BUFFER_SIZE 10<\/span><\/p>\n<p><span style=\"color: #339966;\">typedef struct <\/span>{<\/p>\n<p>&#8230;<\/p>\n<p>} item;<\/p>\n<p>item buffer[BUFFER_SIZE];<\/p>\n<p><span style=\"color: #339966;\">int<\/span> in=0;<\/p>\n<p><span style=\"color: #339966;\">int<\/span> out=0;<\/p>\n<p><span style=\"color: #0000ff;\">#define BUF_FILL (((in+1)%BUFFER_SIZE)==out)<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>S\u00f3 pode usar BUFFER_SIZE-1 posi\u00e7\u00f5es<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>item nextProduced;<\/p>\n<p>while(1){<\/p>\n<p>\/**\/ while(((in+1)%BUFFER_SIZE)==out)<\/p>\n<p>\/**\/ \u00a0 \u00a0 \u00a0 \u00a0 ; \u00a0 \u00a0 \/* n\u00e3o faz nada!*\/<\/p>\n<p>\/**\/ \u00a0 buffer[in]=nextProduced;<\/p>\n<p>\/**\/ \u00a0 in=(in+1)%BUFFER_SIZE;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>item nextConsumed;<\/p>\n<p>while(1) {<\/p>\n<p>\/**\/ \u00a0while(in==out)<\/p>\n<p>\/**\/ \u00a0 \u00a0 \u00a0 \u00a0; \u00a0\/* n\u00e3o faz nada *\/<\/p>\n<p>\/**\/ \u00a0 nextConsumed = buffer[out];<\/p>\n<p>\/**\/ \u00a0 out=(out+1)%BUFFER_SIZE;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Comunica\u00e7\u00e3o entre processos (IPC)<\/strong><\/p>\n<ul>\n<li>Sistema de troca de mensagens, sem mem\u00f3ria compartil\u00e7hada\n<ul>\n<li>Comunica\u00e7\u00e3o e sincroniza\u00e7\u00e3o<\/li>\n<\/ul>\n<\/li>\n<li>Baseado em duas opera\u00e7\u00f5es b\u00e1sicas:\n<ul>\n<li>send(message) &#8211; tamanho fixo ou vari\u00e1vel<\/li>\n<li>receive(message)<\/li>\n<\/ul>\n<\/li>\n<li>se P e Q querem se comunicar, eles devem:\n<ul>\n<li>Estabelecer um canal de comunica\u00e7\u00e3o<\/li>\n<li>trocar mensagens com send\/receive<\/li>\n<\/ul>\n<\/li>\n<li>Implementa\u00e7\u00e3o do canal de comunica\u00e7\u00e3o\n<ul>\n<li>Escolha do meio: Barramento de HW, mem\u00f3ria<\/li>\n<\/ul>\n<\/li>\n<li>Comportamento l\u00f3gico: como funciona<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Decis\u00f5es de implementa\u00e7\u00e3o<\/strong><\/p>\n<ul>\n<li>Como os canais s\u00e3o criados\/estabelecidos?<\/li>\n<li>Um canal pode ligar mais de dois processos?<\/li>\n<li>Quantos canais podem ligar um mesmo par?<\/li>\n<li>Qual a capacidade do canal?<\/li>\n<li>As mensagens s\u00e3o de tamanho fixo ou vari\u00e1vel?<\/li>\n<li>Cada canal \u00e9 uni ou bidirecional?<\/li>\n<li>Qual o comportamento de send\/receive se\n<ul>\n<li>O canal est\u00e1 cheio, ou<\/li>\n<li>As chamadas n\u00e3o ocorrem ao mesmo tempo?<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Comunica\u00e7\u00e3o Direta<\/strong><\/p>\n<ul>\n<li>Processos identificam o outro explicitamente<\/li>\n<li>send(P, message)<\/li>\n<li>receive(Q. message)\n<ul>\n<li>recep\u00e7\u00e3o pode usar m\u00e1scara, como Q=qualquer um<\/li>\n<\/ul>\n<\/li>\n<li>Propriedades do canal de comunica\u00e7\u00e3o direta:\n<ul>\n<li>Estabelecimento \u00e9 autom\u00e1tico<\/li>\n<li>Cada canal liga exatamente um par de processos<\/li>\n<li>Existe apenas um canal entre cada par<\/li>\n<li>Canais s\u00e3o usualmente bidirecionais<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Comunica\u00e7\u00e3o Indireta<\/strong><\/p>\n<ul>\n<li>Mensagens s\u00e3o originadas de e direcionadas para portos (ports)\n<ul>\n<li>Cada porto tem um identificador \u00fanicao<\/li>\n<li>Processos s\u00f3 se comunicam se compartilharem um porto<\/li>\n<li>Portos s\u00e3o recursos independentes que precisam ser criados e destru\u00eddos<\/li>\n<\/ul>\n<\/li>\n<li>Propriedades dos canais\n<ul>\n<li>Estabelecimento vinculado ao compartilhamento<\/li>\n<li>Um canal pode ligar v\u00e1rios processos<\/li>\n<li>Cada par de processos pode ter v\u00e1rios canais<\/li>\n<li>Canais podem ser uni ou bidirecionais<\/li>\n<\/ul>\n<\/li>\n<li>Compartilhamento de portos\n<ul>\n<li>P1, P2 e P3 compartilham o porto A<\/li>\n<li>P1 envia mensagem, quem recebe?<\/li>\n<\/ul>\n<\/li>\n<li>Diversas solu\u00e7\u00f5es s\u00e3o poss\u00edveis\n<ul>\n<li>Restringir o compartilhamento a 2 processos<\/li>\n<li>Permitir que s\u00f3 um processo chame receive de cada vez<\/li>\n<li>Escolher arbitrariamente quem recebe a msg<\/li>\n<li>entregar uma c\u00f3pia a cada receive<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Sincroniza\u00e7\u00e3o de Primitivas<\/strong><\/p>\n<ul>\n<li>Troca de mensagens: Bloqueante ou n\u00e3o\n<ul>\n<li>Bloqueante: S\u00edncrona<\/li>\n<li>N\u00e3o bloqueante: ass\u00edncrona<\/li>\n<\/ul>\n<\/li>\n<li>Cada primitiva (send\/receive) pode se comportar de uma forma. Mais comum:\n<ul>\n<li>send ass\u00edncrono (retorna imediatamente)<\/li>\n<li>receive s\u00edncrono (bloqueia at\u00e9 a mensagem chegar)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>Controle de Espa\u00e7o no Canal<\/strong><\/p>\n<ul>\n<li>Implementa\u00e7\u00e3o da fila de mensagens associadas a um canal enquanto em transito\n<ul>\n<li>Capacidade zero: O canal n\u00e3o guarda mensagens, o transmissor deve faz\u00ea-lo esperando pelo receptor (rendezvous)<\/li>\n<li>Capacidade limitada: Send \u00e9 ass\u00edncrono enquanto a capacidade n\u00e3o \u00e9 alcan\u00e7ada<\/li>\n<li>Capacidade ilimitada: Send nunca espera.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Processos independentes n\u00e3o podem afetar ou ser afetados pela execu\u00e7\u00e3o de outros Vantagens da coopera\u00e7\u00e3o entre processos Compartilhamento de informa\u00e7\u00e3o Aumento da velocidade de processamento Modularidade Conveni\u00eancia &nbsp; Problema do Produtor\/Consumidor Modelo b\u00e1sico de coopera\u00e7\u00e3o geral Produtor produz informa\u00e7\u00e3o e entrega ao consumidor Consumidor utiliza a informa\u00e7\u00e3o recebida Comunica\u00e7\u00e3o pode ser feita por um [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[13],"class_list":["post-55","post","type-post","status-publish","format-standard","hentry","category-so","tag-cooperacao-entre-processos"],"_links":{"self":[{"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=\/wp\/v2\/posts\/55","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=55"}],"version-history":[{"count":1,"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=\/wp\/v2\/posts\/55\/revisions"}],"predecessor-version":[{"id":56,"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=\/wp\/v2\/posts\/55\/revisions\/56"}],"wp:attachment":[{"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=55"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=55"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.uniessa.hiperlogic.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=55"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}