Newsgroup: it.comp.java
Titolo: Sleep a basso livello

Salve, scusate la domanda banale, ma avrei bisogno di capire bene come 
funziona la sleep().
Ovvero, il tempo di "attesa" che richiedo e' un tempo di processo o di 
sistema? intendo dire, se io chiedo una sleep di 4 secondi, poi il processo 
viene sospeso dal s.o. e rischedulato dopo un minuto, il thread che ha fatto 
la sleep vede che effettivamente e' passato un minuto o per lui sono passati 
solo (milli)secondi?
Nel caso peggiore, dovrei trovare il modo di mettere degli hook (tipo gli 
interval timer) a livello hw nel s.o. e non so come potrei farlo in java 
(jni?)
 
Grazie
CarMas 
 

 (jni?)
 
no, non ho capito dove vuoi arrivare.
prova a spiegare il problema a monte che stai affrontando, poi si
discute della soluzione.
 

 funziona la sleep().
 
Come chiarito qui:
 
http://tinyurl.com/37z3vtx
 
 
la precisione di sleep dipende da cosa offre il sottostante S.O., per 
esempio su windows quel che c'è sotto è questo:
 
http://tinyurl.com/5w7ucnq
 
 
Quello su cui puoi fare solitamente affidamento è che se chiedi la 
sospensione per 50 millisecondi il thread sarà sospeso per *almeno* 50 
millisecondi. Dopodiché il thread verrà risvegliato coi tempi e modi di 
cui il S.O. abbisogna.
 
-- 
r--r--r--
 

 discute della soluzione.
 
Sě scusa, la domanda prima era abbastanza confusa.
Supponi che io voglia realizzare una sorta di "scheduler" di task (che
possono essere qualsiasi operazione, sia di alto che di basso livello). So
che il prossimo deve partire al tempo T, quindi con riferimento all'instante
corrente faccio una banale sleep del delta. Ora, mi aspetterei di essere
svegliato dopo quel tempo, ma non ne ho la garanzia assoluta, ovvero come mi
hanno fatto notare: il thread diventa unrunnable per il tempo di sleep e poi
ritorna runnable, ma non č detto che il s.o. lo faccia partire
immediatamente.
Dato che alcuni di questi task sono abbastanza critici (interfacciamento con
dispositivi hw) nel mio caso č essenziale che dopo il tempo stabilito la mia
operazione venga eseguita senza "indugi". Per fare questo, quindi, affidarsi
a cuor leggero al meccanismo della sleep di Java forse non č l'approccio
corretto e dovrei cercare soluzioni piů radicate nel sistema.
O sto sbagliando qualcosa?
 
Grazie
CarMas 
 

 abbisogna.
 
Ecco e' questo quello che io vorrei in qualche modo bypassare.
Come posso essere sicuro al 100% che trascorso il tempo di sleep, caschi il
mondo, il mio thread riparta?
 
Grazie
CarMas 
 

 mondo, il mio thread riparta?
 
Umh... bypassare il sistema operativo si ottiene scrivendosene uno 
proprio! :-) ...o anche usandone uno più specifico per il proprio scopo, 
se c'è già.
 
Ma... tanto per capire: di che precisione hai bisogno? Hai parlato di 4 
secondi di attesa, fossero 4 secondi e qualche microsecondo che problema 
c'è? La ripresa del thread - inteso che è il SO che ha sempre l'ultima 
parola - non è una cosa che richiede chissà quali tempistiche, 
sicuramente non qualcosa di tangibile da un essere umano, in condizioni 
normali - e con unità di tempo di secondi! puoi considerarla istantanea. 
E se la macchina è così carica da diventare un tempo misurabile 
dall'utente vuol dire che il tuo specifico programma non è l'unico ad 
avere problemi.
 
Inoltre: anche se fosse preciso al microsecondo... non hai modo di 
valutare il tempo di esecuzione del tuo codice, in concorrenza con tutti 
gli altri processi e thread che girano sulla stessa macchina (il cui 
hardware è tra l'altro ignoto a priori): un'occhiata al mio task manager 
mi dice che in questo momento ho 82 processi (e chissà quanti thread) - 
di cui solo 6 sono applicazioni utente, la maggior parte sono servizi di 
sistema e alcuni di essi sicuramente hanno priorità su tutto e tutti. 
Quindi in ogni caso non puoi mai essere sicuro che che una determinata 
operazione si svolga in un determinato momento...
 
Se davvero hai bisogno di temporizzazioni estremamente precise l'unica 
strada è quella di hardware specializzato con software altrettanto 
specializzato. Con un normale pc (con processori multicore che decidono 
in modo autonomo cosa va eseguito e in che ordine) e millemila strati di 
software (il sistema operativo col suo stack di kernel, driver e altro, 
jvm, ecc...) e il fatto che sei in un ambiente multitasking non puoi 
avere questo genere di certezze!
 
 
-- 
r--r--r--

 mondo, il mio thread riparta?
 
Con un sistema operativo real time?

,

Forse dico l'ovvio, ma esistono anche JVM real time (credo perché non
le ho mai usate, vadano eseguite esclusivamente su OS real time),
nonché librerie varie che implemententano funzioni del linguaggio in
modo real time (e in generale in modo veloce)
mi viene in mente 
http://javolution.org/
 
 
Cmq, concordo con i poster del thread, tutto dipende dalla precisione
che ti aspetti. IMHO se hai un computer dedicato all'uopo (in cui puoi
spegnere TUTTI i servizi non vitali), non ci dovrebbero essere
problemi a meno che tu non abbia bisogno di temporizzazioni al
microsecondo.
 
Secondo me se descrivi meglio quello che devi fare un modo migliore lo
trovi. Ad es, io ho avuto un problema simile prendendo dati da
sensori. Il campionamento era quotidiano, e ottenevo il consumo in
watt dell'apparecchio.Il giorno del cambio dell'ora legale però era un
problema. Ufficialmente un giorno all'anno dura 25 ore, e un altro ne
dura 23. I valori di consumo di quei giorni ovviamente è falsato, a
meno di non spostare il momento del campionamento, la qual cosa però
per il committente era inaccettabile. Morale, abbiamo risolto
ponderando il dato, ovvero moltiplicando per 24/25 per il giorno lungo
e per 23/25 per quello corto. Non è che magari qualche 'trucco' simile
può essere altrettanto efficace?

 O sto sbagliando qualcosa?
 
no, non stai sbagliando.
la strada che dovresti seguire imho è quella di crearti un sistema
realtime, non ho esperienza diretta ma a quanto vedo su ubuntu linux
non è una cosa trascendentale. dopodiché usare java rts o altre jvm
rt.
googlando un po' a giro mi pare di vedere che ci sono diversi how-to.