b"\n_START_ARTICLE_\nPas de missatges\n_START_SECTION_\nIntroducci\xc3\xb3\n_START_PARAGRAPH_\nEl pas de missatges \xc3\xa9s una t\xc3\xa8cnica que s'utilitza per a, des d'un proc\xc3\xa9s, invocar de forma abstracta un comportament concret per part d'un altre actor (per exemple, executar una funci\xc3\xb3 o un programa). Aix\xc3\xb2 suposa un gran canvi respecte al model tradicional on es cridava als programes i funcions nom\xc3\xa9s pel seu nom, el pas de missatges constitueix un mecanisme essencial per a distingir una funci\xc3\xb3 de la seva implementaci\xc3\xb3 interna (el destinatari al rebre el missatge, decidir\xc3\xa0 l'acci\xc3\xb3 que ha d'executar per a complir la petici\xc3\xb3)._NEWLINE_Entre les avantatges que proporciona aquest mecanisme trobem el alt grau de compatibilitat, ja que pot ser v\xc3\xa0lid per a qualsevol tipus d'arquitectura de computadors, ja siguin sistemes distribu\xc3\xafts, arquitectures paral\xc2\xb7leles sense mem\xc3\xb2ria compartida i tamb\xc3\xa9 amb sistemes de mem\xc3\xb2ria compartida i, per altra banda, no existeix el problema de l'acc\xc3\xa9s en exclusi\xc3\xb3 m\xc3\xbatua a dades compartides.\n_START_SECTION_\nCas pr\xc3\xa1ctic en programaci\xc3\xb3 orientada a objectes\n_START_PARAGRAPH_\nUn exemple cl\xc3\xa0ssic de aplicaci\xc3\xb3 del model de pas de missatges pot ser en l'\xc3\xa0mbit de la inform\xc3\xa0tica gr\xc3\xa0fica. Per exemple, si el programador est\xc3\xa0 creant un programa que treballa amb diversos tipus de formes geom\xc3\xa8triques de una classe Forma,\xc2\xa0 el programa contindr\xc3\xa0 varis objectes inst\xc3\xa0ncies de la classe mencionada, com per exemple un quadrat, un rombe o triangle._NEWLINE_Imaginem el cas en qu\xc3\xa8 el programador desitja con\xc3\xa8ixer l\xe2\x80\x99\xc3\xa0rea dels objectes de la classe Forma declarats. Com el c\xc3\xa0lcul de les \xc3\xa0rees de les formes no \xc3\xa9s el mateix per a totes, en un model tradicional el programador es veuria obligat a crear una estructura condicional IF-ELSE que consult\xc3\xa9s el tipus de forma que \xc3\xa9s per a executar la operaci\xc3\xb3 matem\xc3\xa0tica corresponent._NEWLINE_En lloc d'aix\xc3\xb2, el model de pas de missatges nom\xc3\xa9s necessita enviar un missatge a cada objecte consultant l'\xc3\xa0rea. Seria la implementaci\xc3\xb3 interna de la classe Forma la que s'encarregaria de escollir i calcular la forma correcta. El objecte, respondria a la petici\xc3\xb3 enviant un altre missatge al destinatari amb el \xc3\xa0rea resultant del c\xc3\xa0lcul. Com es natural, per que aix\xc3\xb2 sigui possible, la classe destinat\xc3\xa0ria ha de tenir implementat pr\xc3\xa8viament el m\xc3\xa8tode per a poder interpretar els missatges de forma normalitzada, aix\xc3\xad com les funcions necess\xc3\xa0ries per a realitzar el c\xc3\xa0lcul de l'\xc3\xa0rea.\n_START_SECTION_\nCaracter\xc3\xadstiques canals de comunicaci\xc3\xb3\n_START_PARAGRAPH_\nSegons les caracter\xc3\xadstiques del canal de comunicaci\xc3\xb3 o enlla\xc3\xa7 utilitzat entre processos es poden distingir els seg\xc3\xbcents aspectes:\n_START_SECTION_\nSeguretat\n_START_PARAGRAPH_\nUn concepte fonamental relacionat amb la difer\xc3\xa8ncia entre el pas s\xc3\xadncron i as\xc3\xadncron \xc3\xa9s la seguretat del pas del missatge. El pas del missatge \xc3\xa9s segur quan podem garantir que el missatge que rep el destinat\xc3\xa0ria \xc3\xa9s el mateix que envia el emissor i que no s'ha produ\xc3\xaft ninguna alteraci\xc3\xb3 en el contingut del missatge durant el temps que transcorre entre el enviament i la recepci\xc3\xb3. El enviament s\xc3\xadncron sempre es segur, en canvi, el as\xc3\xadncron no es segur, pel que \xc3\xa9s el programador qui s'ha d'encarregar de garantir la seguretat del missatge.\n_START_SECTION_\nSincronitzaci\xc3\xb3\n_START_PARAGRAPH_\nLa recepci\xc3\xb3 i enviament en el pas de missatges poden estar definides com a bloquejant o no bloquejant, \xc3\xa9s a dir, el proc\xc3\xa9s que envia/rep el missatge continuar\xc3\xa1 o no segons aquest comportament. Segons aquesta necessitat o no de sincronitzaci\xc3\xb3 es distingeixen:\n_START_SECTION_\nS\xc3\xadncron\n_START_PARAGRAPH_\nEnviament/recepci\xc3\xb3 bloquejant, emissor i receptor es sincronitzen per intercanviar cada missatge (Analogia: parlar per tel\xc3\xa8fon amb una persona). El pas de missatge s\xc3\xadncron sempre es segur, ja que es pot garantir que no hi ha possibilitat que el missatge pugui ser modificat en el pas del temps. Aquest \xc3\xa9s f\xc3\xa0cil de implementar per\xc3\xb2 es poc flexible, ja que els dos processos han d'esperar fins a estar en el mateix punt del seu codi per a poder comunicar el missatge, evitant que es pugui garantir que el temps que passa entre que el emissor executi la instrucci\xc3\xb3 send() fins que el receptor executi la instrucci\xc3\xb3 receive() sigui raonable, podent perjudicar al rendiment dels dos processos. Una mala programaci\xc3\xb3 pot arribar a que un proc\xc3\xa9s executi una funci\xc3\xb3 d'enviament i que no tingui la seva corresponent funci\xc3\xb3 de recepci\xc3\xb3 o viceversa, podent quedar bloquejats indefinidament esperant l'un a l'altre (deadlock).\n_START_SECTION_\nAs\xc3\xadncron\n_START_PARAGRAPH_\nEnviament/recepci\xc3\xb3 no bloquejant, l'emissor continua executant-se sense esperar a que la comunicaci\xc3\xb3 tingui efecte (Analogia: E-mail, telegrames...). Que l'emissor no quedi bloquejat despr\xc3\xa9s d'enviar el missatge \xc3\xa9s una avantatge respecte a l'efici\xc3\xa8ncia general del sistema, per\xc3\xb2 pot portar riscos de seguretat en el pas del missatge, podent modificar variables enviades en un instant de temps abans que el receptor llegeixi el valor correcte (consist\xc3\xa8ncia). En general, aquest comportament permet major grau de concurr\xc3\xa8ncia, per\xc3\xb2 necessita d'implementacions de cues de missatges o buffer.\n_START_SECTION_\nEnviament as\xc3\xadncron fiable\n_START_PARAGRAPH_\nHabitualment, els est\xc3\xa0ndards inclouen un mecanisme de pas de missatges que, encara que sent as\xc3\xadncron, garanteixen la fiabilitat de l'enviament. D'aquesta manera l'emissor executa la funci\xc3\xb3 corresponent (send()), c\xc3\xb2pia les dades en un lloc segur per evitar que aquestes es puguin modificar, i a continuaci\xc3\xb3 continua la seva execuci\xc3\xb3 amb normalitat. En el moment que el proc\xc3\xa9s receptor executa la seva ordre per a rebre el missatge amb la primitiva (receive()), rebr\xc3\xa0 les dades que l'emissor va copiar inicialment en un lloc fiable, de manera que aix\xc3\xb2 garanteix que les dades no han estat modificades durant l'interval de temps transcorregut.\n_START_SECTION_\nEnviament as\xc3\xadncron no fiable\n_START_PARAGRAPH_\nA part de les funcions d'enviament as\xc3\xadncron fiable, les interf\xc3\xadcies de pas de missatges tamb\xc3\xa9 solen incorporar funcions que permeten passar missatges de forma no fiable. En aquest cas, el proc\xc3\xa9s emissor executar\xc3\xa0 l'ordre d'enviament insegur (i_send()), es donar\xc3\xa0 l'ordre d'enviament i instant\xc3\xa0niament es retornar\xc3\xa0 el control al programa principal, sense esperar que els bytes hagin acabat de ser llegits en l'emissor ni escrits en el receptor. Per la seva part, el receptor executar\xc3\xa0 l'ordre de recepci\xc3\xb3 no fiable (i_receive()), de manera que es donar\xc3\xa0 l'ordre de recepci\xc3\xb3 i a continuaci\xc3\xb3 es retornar\xc3\xa0 el control del programa, sense esperar que es completi l'enviament ni que acabin d'arribar les dades._NEWLINE_En aquest cas, el responsable de garantir manualment la integritat del missatge \xc3\xa9s el programador. Les interf\xc3\xadcies de pas de missatges incorporen una s\xc3\xa8rie de funcions que permeten al programador sondejar l'estat del missatge i actuar en conseq\xc3\xbc\xc3\xa8ncia. Concretament, es disposa de funcions de sondeig bloquejant (wait_send() i wait_recv()), les quals bloquegen l'emissor i receptor respectivament si l'enviament o recepci\xc3\xb3 del missatge encara no ha finalitzat. El programador tamb\xc3\xa9 disposa de funcions de sondeig no bloquejant (test_send() i test_recv()) que permeten con\xc3\xa8ixer aquesta mateixa informaci\xc3\xb3 sense bloquejar cap proc\xc3\xa9s, simplement retornant un valor boole\xc3\xa0 perqu\xc3\xa8 sigui el programador el que decideixi l'acci\xc3\xb3 a prendre en cada cas."