Che cos'è un "gruppo di attività"?

7

Ho cercato per molti siti Web una definizione di "gruppo di attività", ma la maggior parte delle descrizioni è molto vaga. Ovunque posso trovare una definizione precisa di questo?

Ulteriori dettagli.

  • Sono ammesse le dipendenze nel gruppo di attività?
  • Un'attività in esecuzione può scambiare dati con altre attività in esecuzione?
    • Per esprimere al contrario, le attività sono autorizzate ad accettare i dati solo prima di iniziare e sono autorizzati a pubblicare i risultati solo al termine dell'attività?
  • Cosa tiene traccia delle risorse temporanee (memoria, CPU ecc.) utilizzate dalle attività?
  • Come definire i pesi che incoraggeranno l'assegnazione efficiente delle attività?
    • Ad esempio, se un'attività deve passare molti dati all'attività successiva, può avere senso eseguire l'attività successiva immediatamente dopo la prima attività e il più vicino al primo thread / CPU / macchina / cluster ( località) possibile
  • Quali sono le attività che non sono note (non esistono) all'inizio, ma che sono state "create" in seguito?
posta rwong 08.11.2010 - 07:02
fonte

4 risposte

3

Qui ci sono alcuni problemi di terminologia, motivo per cui le tue ricerche su Internet non hanno ancora dato risposta.

Un pool è il nome assegnato a una raccolta di risorse "costose" e riutilizzabili quali thread, porte di completamento, connessioni al database. Il sistema operativo, la libreria o il framework gestiscono il numero di elementi nel pool in base ad alcune euristiche in base al carico corrente o alla disponibilità di risorse.

Le attività sono in genere unità di esecuzione, ad esempio una chiamata a procedura differita, una chiamata delegata o NSTask di Objective-C. Il caso più semplice è che ci sia una coda di questi in attesa di accadere creata dal codice che ha bisogno di cose fatte "in seguito", con priorità inferiore / superiore rispetto ad altre attività, in modo asincrono, simultaneamente, su un altro thread (es. Thread UI) o una combinazione di tutti questi. Alcuni framework consentono la costruzione di interdipendenze delle attività, così si finisce per prendere decisioni abbastanza complesse per determinare quale attività eseguire successivamente, ma tutto dipende dal framework / library / O / S.

Come già accennato, la libreria Task Parallel è un esempio di rottura di cose da eseguire. Un altro è NSOperationQueue su Mac OS X , che è stato sfruttato per ridurre notevolmente il numero di thread (costosi) richiesti per essere eseguiti in qualsiasi momento.

Per rispondere in modo specifico alle tue domande:

  1. Le dipendenze dipendono dal framework / libreria che si usa, ma è un concetto di prima classe.

  2. La proprietà dei dati è in genere disaccoppiata dal creatore dell'attività e passata all'attività stessa, poiché il thread / CPU effettivo su cui viene eseguito non è chiaro. Un compito che consegna i propri dati a un altro non è un problema particolare concettualmente, dipende dal quadro per i vincoli. Utilizza le dipendenze di esecuzione se un'attività richiede l'output di un'altra.

  3. Poiché l'attività possiede i dati, dovrebbe occuparsi della pulizia successiva. Chiaramente, se stai consegnando i dati a un'altra attività, hai bisogno del conteggio dei riferimenti o della garbage collection oltre a un criterio di proprietà dei dati.

  4. Alcuni framework permetteranno la messa a punto di quali attività eseguire, quanta CPU, a quale livello di pianificazione O / S, ecc. Se un'attività inizia a utilizzare tutta la memoria disponibile, è probabile che dovrai occupartene il tuo codice. Anche se non hai utilizzato una strategia del "pool di attività", sarebbe un problema.

  5. Le attività create in un secondo momento possono essere messe in coda nel pool di attività esistente per l'esecuzione.

risposta data 23.11.2010 - 19:52
fonte
3

Sono abbastanza sicuro che non troverai una risposta autoritaria, perché è un termine che potrebbe significare cose diverse in contesti diversi.

In termini di C # 4.0 e Task Parallel Library , un gruppo di attività è una raccolta di elementi di lavoro in sospeso che devono essere eseguiti.

Per semplificare la situazione (*), le attività vengono prese dal pool ed eseguite da vari thread worker in parallelo.

(*) Nell'implementazione effettiva, le attività non vengono prese dal pool una ad una poiché ciò comporta un sovraccarico eccessivo. Invece, sono presi in lotti e non necessariamente nell'ordine in cui sono stati aggiunti al pool.

    
risposta data 08.11.2010 - 07:16
fonte
1

Una risposta molto generica è che un gruppo di attività è molto simile a una coda di priorità.

A seconda dell'implementazione:

  • Potresti avere un numero infinito di abbonati
  • Le dipendenze possono essere risolte e ordinate in base alla priorità (ad esempio, un'attività a bassa priorità che dipende dalla stessa cosa che un'operazione ad alta priorità potrebbe essere elaborata prima di un'attività a media priorità)
  • Le attività possono essere alimentate da un pool di memoria statico o allocate in base a
  • Le attività possono essere annullate se viene aggiunto un compito con priorità più elevata e in genere possono anche essere fornite su base volontaria.

Una versione molto più semplice di un gruppo di attività può essere realizzata prendendo "priorità" dalla "coda di priorità", dove più o meno hai uno schedulatore FIFO che tiene traccia del tempo e delle risorse.

Penso che il termine sia un po 'troppo colloquiale per definire, chiaramente, al di fuori del contesto della piattaforma, del linguaggio e persino del compito a portata di mano - nessun gioco di parole.

    
risposta data 09.11.2010 - 07:40
fonte
0

In generale, direi che un pool di attività dovrebbe essere fatto in un modo che

  1. tutte le attività possono essere eseguite contemporaneamente, con risorse sufficienti (con sincronizzazione su risorse condivise quando necessario)
  2. tutte le attività possono essere eseguite in serie, in qualsiasi ordine arbitrario
  3. qualsiasi livello di concomitanza tra 1. e 2. è possibile
  4. tutti i possibili ordini e i livelli di concorrenza producono risultati validi (non necessariamente uguali)

Vista questa definizione,

Are dependencies allowed in task pool?

Troppo vago. Se intendi compiti che dipendono da altri compiti, direi di no. Un sistema con tali dipendenze è piuttosto una coda che un pool.

Can a running task exchange data with other running tasks?

Non dovrebbe. Non puoi fare affidamento su un'altra attività in esecuzione contemporaneamente.

To phrase conversely, are tasks permitted to accept data only prior to start and permitted to publish results only after the task has finished?

Non necessariamente. È possibile accedere successivamente ai dati immodificati (ad esempio, da un database immutabile). L'output può essere scritto in qualsiasi momento, a patto che nessun'altra attività dipenda da esso.

What keeps track of the temporary resources (memory, CPU etc) that are used by tasks?

Il quadro? Almeno, non i compiti.

How to define weights that will encourage efficient task assignment? For example, if one task needs to pass a lot of data to the next task, it may make sense to run the next task immediately following the first task, and as close to the first thread / CPU / machine / cluster (locality) as possible

IMO quando esiste una dipendenza di questo tipo, dovrebbe esserci un'attività che esegue entrambi, invece di due attività

What about tasks that are not known (do not exist) in the beginning, but were "created" later?

Le attività possono creare nuove attività. Questi possono essere eseguiti in qualsiasi momento dopo la creazione, eventualmente in concomitanza con l'attività che li ha creati.

    
risposta data 23.11.2010 - 19:17
fonte

Leggi altre domande sui tag