|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
[C/C++] problemi di determinismo
sto lavorando in ambiente windows xp e sapendo che tale sistema operativo possiede uno schedule ti tipo NON deterministico mi chiedevo come bypassare tale limitazione per avere almeno in parte dei tempi corretti.
Qualcuno che ha avuto esperienze di programmazione di questo tipo (real time) su sistemi non deterministici potrebbe illuminarmi? grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ciao.
Una cosa che ricordo e' che il problema non e' legato a Windows o altro sistema operativo. Non e' possibile creare un vero "real time" sulle nostre macchine a causa della natura del meccanismo degli interrupt del microprocessore. Poi ci si potra' accontentare, ma resta un real Time like, non vero.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Non l'ho mai provato, ma per quel poco che ne so c'e' la possibilita' di alzare la priorita' di un processo al livello real time. Non ho idea di QUANTO real time sia, ma penso che si possa trovare in rete qualche informazione.
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Prima di tutto, occorrerebbe sapere quale livello di determinismo ci si pone come obiettivo. Ma... sono sempre esistiti i sistemi operativi real time! I piu' famosi, per esempio, sono QNX o VxWorks, i quali ottengono un buon livello di prestazioni mediante schedulazione "run to completion" basata su priorita', con preemption. Ovviamente il time sharing e' proibito
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
le informazioni che ho a riguardo e che mi sono state riferite sono che windows dedica ogni tot dempo non determinabile, di 10 ms per riorganizzare memoria e/o altro, chiamiamoli usi interni. Per l'appilcativo che sto scrivendo io, siccome acquisisce segnali via ethernet, indagando mi hanno riferito gli stessi costruttori delle schede di cui acquisisco lo stato dei segnali che il ritardo esistente sulla ethernet da loro misurato è di 33 ms. Il mio problema è dare un valore di riferimento, un dato di targa al mio programma nel senso che io possa dire che tale software è in grado di campionare segnali in un intorno di x ms. Detto quanto sopra, ho scritto il programma usando thread e non rilevo affatto i ritardi che mi sonon stati riferiti, ma al massimo quelli che impongo io ai vari thread per non sollecitare troppo la CPU e lasciare spazio agli altri programmi. Ho campionato 1 milione di segnali con un ritardo massimo, misurato tra il thread che legge il segnale su ethernet e tra il thread che scrive, di 16 ms. Il thread che legge viene eseguito ogni 20 ms, quello che scrive ogni 50 ma il tempo che intercorre tra il momento in cui windows dedica tempo al thread che legge e il thread che scrive è quello che ho specificato cioè, 16 ms. In uno scenario del genere, che tempistiche dichiaro per il mio programma? |
|
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4739
|
Quote:
se si considerano sistemi general purpose (come windows, linux ecc) e si pensa alle finalità con cui sono nati (in funzione di quale tipo di workload e di quale modello progettuale per quanto riguarda le applicazioni) si nota che la priorità era sostanzialmente massimizzare il throughput del sistema in presenza di task batch ma massimizzare il throughput è per certi versi antitetico all' esigenza primaria in ambito realtime che è dato un evento, gestirlo (quindi saltare alla porzione di codice appropriata -e/o attivare il processo relativo- ed eseguirla) nel minor tempo possibile (nel caso del realtime hard, in un tempo deterministico o quantomeno superiormente limitato con il limite superiore certo e documentato), motivo per cui in ambito realtime sono diverse sia le politiche di scheduling sia le modalità con cui operano i progettisti di applicazioni questi ultimi spesso analizzeranno come prima cosa le richieste computazionali della/e loro applicazione/i per determinarne i vincoli temporali minimi (WCET - worst case execution times) e sceglieranno un sistema operativo realtime capace di garantire su quel certo hw latenze compatibili con quei vincoli di modo da assicurare la schedulabilità del sistema il sistema operativo RT dal canto suo sarà implementato in maniera tale per cui latenze di scheduling e di esecuzione delle system call saranno se non costanti (indipendenti dal numero di oggetti/processi/file/... ) quantomeno superiormente limitate, basato su un kernel preemptible (*) (che con buona probabilità sarà un microkernel **) e magari metterà a disposizione (in effetti imporrà) dei protocolli di resource reservation (***) - allora starà al progettista strutturare e calibrare il sistema e già a questo punto sarà chiaro che lo sviluppo di una sistema RT è un processo a priori e olistico ... *: rendere il kernel stesso tutto o quasi interrompibile (naturalmente tranne quelle parti che eseguono operazioni atomiche, ma queste possono essere contenute in sezioni di relativamente poche righe di codice invece di imporre la non interrompibilità dell' intero kernel o sottosistema) quindi reattivo a eventi come appunto interrupt e capace di notificare tali eventi a task userspace (oltre che di schedularli) è il passo più determinante verso la riduzione delle latenze, **: questo perchè il uK si presta meglio alla minimizzazione dei code path e al loro auditing - cosa per cui occorre che la code base sia il più compatta e gestibile possibile - non per presunte maggiori prestazioni che anzi su un microkernel sono tipicamente sacrificate dal fatto stesso di avere agenti server in processi separati (ma come si diceva prima, nel realtime contano affidabilità e latenze, più che throughput) ***: un' applicazione potrà essere accettata per l' esecuzione solo se le sue richieste in termini di risorse - tempo cpu e memoria - sommate al carico attuale non superano una soglia (iirc dipendente dall' algoritmo di scheduling, in certi casi intorno al 75-80%, al di sopra del quale la gestione non è più garantita) Quote:
sistemi come QNX e VXWorks esistono e girano sull' hw in circolazione, prevalentemente su piattaforma ARM (perchè più diffusa in ambito embedded) ma mi risulta anche X86 - e qnx e vxworks sono sistemi real time HARD (capaci -di loro- di assicurare il rispetto dei vincoli temporali in ambiti - avionica, automotive, controlo di centrali nucleari ecc - in cui superamento di una deadline implica fallimento del sistema) per cui tenderei a escludere sia un problema di interrupt, più un problema di concezione (ma anche finalità) dell' OS (e più precisamente del kernel) riprendendo il discorso di cui sopra, un kernel non concepito in funzione del realtime, quindi - con tempi di reazione a interrupt non noti costanti o non superiormente limitati (se non proprio capace di perdersi degli interrupt a causa della possibilità di stare eseguendo del codice non interrompibile, quindi con interrupt disabilitati, nel momento in cui si verifica un evento) - con tempi di esecuzione delle syscalls non noti costanti o non superiormente limitati dovuti a implementazione non O(k) delle syscall stesse - cosa che in apparenza non è un problema o lo è solo se gli interrupt restano disabilitati per tempi lunghi... in realtà si trascura che anche i processi RT come qualunque altro processo eseguono IO, ma trattandosi di processi RT la possibilità di completare tutte le proprie operazioni prima della deadline è cruciale per il successo o fallimento del sistema, quindi è fondamentale che anche le sytem call siano caratterizzate da tempi superiormente limitati può al più "cercare" di eseguire processi real time riducendo quanto possibile le latenze (ma su un kernel monolitico o ibrido è assai più complicato se non impossibile a causa delle dimensioni -di vari ordini di grandezza maggiori -della code base del kernel stesso) e aumentando la priorità (su windows e linux i processi RT vengono eseguiti prima dello stesso scheduler e di ogni altro processo, che in effetti rischia di andare in starving ) ma di più non può fare e non può comunque offire garanzie, trattandosi di un compromesso tecnologico realizzato con differenti priorità
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
Ultima modifica di jappilas : 25-07-2011 alle 13:59. |
||
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4739
|
Quote:
Quote:
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
|
||
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Perchè se non sbaglio per poter effettuare misurazioni precise di quantità molto piccole di tempo bisogna utilizzare gli "High Performance Counter" (timer ad alta precisione, altrimenti in Windows c'è una granularità di cira 15,qualcosa millisec, e il valore della tua misura mi suona appunto "sospetto"). Qui c'è una pagina, purtroppo di più non so dirti.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Nostri ovvero gli x86, ma anche la famiglia 680x0. E il problema era proprio dovuto a come sono gestiti interrupt.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 25-07-2011 alle 17:30. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
L'unico grosso problema per le macchine x86 attualmente sono gli SMI visto la cpu e il sistema neanche se ne accorgono, e quindi bisogna usare dei workaround per disabilitarli (con risultati variabili a seconda della scheda madre).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Cmq se siamo nell'ordine di una ventina di millisecondi, dovrebbe essere in grado ottenere prestazioni accettabili a patto di - Impostare la priorita' massima per il processo interessato - Spostare l'output su disco (o su rete) su un altro thread/processo - Evitare allocazioni di memoria durante il loop - Tenere basso il carico della macchina. Il problema piu' grosso e' probabilmente la lettura da rete, li' l'unica cosa pratica che mi viene in mente e' evitare al massimo altro traffico che non sia quello dell'applicazione, magari isolando il computer dalla LAN "generale". Potrebbe valer la pena di valutare una versione hard real time di windows (CE o XP Embedded) anche se non ho alcuna esperienza con queste... e comunque come dicevo le latenze in gioco non sono poi eccessivamente basse.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
se invece puoi optare per altro potresti considerare qnx o baremetal |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
Ho trovato anche questo esempio http://stackoverflow.com/questions/1...ormancecounter Ultima modifica di misterx : 25-07-2011 alle 18:29. |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
devo usare XP un quanto su tale sistema operativo girano già altri programmi e non è possibile cambiarlo pena la riscrittura completa degli altri programmi e sono troppi |
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Sep 2008
Messaggi: 237
|
forse con xp embedded qualcosa ci cavi, altrimenti potresti usare win CE che è piu' indicato.
Con l'XP normale il real time è irreale. Ma poi perche' non usi delle schede dedicate per l'acquisizione, con il loro sistema operativo ovviamente, e con l'XP ci analizzi solo i buffer? Io lavoro nell'automazione e di soluzioni ce ne sono a tonnellate, basta pagare... Per farti un esempio la National instruments ha sicuramente qualcosa su bus PXI o quello che è. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
Terminato questo progetto mi orienterò su windows xp embedded o windows CE o Linux. Già avere il tempo speso in modo preciso come mi ha suggerito banryu79 ho idea che mi porterà sulla strada giusta |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Commentato nientepopodimenoche da Alex Martelli, alla faccia!
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
Non ho capito se il numero di tick si basa sulla percentuale d'uso della CPU o altro ed anche se oltre questo metodo che ho già implementato grazie a te e ad Alex sia il più preciso possibile p.s. si direbbero variazioni di stato ALTO/BASSO del chip di clock Ultima modifica di misterx : 25-07-2011 alle 19:50. |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ripeto: non so molto, a parte quello che ho letto, perchè son questioni con cui non ho mai avuto a che fare direttamente (in Java uso System.nanoTime() e tutto quello che so è che la jvm in Windows è implementata appoggiandosi alle QueryPerformanceCounter/QueryPerfomanceFrequency API, se disponibili).
Cosa vadano a toccare le QPC API, a livello di hardware, non saprei.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
ok grazie, approfondisco io
ciao |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:18.



















