{"id":232,"date":"2023-09-26T15:42:25","date_gmt":"2023-09-26T14:42:25","guid":{"rendered":"https:\/\/guillemrueda.com\/blog\/?p=232"},"modified":"2023-09-26T15:55:08","modified_gmt":"2023-09-26T14:55:08","slug":"memoria-compartida-entre-processos","status":"publish","type":"post","link":"https:\/\/guillemrueda.com\/blog\/2023\/09\/26\/memoria-compartida-entre-processos\/","title":{"rendered":"Mem\u00f2ria compartida entre processos"},"content":{"rendered":"\n<p>Problema:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es requereix afegir una interconnexi\u00f3 amb una aplicaci\u00f3 que els seus m\u00e8todes p\u00fablics estan en un format antic, en aquest cas, <em>ActiveX<\/em>.<\/li>\n\n\n\n<li>Aquests controls s\u00f3n exclusivament en 32-bits.<\/li>\n\n\n\n<li>La aplicaci\u00f3 que els ha de consumir \u00e9s multi-plataforma i no pot ser condicionada per connectar-se amb aquesta aplicaci\u00f3, el qual \u00e9s access\u00f2ria.<\/li>\n<\/ul>\n\n\n\n<p>Possibles solucions d&#8217;arquitectura:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Crear diferents compilacions (no desitjable, complica el codi i obliga a publicar-ne diferents versions)<\/li>\n\n\n\n<li>Crear una aplicaci\u00f3 en servei del sistema operatiu (malauradament en aquest cas queda descartat ja que el control de ActiveX ens obliga a tenir acc\u00e9s al <em>System.Windows.Forms<\/em>)<\/li>\n\n\n\n<li>Crear una aplicaci\u00f3 instanciada des la aplicaci\u00f3 principal<\/li>\n<\/ul>\n\n\n\n<p>Al final he triat la \u00faltima soluci\u00f3 a la qual ens trobem doncs que la intercomunicaci\u00f3 entre els processos la podem fer amb diferents m\u00e8todes<sup data-fn=\"80a5e49c-a35e-442f-8aea-7ca02047ed9c\" class=\"fn\"><a href=\"#80a5e49c-a35e-442f-8aea-7ca02047ed9c\" id=\"80a5e49c-a35e-442f-8aea-7ca02047ed9c-link\">1<\/a><\/sup><sup data-fn=\"4d0f0194-84de-4854-8369-32b5e0fcafb3\" class=\"fn\"><a href=\"#4d0f0194-84de-4854-8369-32b5e0fcafb3\" id=\"4d0f0194-84de-4854-8369-32b5e0fcafb3-link\">2<\/a><\/sup>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Utilitzar un fitxer d&#8217;entrada i un altre de sortida entre les aplicacions: potser un m\u00e8tode efica\u00e7 i r\u00e0pid, f\u00e0cil de transmetre a trav\u00e9s de parametritzaci\u00f3 i lectura de sortida est\u00e0ndard. <\/li>\n\n\n\n<li>Pipes\/Canonades(an\u00f2nims i anomenats)<sup data-fn=\"92ae8233-cd26-4768-8ccb-8a62e633d6f0\" class=\"fn\"><a href=\"#92ae8233-cd26-4768-8ccb-8a62e633d6f0\" id=\"92ae8233-cd26-4768-8ccb-8a62e633d6f0-link\">3<\/a><\/sup><sup data-fn=\"a8894fc9-9d62-4bd9-a282-d8d66ec6e284\" class=\"fn\"><a href=\"#a8894fc9-9d62-4bd9-a282-d8d66ec6e284\" id=\"a8894fc9-9d62-4bd9-a282-d8d66ec6e284-link\">4<\/a><\/sup>: ens obligaria a establir un protocol degut a les poques dimensions dels missatges capa\u00e7os de ser retransmesos per canonades\/pipes.<\/li>\n\n\n\n<li>Sockets (a trav\u00e9s de WCF o Remoting<sup data-fn=\"436ca2d2-cc74-4309-a041-e040953883c2\" class=\"fn\"><a href=\"#436ca2d2-cc74-4309-a041-e040953883c2\" id=\"436ca2d2-cc74-4309-a041-e040953883c2-link\">5<\/a><\/sup>): complica el codi i ens obliga a establir protocol de funcionament.<\/li>\n\n\n\n<li>Per la consola: \u00e9s el m\u00e8tode m\u00e9s a pic i pala per\u00f2 el que podem garantir una prova de concepte. El problema \u00e9s que a major quantitat de dades m\u00e9s lent es torna, m\u00e8tode lent ja de per si.<\/li>\n\n\n\n<li>Mem\u00f2ria compartida<sup data-fn=\"19ae2db0-5df0-49b6-9c1c-b53b11a9ae9b\" class=\"fn\"><a href=\"#19ae2db0-5df0-49b6-9c1c-b53b11a9ae9b\" id=\"19ae2db0-5df0-49b6-9c1c-b53b11a9ae9b-link\">6<\/a><\/sup><sup data-fn=\"a92e677d-fdcb-4e1c-b0f7-945368e3f1d4\" class=\"fn\"><a href=\"#a92e677d-fdcb-4e1c-b0f7-945368e3f1d4\" id=\"a92e677d-fdcb-4e1c-b0f7-945368e3f1d4-link\">7<\/a><\/sup>: aquesta es pot fer a trav\u00e9s de fitxers <em>mapejats <\/em>en mem\u00f2ria, el qual tamb\u00e9 ens facilita la interconnexi\u00f3 i a m\u00e9s a m\u00e9s amb mutex podem establir un nivell de seguretat bastant alta de orde de processament.<\/li>\n<\/ul>\n\n\n\n<p>La transmissi\u00f3 de dades es pot fer per classes (despr\u00e9s fer <em>marshalling<\/em>) o per serialitzaci\u00f3 (tant JSON com XML). He triat JSON perqu\u00e8 \u00e9s la que menys ocupar\u00e0 i en part, perqu\u00e8 si es fan registres d&#8217;entrada i sortida ja disposem d&#8217;eines per llegir-los i analitzar-los.<\/p>\n\n\n\n<p>Un punt clau s\u00f3n els <em>mutex<\/em>. Encara que l&#8217;ordre de execuci\u00f3 dels processos \u00e9s seq\u00fcencial, aix\u00f2 ens donar\u00e0 possibilitat de que evitar que es llegeixin posicions abans de que s&#8217;hagin acabat de escriure.<\/p>\n\n\n\n<p>Tant els fitxers com els pipes ser\u00e0 essencial qu\u00e8 siguin creats per la aplicaci\u00f3 principal: aix\u00f2 ens donar\u00e0 l&#8217;avantatge de controlar quan la mem\u00f2ria ha de ser creada i netejada.<\/p>\n\n\n\n<p>La crida a la aplicaci\u00f3 que contindr\u00e0 els accessos a <em>ActiveX <\/em>es fa mitjan\u00e7ant System.Diagnostics<sup data-fn=\"d8530c58-e7f4-4ec5-967c-59c06c555fe5\" class=\"fn\"><a href=\"#d8530c58-e7f4-4ec5-967c-59c06c555fe5\" id=\"d8530c58-e7f4-4ec5-967c-59c06c555fe5-link\">8<\/a><\/sup> aquesta API ens permet a trav\u00e9s de <em>StartInfo <\/em>de aportar par\u00e0metres a la aplicaci\u00f3 (propietat arguments), com redirigir el input i output est\u00e0ndard (propietat StandardOutput.ReadToEnd() per a obtenir el string de sortida).<\/p>\n\n\n\n<p>Codi:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/Ruekov\/e98b045bd2ac595c97532872096af11d.js\"><\/script>\n\n\n<ol class=\"wp-block-footnotes\"><li id=\"80a5e49c-a35e-442f-8aea-7ca02047ed9c\"><a href=\"https:\/\/stackoverflow.com\/a\/65731962\/2219577\">https:\/\/stackoverflow.com\/a\/65731962\/2219577<\/a> <a href=\"#80a5e49c-a35e-442f-8aea-7ca02047ed9c-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 1\">\u21a9\ufe0e<\/a><\/li><li id=\"4d0f0194-84de-4854-8369-32b5e0fcafb3\"><a href=\"https:\/\/stackoverflow.com\/a\/14140726\/2219577\">https:\/\/stackoverflow.com\/a\/14140726\/2219577<\/a> <a href=\"#4d0f0194-84de-4854-8369-32b5e0fcafb3-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 2\">\u21a9\ufe0e<\/a><\/li><li id=\"92ae8233-cd26-4768-8ccb-8a62e633d6f0\"><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/pipe-operations\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/pipe-operations<\/a> <a href=\"#92ae8233-cd26-4768-8ccb-8a62e633d6f0-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 3\">\u21a9\ufe0e<\/a><\/li><li id=\"a8894fc9-9d62-4bd9-a282-d8d66ec6e284\"><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.pipes.anonymouspipeserverstream\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.pipes.anonymouspipeserverstream<\/a> <a href=\"#a8894fc9-9d62-4bd9-a282-d8d66ec6e284-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 4\">\u21a9\ufe0e<\/a><\/li><li id=\"436ca2d2-cc74-4309-a041-e040953883c2\"><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.runtime.remoting.channels.ipc.ipcchannel\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.runtime.remoting.channels.ipc.ipcchannel<\/a> <a href=\"#436ca2d2-cc74-4309-a041-e040953883c2-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 5\">\u21a9\ufe0e<\/a><\/li><li id=\"19ae2db0-5df0-49b6-9c1c-b53b11a9ae9b\"><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/memory-mapped-files\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/memory-mapped-files<\/a> <a href=\"#19ae2db0-5df0-49b6-9c1c-b53b11a9ae9b-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 6\">\u21a9\ufe0e<\/a><\/li><li id=\"a92e677d-fdcb-4e1c-b0f7-945368e3f1d4\"><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.memorymappedfiles.memorymappedfile.createnew\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.memorymappedfiles.memorymappedfile.createnew<\/a> <a href=\"#a92e677d-fdcb-4e1c-b0f7-945368e3f1d4-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 7\">\u21a9\ufe0e<\/a><\/li><li id=\"d8530c58-e7f4-4ec5-967c-59c06c555fe5\"><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.diagnostics.process\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.diagnostics.process<\/a> <a href=\"#d8530c58-e7f4-4ec5-967c-59c06c555fe5-link\" aria-label=\"Ves a la refer\u00e8ncia de la nota al peu 8\">\u21a9\ufe0e<\/a><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>Problema: Possibles solucions d&#8217;arquitectura: Al final he triat la \u00faltima soluci\u00f3 a la qual ens trobem doncs que la intercomunicaci\u00f3 entre els processos la podem fer amb diferents m\u00e8todes: La transmissi\u00f3 de dades es pot fer per classes (despr\u00e9s fer marshalling) o per serialitzaci\u00f3 (tant JSON com XML). He triat JSON perqu\u00e8 \u00e9s la que &hellip; <a href=\"https:\/\/guillemrueda.com\/blog\/2023\/09\/26\/memoria-compartida-entre-processos\/\" class=\"more-link\">Continua la lectura de <span class=\"screen-reader-text\">Mem\u00f2ria compartida entre processos<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"[{\"content\":\"<a href=\\\"https:\/\/stackoverflow.com\/a\/65731962\/2219577\\\">https:\/\/stackoverflow.com\/a\/65731962\/2219577<\/a>\",\"id\":\"80a5e49c-a35e-442f-8aea-7ca02047ed9c\"},{\"content\":\"<a href=\\\"https:\/\/stackoverflow.com\/a\/14140726\/2219577\\\">https:\/\/stackoverflow.com\/a\/14140726\/2219577<\/a>\",\"id\":\"4d0f0194-84de-4854-8369-32b5e0fcafb3\"},{\"content\":\"<a href=\\\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/pipe-operations\\\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/pipe-operations<\/a>\",\"id\":\"92ae8233-cd26-4768-8ccb-8a62e633d6f0\"},{\"content\":\"<a href=\\\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.pipes.anonymouspipeserverstream\\\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.pipes.anonymouspipeserverstream<\/a>\",\"id\":\"a8894fc9-9d62-4bd9-a282-d8d66ec6e284\"},{\"content\":\"<a href=\\\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.runtime.remoting.channels.ipc.ipcchannel\\\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.runtime.remoting.channels.ipc.ipcchannel<\/a>\",\"id\":\"436ca2d2-cc74-4309-a041-e040953883c2\"},{\"content\":\"<a href=\\\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/memory-mapped-files\\\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/standard\/io\/memory-mapped-files<\/a>\",\"id\":\"19ae2db0-5df0-49b6-9c1c-b53b11a9ae9b\"},{\"content\":\"<a href=\\\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.memorymappedfiles.memorymappedfile.createnew\\\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.io.memorymappedfiles.memorymappedfile.createnew<\/a>\",\"id\":\"a92e677d-fdcb-4e1c-b0f7-945368e3f1d4\"},{\"content\":\"<a href=\\\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.diagnostics.process\\\">https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/system.diagnostics.process<\/a>\",\"id\":\"d8530c58-e7f4-4ec5-967c-59c06c555fe5\"}]"},"categories":[7,19,6,25],"tags":[],"class_list":["post-232","post","type-post","status-publish","format-standard","hentry","category-net-programacio","category-c","category-programacio","category-vbnet"],"_links":{"self":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/comments?post=232"}],"version-history":[{"count":4,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/232\/revisions"}],"predecessor-version":[{"id":237,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/posts\/232\/revisions\/237"}],"wp:attachment":[{"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/media?parent=232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/categories?post=232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guillemrueda.com\/blog\/wp-json\/wp\/v2\/tags?post=232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}