|
|
|
![]() |
|
Strumenti |
![]() |
#41 | ||
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
Quote:
![]() Quote:
![]() Si potrebbe cercare una via di mezzo, ovvero creare un threading model che preveda (anche come opzionale) delle indicazioni, nella struttura dei thread, circa le caratteristiche da tenere in considerazione nella loro schedulazione, come la tendenza a compiere frequenti accessi in memoria, oppure frequenti operazioni di i/o o lunghe operazioni sui dati caricati mediante prefetching, fino ai raggruppamenti migliori per sfruttare al meglio un certo tipo di sistema (ed eventualmente alla possibilità di richiedere l'esecuzione forzata su un solo core/cpu fisica/logica per ottenere un software adattativo al sistema e al tipo di licenza scelta dall'utente, non ricordo se parlavi tu o qualcun altro di una soluzione del genere al problema delle licenze per il multi core); in questo modo lo scheduler avrebbe una cognizione migliore e dell'applicazine singola, e del contesto generale, potendo gestire in maniera ottimale (o comunque meglio ottimizzata) l'allocazione delle risorse (le cpu in particolare) ai vari processi/thread. Imho, ovviamente ![]() |
||
![]() |
![]() |
![]() |
#42 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Su Windows e anche sugli ultimi Linux si può già assegnare un thread ad un determinato processore...e non solo...in XP a 64 bit ci sono sia le API per identificare i processori logici (HT) e che il supporto all'architettura NUMA per calcolarsi la composizione dei vari nodi...
Ultima modifica di cionci : 14-04-2005 alle 23:53. |
![]() |
![]() |
![]() |
#43 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#44 | |||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Comunque adesso è chiaro, e sono perfettamente d'accordo. ![]() Quote:
Quote:
![]() Quote:
![]() Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||||
![]() |
![]() |
![]() |
#45 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#46 | |||
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
Quote:
Quote:
Io pensavo alla possibilità che fossero i thread a fornire al s.o. informazioni "dinamiche" sulla loro esecuzione, dicendo "su questo sistema, con queste risorse, prevedo di eseguire un tot di operazioni sui dati precaricati nella cache, un tot di accessi alla memoria e un tot di operazioni di input output, e preferirei lavorare con questi thread in esecuzione sullo stesso processore multicore e questi altri nella stessa coda di esecuzione", in modo che il sistema operativo cerchi di rispettare per quanto possibile la gestione prevista dall'applicazione, ripristinandola appena possibile, e avendo contemporaneamente a disposizione delle informazioni per calcolare il giusto "mix" di processi da allocare sulla stessa cpu multicore, presi anche da altre applicazioni. Quote:
Credo che un algoritmo del genere, ben implementato, potrebbe essere più semplice e meno oneroso di quanto io non sia riuscito a descrivere ![]() ![]() Ultima modifica di xeal : 16-04-2005 alle 23:38. |
|||
![]() |
![]() |
![]() |
#47 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
ARGH! Ma dove lo trovi il tempo per scrivere questi mallopponi?
![]() Le considerazioni sono ottime, non c'è che dire, ma a mio avviso bisogna puntare l'attenzione sullo scheduler, che è l'elemento su cui alla fine ruota tutta la discussione. Questo "programma" del s.o. è molto delicato, viene richiamato parecchie volte al secondo (100 volte al secondo su molti s.o.), per cui dev'essere eseguito quanto più velocemente possibile. Infatti sullo scheduler e gli algoritmi di selezione / assegnazione dei task da eseguire c'è parecchia letteratura, ma la tendenza dal punto di vista implementativo è sempre quella perdere il minor tempo possibile; Linux, se non ricordo male, ha motivo di vanto nel suo algoritmo di scheduling che impiega un tempo "costante" (O(1)) per la selezione del task da eseguire. Un algoritmo che permetta di bilanciare il carico del sistema in base all'attuale situazione in cui versa E alle caratteristiche intrinseche del software sarebbe decisamente troppo pesante, IMHO. Inoltre l'impiego di matrici per memorizzare lo stato e la "relazione" fra i vari thread non è dispendioso in termini di memoria occupata (qualche MB, al più: poca roba rispetto alla quantità di memoria presente anche in PC abbastanza vecchi), ma lo è sicuramente per le operazioni che riguardano questa struttura (inserimento, cancellazione, "spostamento" / aggiornamento dei dati, ecc.). Per questo motivo pensavo che sarebbe meglio delegare all'applicazione e non allo scheduler il compito di smistare i thread in base al carico attuale del sistema e alle esigenze intrinseche della stessa. Se ci pensiamo bene, il fatto che un programma abbia particolari esigenze rispetto a tutti gli altri, è proprio affar suo: normalmente le politiche di gestione di task vanno più che bene, e finora lo hanno dimostrato. E' chiaro che la situazione ideale / migliore in assoluto non esiste. Come programmatori quello su cui puntiamo prevalentemente l'attenzione è il caso medio, senza ovviamente trascurare il caso peggiore e il caso migliore: peggiorare il caso medio per migliorare il caso peggiore può andare bene se oggettivamente l'applicazione da far girare è "vitale", ossia quella che deve in assoluto girare meglio anche a spesa di tutte le altre, ma ciò non è sempre vero, anzi. Chiaramente il tutto sempre IMHO... ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#48 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#49 | |||||
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
Quote:
![]() ![]() Quote:
Quote:
![]() Comunque forse non sono riuscito a esprimere bene quello che avevo in mente (mi stupirei del contrario, visto che mentre scrivevo cercavo di chiarirmi le idee ![]() ![]() ![]() Per non complicare troppo il lavoro dello scheduler pensavo a dei parametri interi da sommare e mediare (una media "pesata" degli scarti: sommo tutti i valori di un parametro in tutti i thread che raggruppo e sottraggo il valore "ideale", ripeto per gli altri e calcolo la media confrontandola con un altro valore "ideale", sempre precalcolato per un dato sistema/cpu multicore), trattandosi di somme (in alternativa si potrebbe pensare a qualche operazione logica su maschere di bit) non dovrebbero richiedere un tempo troppo grande (la divisione finale si potrebbe sostituire con uno shift - i risultati finali dovrebbero sempre essere positivi - scegliendo un numero pari di parametri), soprattutto considerando il tempo poi necessario per caricare i dati nella cache (ove necessario, per dei thread magari c'è meno lavoro da fare in questo senso). La complessità dovrebbe riguardare quindi più il numero di thread da esaminare e le combinazioni da valutare, ma a questo si può ovviare (credo) in qualche modo: innanzitutto, presumo che l'applicazione crei i thread e soprattutto i gruppi di thread con parametri ben bilanciati (inizialmente non ne modifico né composizione, né la destinazione, se non strettamente necessario per bilanciare il carico tra le varie cpu; tutt'al più si potrebbe valutare, progettando l'algoritmo, se non valga la pena di riordinare il gruppo destinato a una cpu multicore per far sì che i thread per i quali si prevede la possibilità che sospendano il lavoro "prima del tempo" finiscano nelle stesse code, ma non credo sia strettamente necessario farlo): se il gruppo (che chiamavo macrothread) è ben bilanciato mi aspetto che pochi thread, tra quelli destinati ai core di una stessa cpu (macrocpu), restino in attesa per un'operazione di input/output o per un semaforo sui dati, gli altri completerebbero il quanto contemporaneamente e verrebbero sostituiti (essendo la maggioranza) direttamente dai successori (un nuovo gruppo ben bilanciato: mi serve trovare il sostituto solo dell'unico/dei pochi thread che hanno "smesso" di lavorare prima degli altri; mi sorge un dubbio: in genere che si fa in questi casi? ciascun core/cpu ha un proprio timer per i processi? e per cpu multicore? e per core logici? l'esecuzione attualmente diventerebbe "asincrona" o si sostituirebbe il processo in stato di attesa in modo da risincronizzarsi con gli altri time slice paralleli? comunque sia, per il momento suppongo che si continui in maniera asincrona). Supponiamo che l'esecuzione diventi asincrona (cioè risultino non contemporanei gli interventi dello scheduler sulle varie code) per un solo core (alla volta): il problema di trovare il raggruppamento migliore si ridurrebbe (considerando la "disottimizzazione" rispetto al calcolo su tutto il gruppo trascurabile, essendo gli altri thread ben accoppiati) a cercare il miglior sostituto nel gruppo ancora in esecuzione (ovvero il primo che si avvicina al valore ideale -> first fit), e la ricerca si potrebbe condurre su un numero limitato di processi successivi (considerando la lista come circolare), diciamo 4-5 (indicativamente, si dovrebbe valutare il numero in maniera opportuna, progettando l'algoritmo), sia per ridurre i calcoli, sia per evitare starvation - a tal fine i processi in coda avrebbero, tra i parametri caratterizzanti, un numero incrementato e decrementato opportunamente ogni volta che venissero "promossi" (scavalcando gli altri) o "retrocessi" (scavalcati a loro volta): quando si raggiunge il numero massimo previsto il processo non può più essere scavalcato, se non ce n'è uno migliore prima tocca a lui - si potrebbe anche valutare l'opportunità di spendere qualche nanosecondo per verificare quanto tempo manca al termine del time slice "generale" (sempre che, a lungo andare, ne rimanga uno), per decidere se cercare il sostituto nel gruppo attuale (manca molto tempo -> il processo sostituto lavorerà per la maggior parte del suo quanto insieme al gruppo in esecuzione), oppure richiamare direttamente il thread/processo successivo (quasi non c'è asincronia, per cui lavorerà quasi per tutto il quanto insieme ai suoi "fratelli" predestinati); è possibile che si finisca comunque per scegliere il processo successivo, dipenderebbe dalla soglia scelta per considerare accettabile la media degli scarti dalla combinazione migliore e da quanto ben bilanciato era, nel complesso, il gruppo in cui si è verificata l'asincronia. In questo modo, se i processi che determinano l'asincronia si trovano tutti nella stessa coda (o nelle stesse code), il degrado dovuto alla scelta del successore migliore (che potrebbe anche essere trascurabile) riguarderebbe solo uno/pochi core, e risulterebbe poco rilevante per il sistema nel suo complesso; diversamente, a lungo andare si potrebbe generare un'asincronia generale, per cui l'algoritmo di ricerca del successore sarebbe applicato in ogni context switch, ma, anche in questo caso, potrebbe risultare poco oneroso ed essere eseguito senza troppe preoccupazioni, oppure si potrebbe pensare di risincronizzare tutto in qualche modo, ad esempio sospendendo l'esecuzione dei processi (o semplicemente lasciando che terminino il proprio quanto senza sostituirli per alcuni istanti) e approfittando dell'interruzione per riordinare tutte le code cercando i raggruppamenti migliori (ma si potrebbe decidere di non "sprecare" tempo né per i riordini, né per risincronizzare l'esecuzione dei gruppi, o di effettuare il riordino in altro modo). Questo calcolo sarebbe sicuramente oneroso, ma, nel caso in cui lo si ritenesse utile/necessario (considero il riordino globale un punto la cui opportunità si può sicuramente sindacare, come tutto il resto, naturalmente) potrebbe essere schedulato a intervalli sufficientemente lunghi da non incidere troppo: ad esempio (sparo dei numeri a caso) se per riordinare tutto (parlo della singola cpu multicore) occorresse 1 secondo e il riordino venisse operato ogni 10 secondi, inciderebbe per 1 ms in più ad ogni intervento dello scheduler (nell'ipotesi di 100 interventi al secondo), anzi, ancora meno, in proporzione al numero di core presenti sulla cpu oggetto del riordino (a meno che le altre non restino inoperose nel frattempo, cosa probabile o necessaria, temo); la durata del riordino (quindi il suo peso) risulterebbe minore se poi l'algoritmo adottato (per determinare le combinazioni possibili e calcolare il grado di bilanciamento - con la media di prima - per ciascun raggruppamento) risultasse parallelizzabile e/o venisse eseguito sfruttando qualche stato di idle dei core (ma si potrebbe decidere di non riordinare affatto le intere code). Quote:
![]() In realtà pensavo ad una visione logica, virtuale delle code (implementate mediante liste o qualunque cosa si ritenesse opportuna - qui mi viene in mente ai discorsi che faceva fek tempo fa sull'opportunità di usare dei vettori per velocizzare un eventuale riordino dei processi; in ogni caso, non mi pongo il problema di scegliere una certa struttura dati, e soprattutto non voglio modificare le scelte attuali, mi basta partire da una visione logica "a matrice"), al fine di bilanciare opportunamente (in modo in fondo del tutto simile a quanto fatto oggi, credo) il carico di lavoro tra i core di una stessa cpu e le migrazioni da una (macro)cpu all'altra: considero le code di processi di una cpu multicore come le colonne di una matrice, cercando di mantenerle per quanto possibile della stessa "lunghezza", se possibile pari alla lunghezza delle code sugli altri processori (multicore o single core), per far sì che tutti i core lavorino. Mi spiego meglio (anche perchè così sembra che io stia scoprendo l'uovo di Colombo... e in parte è così ![]() Sostanzialmente, ad ogni suo intervento lo scheduler "ragionerebbe" per gruppi di esecuzione parallela, in "orizzontale", oltre che in "verticale" per gestire ciascuna coda, pur cercando di non impiegare troppo tempo per farlo. Quote:
![]() [quoe]E' chiaro che la situazione ideale / migliore in assoluto non esiste. Come programmatori quello su cui puntiamo prevalentemente l'attenzione è il caso medio, senza ovviamente trascurare il caso peggiore e il caso migliore: peggiorare il caso medio per migliorare il caso peggiore può andare bene se oggettivamente l'applicazione da far girare è "vitale", ossia quella che deve in assoluto girare meglio anche a spesa di tutte le altre, ma ciò non è sempre vero, anzi.[/quote] Vero, però se con qualche microsecondo in più di calcoli dello scheduler ad ogni intervento si riuscisse in qualche modo a ottimizzare lo sfruttamento di una cpu multicore non sarebbe male. Poi, ripeto, la mia era solo un'idea, magari interessante e da valutare, magari no. Ecco: ho scritto un altro malloppone, non sono riuscito a contenerlo... Comunque mi sembra che manchi qualcosa... Ah, già: IMHO ![]() (ma non erano vietati dal regolamento i vari imo, condo, erzo... ![]() Ultima modifica di xeal : 19-04-2005 alle 01:19. |
|||||
![]() |
![]() |
![]() |
#50 | |
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
Quote:
![]() ![]() ![]() ![]() Scherzi a parte, se sto scoprendo l'acqua calda ditemelo, così evito di spremermi le meningi... ![]() Bye. |
|
![]() |
![]() |
![]() |
#51 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Intendevo "pool di processori" per un dato thread...
Guarda l'API SetThreadAffinityMask (mi sembra)... Come ti dicevo...questa strategia (anzi, qualsiasi strategia) è già applicabile dal lato utente in Win XP 64 e Win Server 2003... E' già possibile identificare la composizione georafica della struttura NUMA...e di conseguenza sapere quali core stanno sulla stessa CPU... Se questi SO usano particolari strategie di scheduling non lo so...ma suppongo che mettendo a disposizione quelle API il kernel stesso si crei una struttura statica che contiene lo schema fisico... Per verificare non resta che fare delle prove ![]() Ultima modifica di cionci : 19-04-2005 alle 08:14. |
![]() |
![]() |
![]() |
#52 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Come avevo già scritto, anche cercando di limitare al minimo il numero di thread da esaminare, si perderebbe comunque troppo tempo: impossibile pensare anche soltanto di avvicinarsi a un O(1) dello scheduler di Linux, ad esempio.
Peggio ancora pensando di utilizzare un qualche algoritmo di ordinamento (a meno di non fare delle assunzioni e utilizzare altri algoritmo di ordinamento non basati sulla selezione, ma che comunque richiedono un tempo lineare per essere eseguiti). Utilizzare delle liste anziché delle matrici comporterebbe non pochi problemi (attualmente Linux utilizza un vettore per memorizzare gli ID dei processi, di dimensione fissa), e aumenterebbe il tempo di esecuzione nel caso si volesse utilizzare un algoritmo di ordinamento. Quanto al timer, nel sistema ce n'è soltanto uno che viene usato per segnalare il context-switch, e viene assegnato / usato da un solo processore, che fa da "master"... A mio avviso l'idea di spostare la complessità dell'algoritmo dallo scheduler all'applicazione "particolare" consente di risolvere il problema, non pesando assolutamente sullo scheduler, e quindi su tutto il sistema: è una cosa non da poco. Basti pensare al numero di processi / thread che girano su un sistema moderno: sono davvero tanti, e praticamente nessuno ha esigenze particolari. Se lo scheduler dovesse pensare a risolvere il problema del bilanciamento, per quanto bene fosse implementato l'algoritmo, "peserebbe" comunque su tutti i processi / thread, anche quando non sarebbe assolutamente necessario (che il caso più frequente).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#53 | |||
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
x cionci: si, la funzione è quella, ho dato un'occhiata sul sito msdn
![]() Oltre a pool di processori si possono creare pool di thread, ma non ho ben capito a cosa serva: sembrerebbe simile alla strategia master-worker o ad agenda (o meglio, la base per tali architetture) o forse serve a notificare più rapidamente (mediante dei thread che fanno da monitor) la possibilità di uscire dallo stato di wait a dei thread che si contendono delle risorse, un po' come succede chiamando notifyAll() in Java, ma non ho capito bene (anche perchè non ho approfondito le api per la sincronizzazione)... Credo comunque che potrebbe essere interessante avere qualche "grado di libertà" in più potendo indicare quali e quanti thread si vorrebbero far eseguire in parallelo (ragionando, come dicevo, in "orizzontale") senza doverli vincolare a un certo processore (per non "interferire" con il bilanciamento del carico fatto dal processore, poi, magari, le api ci sono e non le ho notate io ![]() x cidimauro: come già detto, era solo un'idea, che mi sembra sempre meno fattibile, perchè a prescindere dal tempo d'esecuzione dello scheduler, sarebbe un caso limite l'avere a disposizione il "giusto" numero di thread con certe caratteristiche (non troppi che accedono spesso in memoria, non troppi che eseguono I/O, non troppi che devono sospendere l'esecuzione prima del context switch successivo...) da assegnare a un certo processore multicore. Comunque, speravo che effettuare qualche somma e una divisione, da ripetere al più un numero limitato di volte (e fisso, non variabile con il numero totale di thread) non comportasse un overhead significativo. Per l'ordinamento, pensavo di ottenere un risultato accettabile spalmando il tempo d'esecuzione su un numero sufficientemente grande di context switch (ovvero, eseguendolo una volta ogni n context switch). Non butterei via la possibilità di spostare i thread a blocchi, ovvero poter decidere quali evitare (se possibile) di schedulare sullo stesso processore, senza doverli vincolare a cpu specifiche, se non strettamente necessario. Quote:
![]() Quote:
![]() Quote:
Ciao ![]() |
|||
![]() |
![]() |
![]() |
#54 | |||||||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
1) farlo ogni n context switch comporterebbe un tempo di calcolo (ammortizzato) comunque troppo elevato (O(log2(n))); 2) farlo ogni n log2 n context switch comporterebbe un tempo di calcolo (ammortizzato) interessante (O(1)). Per fare un esempio, supponendo di avere n = 1000 processi & thread e che il context switch avvenga 100 volte al secondo, l'operazione verrebbe effettuata: 1) ogni 10 secondi circa (ma al prezzo di O(10) per ogni context switch); 2) ogni 100 secondi circa (al prezzo di O(1) per ogni context switch). Nel primo caso, l'aggiornamento ogni 10 secondi potrebbe essere un buon compromesso, ma il prezzo da pagare sarebbe abbastanza salato in termini computazionali. Nel secondo caso computazionalmente saremmo davanti al caso migliore, ma in 100 secondi le condizioni del sistema potrebbero essere cambiate troppe (anche in 10 secondi, ma "reagirebbe" più velocemente). Quote:
Quote:
![]() ![]() Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys Ultima modifica di cdimauro : 22-04-2005 alle 09:40. |
|||||||
![]() |
![]() |
![]() |
#55 | ||||||
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
Quote:
In pratica pensavo di stabilire a priori per un certo processore multicore quante richieste di accesso alla memoria "contemporanee" si potrebbero gestire per non ridurre troppo la banda verso la ram, quante operazioni di i/o, ecc. in relazione al tipo di bus (con o senza memory controller integrato, con o senza hyper transport), al tipo di comunicazione interna tra i core e alla presenza o meno di feature come hyper threading in ogni processore, per poter individuare un certo numero di parametri (non troppi) di cui tener conto e da misurare su una certa scala (la più piccola possibile) di valori interi (ad esempio: da 0 a X per il numero di accessi in memoria previsti su dati non presenti in cache, da 0 a X per determinare la tendenza a lavorare sui dati precaricati nella cache, da 0 a X per quantificare la necessità di fare più o meno spesso operazioni di I/O, dei parametri per determinare se i processi hanno necessità di comunicare mentre sono in esecuzione contemporanea o se devono contendere delle risorse per cui è meglio eseguirli sequenzialmente...): fatto questo, "basterebbe" (lo so, la "faccio facile" ![]() In questo modo si potrebbe rendere possibile una visione dei thread per gruppi da eseguire in parallelo (mi sono un po' fissato con il termine macrothread ![]() Quote:
Quote:
Quote:
![]() Quote:
Quote:
In ogni caso, si potrebbe valutare la possibilità di far rientrare il processo, una volta tornato pronto per l'esecuzione, esattamente nel punto da cui era uscito dalla coda, ovvero fargli perdere, una volta terminata l'attesa, un "turno" intero, nel trattare i thread per gruppi d'esecuzione parallela potrebbe avere senso al fine di sfruttare i vantaggi che lo sviluppatore dell'applicazione di cui il thread fa parte avesse individuato nel far eseguire contemporaneamente proprio quei thread (sempre che gli altri non abbiano nel frattempo portato a termine la propria esecuzione); si potrebbe anche dare all'applicazione facoltà di scegliere se e per quali gruppi di thread seguire questa politica e per quali un'altra. Naturalmente bisognerebbe valutarne bene l'opportunità (non ho riflettuto su tutte le possibili implicazioni/conseguenze/controindicazioni, è solo un'idea che butto giù così ). Nell'ipotesi di implementare l'algoritmo di scheduling con il quale ho rotto finora ( ![]() Ciao ![]() Ultima modifica di xeal : 25-04-2005 alle 22:22. |
||||||
![]() |
![]() |
![]() |
#56 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Nonostante tutti i casi che hai prospettato, trovo che ci siano sempre troppe variabili da tenere in considerazione per determinare il miglior bilanciamento dei thread per le varie CPU disponibili. Per me più variabili -> aumento della complessità della "scelta", con tutte le conseguenze che ciò si porta dietro per un compito delicato qual è lo scheduling.
![]() Il tempo non sfruttato viene semplicemente assegnato a un altro thread, fino al verificarsi della successiva condizione che porti a un context switch. Non credo che sia semplice né gestibile il fatto di far rientrare il processo/thread esattamente nella stessa posizione della coda da cui era stato rimosso: le condizioni cambiano troppo velocemente e ciò richiederebbe l'aggiunta di ulteriori controlli che complicherebbero (nuovamente! ![]() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#57 | ||
Senior Member
Iscritto dal: Jun 2003
Città: vivo in Sicilia (tra la prov. di AG e Palermo)
Messaggi: 956
|
Quote:
Quote:
![]() Bye. |
||
![]() |
![]() |
![]() |
#58 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:57.