UML Diagrams of Multi-Threaded Applications

21

Per le applicazioni a thread singolo mi piace usare i diagrammi delle classi per avere una panoramica dell'architettura di quella applicazione. Questo tipo di diagramma, tuttavia, non è stato di grande aiuto quando si cerca di capire applicazioni pesantemente multi-thread / concomitanti, ad esempio perché istanze diverse di una classe "vivono" su thread diversi (il che significa che l'accesso a un'istanza è salvato solo da quella filo su cui vive). Di conseguenza, le associazioni tra classi non significano necessariamente che io possa chiamare metodi su quegli oggetti, ma invece devo fare quella chiamata sul thread dell'oggetto di destinazione.

La maggior parte della letteratura che ho trovato sull'argomento come Progettazione di applicazioni simultanee, distribuite e in tempo reale con UML di Hassan Gomaa aveva alcune buone idee, come disegnare i confini dei thread in diagrammi degli oggetti, ma nel complesso sembrava un po 'troppo accademico e prolisso per essere davvero utile.

Non voglio usare questi diagrammi come una vista di alto livello del dominio del problema, ma piuttosto come una descrizione dettagliata delle mie classi / oggetti, le loro interazioni e le limitazioni dovute ai limiti dei thread che ho menzionato sopra.

Vorrei quindi sapere:

  1. Quali tipi di diagrammi hai trovato più utili nella comprensione delle applicazioni multi-thread?
  2. Esistono estensioni al classico UML che tengono conto delle peculiarità delle applicazioni multi-thread, ad es. attraverso annotazioni che lo illustrano
    • alcuni oggetti potrebbero vivere in un determinato thread mentre altri non hanno affinità di thread;
    • alcuni campi di un oggetto possono essere letti da qualsiasi thread, ma scritti solo da uno;
    • alcuni metodi sono sincroni e restituiscono un risultato mentre altri sono asincroni che ottengono le richieste in coda e restituiscono risultati per esempio tramite una richiamata su un thread diverso.
posta PersonalNexus 21.11.2011 - 10:46
fonte

3 risposte

9

Le informazioni più importanti su come avvengono le esecuzioni dei thread possono essere rappresentate da ciò che è noto come diagramma di sequenza . Ecco un esempio di wikipedia

Questo diagramma disegna essenzialmente la lista di eventi insieme ad una direzione su una singola linea verticale spesso chiamata linea di vita . In questo caso, ogni thread è proprietario della propria linea di vita. Il diagramma consente la rappresentazione di tutti i tipi di eventi come sincrono, asincrono ecc.

L'altra cosa più importante in questi sistemi sono i diagrammi di stato o diagrammi di stato. Di solito, questo si applica solo se il modello è rappresentato come una macchina a stati. Tuttavia, nella maggior parte dei sistemi multi thread (dove i thread non sono banali) è meglio che siano progettati per funzionare con algoritmi isolati per stati diversi.

Ci sono altri tipi di diagrammi come diagramma di interazione e diagramma di comunicazione ma penso che provi a disegnare diagrammi di sequenza e diagrammi di stato metterà la massima chiarezza.

    
risposta data 22.11.2011 - 13:37
fonte
5

La mia risposta è complementare a Dipan in quanto implica diagrammi di sequenza UML. Ho trovato che uno stile che non sia UML puro al 100% è OK. Dai uno sguardo ai diagrammi utilizzati in Modelli di concorrenza . Alcuni sono quasi simili a UML (ma questo non è assolutamente standard):

Sehaifamiliaritàconl'attesa/notificanellasincronizzazionedeithreadJava,apprezzeraiilseguentediagrammadisequenzadaldocumentochehomenzionato:

    
risposta data 02.07.2013 - 23:46
fonte
0

Per le applicazioni multi-thread che utilizzano la stessa classe, il trucco potrebbe essere quello di trascinare e rilasciare la stessa classe in ogni modello che rappresenta un thread. Potresti avere la stessa classe con viste diverse e navigare nel modello e nel codice facendo clic sulla classe, sul diagramma o sul codice. So che il modello si fonde non è un concetto ben noto ma funziona davvero bene all'interno di Eclipse con Omondo.

Intendo dire che quando modifico una grande applicazione che è composta da più di un progetto. Creo un modello per ciascun progetto e quindi li unisco in un progetto più ampio. Tutta la modellazione viene eseguita utilizzando diagrammi di classe, che è il modello che ho ottenuto quando si inverte il progetto completo dal codice java a UML. Intendo dire che nel mio esempio io uso il codice esistente e lo inverto in un singolo modello UML e quindi unisco tutto questo codice inverso che ha creato modelli UML in un singolo modello di grandi dimensioni. Puoi anche creare più modelli piuttosto che invertire il codice esistente. Funziona in entrambi i modi: nella creazione senza codice o in fase di reverse engineering con codice esistente.

Non so se ha senso, ma potresti forse creare un modello grande, raggruppando i sub-modelli per ogni thread come quello che faccio con la modellazione di più progetti? Spero che questo aiuto.

    
risposta data 22.11.2011 - 11:02
fonte

Leggi altre domande sui tag