Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto
Pensato per il professionista sempre in movimento, HP Elitebook Ultra G1i 14 abbina una piattaforma Intel Core Ultra 7 ad una costruzione robusta, riuscendo a mantenere un peso contenuto e una facile trasportabilità. Ottime prestazioni per gli ambiti di produttività personale con un'autonomia lontano dalla presa di corrente che permette di lavorare per tutta la giornata
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-03-2017, 19:30   #1
fano
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2095
[C#] Libreria IPC basata su Message Passing

Ciao a tutti!

Noi sviluppiamo applicazioni su Architettura Distribuita e quindi spesso usiamo processi quando in un'applicazione moderna si userebbero thread... il tutto è scritto in C (), con 2 demoni che rompono le palle più che altro e i processi sono creati con la classica fork() / exec().

Il mio sogno sarebbe di passare a C# e - con la scusa - usare qualcosa di più moderno... ma il fatto che esistono più processi per fare le cose mi interessa mantenerlo sia perché ho bisogno che l'applicazione possa essere divisa su più macchine sia perché è comodo magari per il collega sviluppare una parte e farsi la sua mini "applicazione" senza quello che sto sviluppando io e che magari ancora non funziona.

Così questo sarebbe quello che mi piacerebbe avere:
  1. Lo scambio deve avvenire con dei messaggi, la libreria non dovrebbe avere alcun interesse al contenuto, ma solo trovare il processo / destinatario e inviargli il messaggio
  2. La libreria non deve imporre il suo formato di serializzazione per esempio devo poter passare da Json a MessagePack senza minimamente toccare il mio codice, ma semplicemente cambiando la configurazione. WCF quindi non va bene perché usa XML come formato di serializzazione
  3. La versione originale della libreria nel classico stile Unix anni '50 usava i socket per comunicare tra i processi, ci siamo accorti ben presto che per il nostro uso era troppo lenta la rete e così passammo alle real time queue... mantenendo la rete per il raro caso in cui il processo giri su un'altra macchina. Ecco la libreria che ciò sto cercando dovrebbe essere "furba" nello stesso modo usare il sistema di comunicazione più veloce se sono sulla stessa macchina e usare la rete solo nel caso in cui il processo sia remoto
  4. Non deve essere richiesto di fare configurazioni strane, avere server / demoni tra i piedi o altro... deve funzionare e basta!
  5. La comunicazione tra i processi deve essere quasi istantanea per intenderci > 10 ms e siamo morti
  6. Essendo in C# mi aspetto che funzioni ovunque (pure su Cosmos in futuro ovviamente )
  7. Plus che con l'attuale libreria un thread non può ricevere messaggi, in alcuni casi sarebbe utile farlo ovviamente i messaggi li potrebbe ricevere solo dal thread main o da altri thread suoi fratellini (per quanto se le queue esistono a livello di kernel e sono "file"...)
  8. Plus se quando cade la connessione di rete salva i messaggi da qualche parte per poi spararli tutti in una volta quando la connessione ritorna

Quindi una cosa del genere esiste già? O me la devo fare da solo?
__________________
Cosmos C# Open Source Managed Operating System
Cosmos Thread Ufficiale
Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat!

Ultima modifica di fano : 12-03-2017 alle 20:18.
fano è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2017, 14:27   #2
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Che io sappia, i meccanismi IPC inclusi in .Net sono wrapper su funzioni esposte dall'OS (socket, named pipe, mmf).

WCF è una tecnologia (ormai obsoleta) per webservice SOAP, quindi è un meccanismo di comunicazione basato su socket. Ad oggi meglio Asp.Net MVC Core.

Come funziona in COSMOS la comunicazione IPC?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2017, 17:46   #3
fano
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2095
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Che io sappia, i meccanismi IPC inclusi in .Net sono wrapper su funzioni esposte dall'OS (socket, named pipe, mmf).
Beh sì questo è ovvio! Lo pipe se sono come su Linux hanno il problema che hanno una dimensione schiantata e NON modificabile e quando si riempono si blocca tutto
Le real time queue sono configurabili per numero massimo di messaggi e dimensione massima di ogni messaggio, inoltre puoi fare in modo che quando la coda è piena o si blocca chi scrive (fino a che chi legge scoda) o si iniziano a cacciare nel c*sso i messaggi!

Abbiamo "risolto" mettendo numero enormi... in un'applicazione real time in ogni caso se il ricevente non scoda abbastanza velocemente sei nella brilla

Il socket come ho detto sopra quando i processi si trovano sulla stessa macchina è meglio evitarli...

L'unica "wrapper" che ho visto simile come concetto alle code real time è questo:
https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx

però non se esiste nulla ad alto livello e soprattutto Mono le supporterà?

Quote:
Originariamente inviato da tomminno Guarda i messaggi
WCF è una tecnologia (ormai obsoleta) per webservice SOAP, quindi è un meccanismo di comunicazione basato su socket. Ad oggi meglio Asp.Net MVC Core.
Però tipicamente le mie applicazioni non hanno nulla a che fare con WEB, acquisiscono eventi "real time", li processano, a volte c'è anche un operatore che smanazza su una GUI fatta comunque come fosse un'applicazione desktop (attualmente su Linux usiamo Qt... un disastro)...

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Come funziona in COSMOS la comunicazione IPC?
Per ora non abbiamo ancora il multi processing comunque su un SO come Cosmos in cui i processi saranno molto probabilmente "thread" sarà molto semplice fare IPC una volta trovato il "ricevente" potrai chiamare direttamente la sua "Recv()" dandogli l'ownership dell'oggetto "Message" ovvero senza dover serializzare nulla e senza copie

P.S. MessageQueue impone serializzazione in XML quindi è da scartare...
__________________
Cosmos C# Open Source Managed Operating System
Cosmos Thread Ufficiale
Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat!

Ultima modifica di fano : 13-03-2017 alle 17:49.
fano è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2017, 14:10   #4
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da fano Guarda i messaggi
Beh sì questo è ovvio! Lo pipe se sono come su Linux hanno il problema che hanno una dimensione schiantata e NON modificabile e quando si riempono si blocca tutto
Le real time queue sono configurabili per numero massimo di messaggi e dimensione massima di ogni messaggio, inoltre puoi fare in modo che quando la coda è piena o si blocca chi scrive (fino a che chi legge scoda) o si iniziano a cacciare nel c*sso i messaggi!

Abbiamo "risolto" mettendo numero enormi... in un'applicazione real time in ogni caso se il ricevente non scoda abbastanza velocemente sei nella brilla
Ma quindi usate già una coda Real Time? E cosa state usando?

Quote:
Il socket come ho detto sopra quando i processi si trovano sulla stessa macchina è meglio evitarli...
"Applicazione distribuita" e "stessa macchina" sono antitetici
Non vedo molte altre alternative: o Named Pipe o Memory Mapped File.

Quote:
L'unica "wrapper" che ho visto simile come concetto alle code real time è questo:
https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx

però non se esiste nulla ad alto livello e soprattutto Mono le supporterà?
E' un wrapper per MSMQ quindi disponibile solo su Windows, non ho idea se esista qualcosa di compatibile su Linux.

Quote:
Però tipicamente le mie applicazioni non hanno nulla a che fare con WEB, acquisiscono eventi "real time", li processano, a volte c'è anche un operatore che smanazza su una GUI fatta comunque come fosse un'applicazione desktop (attualmente su Linux usiamo Qt... un disastro)...
Ma hai veramente requisiti real time? Perchè in tal caso mi pare veramente strano realizzare un'applicazione distribuita che poi lavora sulla stessa macchina. Generalmente in sistemi Real Time si vanno a fare i conti al millisecondo (o peggio) per il tempo a disposizione per la computazione e da lì si parte per realizzare un'algoritmo che completi in ogni modo entro il tempo previsto.

Il fatto che si chiamino webservice non significa che siano applicabili solo all'ambito web
Qt nella versione widget a volte sono un po' legnose, ma un disastro proprio?

Quote:
Per ora non abbiamo ancora il multi processing comunque su un SO come Cosmos in cui i processi saranno molto probabilmente "thread" sarà molto semplice fare IPC una volta trovato il "ricevente" potrai chiamare direttamente la sua "Recv()" dandogli l'ownership dell'oggetto "Message" ovvero senza dover serializzare nulla e senza copie

P.S. MessageQueue impone serializzazione in XML quindi è da scartare...
Quindi ogni processo/thread avrà accesso alla memoria di tutti gli altri?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2017, 08:44   #5
fano
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2095
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Ma quindi usate già una coda Real Time? E cosa state usando?
Su Linux usiamo Posix Message Queue:
http://man7.org/linux/man-pages/man7/mq_overview.7.html

Quote:
Originariamente inviato da tomminno Guarda i messaggi
"Applicazione distribuita" e "stessa macchina" sono antitetici
Perché? La nostra "applicazione" è formata da più processi sia che si trovi tutto su una macchina sia che si trovino su più di una!

L'architettura attuale ha 3 difetti:

1. Usando Posix Message Queue funziona solo su Linux / Unix
2. E` scritta in C ()
3. Ha 2 processi "demoni" che servono di fatto solo per il caso (raro per altro) in cui l'applicazione sia distribuita su più macchine (solo in quel caso tra i "demoni" la comunicazione avviene su rete)

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Non vedo molte altre alternative: o Named Pipe o Memory Mapped File.
Ma le Named Pipe non hanno gli stessi problemi che su Unix / Linux? Ovvero che hanno una limitazione arbitraria sulla dimensione del messaggio e sul numero massimo di messaggi?

Quote:
Originariamente inviato da tomminno Guarda i messaggi
E' un wrapper per MSMQ quindi disponibile solo su Windows, non ho idea se esista qualcosa di compatibile su Linux.
In ogni caso non è la soluzione visto che impone XML come formato di serializzazione, siamo rimasti scottati in passato per aver usato la soluzione sbagliata (come json, sqlite, i socket) quindi voglio un sistema più modulare in cui posso sostituire il sistema di message packing o il DB (usando Entity Framework o NHibernate).

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Ma hai veramente requisiti real time? Perchè in tal caso mi pare veramente strano realizzare un'applicazione distribuita che poi lavora sulla stessa macchina. Generalmente in sistemi Real Time si vanno a fare i conti al millisecondo (o peggio) per il tempo a disposizione per la computazione e da lì si parte per realizzare un'algoritmo che completi in ogni modo entro il tempo previsto.
In realtà solo alcune parti dell'applicazione hanno requisiti real time, il resto tipo interfaccia utente, driver di una stampante non hanno questi problemi...

Comunque sì in molti casi riusciamo a fare tutta l'elaborazione in 10 ms, spesso è il SO (Linux) che "combatte" contro i nostri requisiti real time visto che a volte schedula processi che NON dovrebbe (togliere la CPU al processo Real Time per far girare la rotella sulla GUI non è proprio il massimo ).

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Il fatto che si chiamino webservice non significa che siano applicabili solo all'ambito web
Certo! Però la rete ci fregava proprio noi leggevamo dal sensore quando ormai l'evento era bello che finito gli mandavamo la risposta, ma non era più lì

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Qt nella versione widget a volte sono un po' legnose, ma un disastro proprio?
Usiamo la versione QML per me il fatto che non ci sia un designer decente e che si debbano fare rettangoli uno dentro l'altro per "simulare" il layout è già sufficiente
Poi è uno Widget Tool Kit incompleto per fare i bottoni con il bordo rotondo ce li siamo dovuti riscrivere completamente, mancano form (!), messagebox e persino i menu... boh!
Purtroppo è una scelta aziendale obbligatoria quindi continuiamo a subire finché - spero - non si rendano conto che è una c*gata!

Quote:
Originariamente inviato da tomminno Guarda i messaggi
Quindi ogni processo/thread avrà accesso alla memoria di tutti gli altri?
Di fatto sì poi visto che vogliamo essere compatibili con il vero C# (qualunque programma C# funzionerà su Cosmos) un "processo" potrà accedere solo alla sua memoria e a quella che il kernel gli concede di vedere per esempio quando deve leggere un file molti passaggi che un normale OS farebbe si saltano (zero copy I/O), Message Passing è un altro di questi casi (non c'è una vera "send()" il riferimento al messaggio è passato direttamente all'altro "processo").

La "protezione" all'accesso di memoria avviene tutto con C# perché Cosmos è un Managed Operating System

Come Singularity e Midori per l'appunto...
__________________
Cosmos C# Open Source Managed Operating System
Cosmos Thread Ufficiale
Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat!
fano è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2017, 09:20   #6
fano
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2095
Sto un po' giocando con MessagePack rispetto al C/C++ e le ridicole strutture (con il packing, l'endianess, ...) è proprio un altro mondo: creare oggetti e deserializzarli con 2 colpi di mouse non ha prezzo

Ce ne sono 2 librerie MessagePack per C#:
1. https://github.com/neuecc/MessagePack-CSharp
2. https://github.com/msgpack/msgpack-cli

la seconda è realizzata dall'ideatore originale del protocollo (lo stesso che ha fatto MessagePack per praticamente tutti gli altri linguaggi) ed è pure quella con più download, ma la sconsiglio ha ENORMI problemi di performance per serializzare un oggetto pure piuttosto semplice, mi è stato 1.250 secondi
Non ha nemmeno supporto visto che non risponde alle issues, l'altra è quindi meglio: a serializzare lo stesso oggetto ci sta 30 millisecondi!

Resta aperto il discorso che cosa uso per far comunicare sti processi?
__________________
Cosmos C# Open Source Managed Operating System
Cosmos Thread Ufficiale
Cosmos Official Site Vuoi collaborare allo sviluppo? Unisciti alla chat!

Ultima modifica di fano : 24-03-2017 alle 13:58.
fano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Coupon e promo Amazon su 3 super portati...
La Cina pronta a sfidare NVIDIA? Le GPU ...
Samsung, mega accordo da 16,5 miliardi p...
Le 18 offerte Amazon del weekend, senza ...
Galaxy S25 Ultra 512GB sotto i 1.000€ su...
Vi piace l'iPhone nero? Su Amazon sono s...
MacBook Air M4 16GB/256GB e 16GB/512GB s...
4 portatili per risparmiare tanto ed ess...
San Marino multa TikTok: non controllano...
Dreame e Roborock in saldo su Amazon: ro...
Pazzesco su Amazon: crollano i prezzi de...
La Corea del Sud vorrebbe costruire una ...
Rilasciati i primi risultati delle anali...
Robot umanoidi low cost? Unitree ci prov...
Non solo Rocket Lab, anche Avio potrebbe...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:31.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v