Come convertire manualmente i jiffies in millisecondi e viceversa in Linux? So che il kernel 2.6 ha una funzione per questo, ma sto lavorando su 2.4 (compiti a casa) e sebbene abbia guardato il codice usa molte costanti macro che non ho idea se siano definite in 2.4.Conversione di jiffies in milli secondi
risposta
Come una risposta precedente ha detto, la velocità con cui incrementi jiffies
è fissa.
Il modo standard di specificare il tempo per una funzione che accetta jiffies
utilizza la costante HZ
.
Questa è l'abbreviazione di Hertz o il numero di tick al secondo. Su un sistema con un tick del timer impostato su 1ms, HZ = 1000. Alcune distribuzioni o architetture possono usare un altro numero (100 usato per essere comune).
Il metodo standard di specificare un conteggio jiffies
per una funzione sta usando HZ
, in questo modo:
schedule_timeout(HZ/10); /* Timeout after 1/10 second */
Nei casi più semplici, questo funziona bene.
2*HZ /* 2 seconds in jiffies */
HZ /* 1 second in jiffies */
foo * HZ /* foo seconds in jiffies */
HZ/10 /* 100 milliseconds in jiffies */
HZ/100 /* 10 milliseconds in jiffies */
bar*HZ/1000 /* bar milliseconds in jiffies */
Questi ultimi due hanno un po 'un problema, tuttavia, come in un sistema con un timer tick 10 ms, HZ/100
è 1, e la precisione inizia a soffrire. È possibile che si verifichi un ritardo compreso tra 0,0001 e 1,999 tick (0-2 ms, in sostanza). Se hai provato a usare HZ/200
su un sistema di tick da 10 ms, la divisione in interi ti dà 0 jiffies!
Quindi la regola generale è, state molto attenti a usare HZ per valori piccoli (quelli che si avvicinano a 1 jiffie).
Per convertire l'altro modo, si usa:
jiffies/HZ /* jiffies to seconds */
jiffies * 1000/HZ /* jiffies to milliseconds */
Non si deve aspettare nulla di meglio di precisione micrometrica.
È possibile ottenere il valore HZ utilizzando CLI? Per esempio. dopo aver letto utime da/proc/[pid]/stat sul kernel 2.6, posso convertirlo facilmente in secondi senza doverlo compilare dal codice C? –
Se stai interagendo con HZ dallo spazio utente, usa invece USER_HZ. 'man 7 time' dice di usare sysconf (_SC_CLK_TCK) per recuperare questo valore. –
Non vedo un modo ovvio di farlo da uno script di shell, ma è generalmente una costante a meno che non si stiano facendo cose innaturali al proprio kernel. Su x86 USER_HZ è 100. –
I jiffies sono codificati in Linux 2.4. Controllare la definizione di HZ
, che è definita nell'architettura specifica param.h
. Spesso è 100 Hz, ovvero un tick ogni (1 secondo/100 tick * 1000 ms/sec) 10 ms.
Ciò vale per i386 e HZ è definito in include/asm-i386/param.h
.
Ci sono funzioni in include/linux/time.h
chiamati timespec_to_jiffies
e jiffies_to_timespec
dove è possibile convertire avanti e indietro tra un struct timespec
e jiffies
:
#define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
static __inline__ unsigned long
timespec_to_jiffies(struct timespec *value)
{
unsigned long sec = value->tv_sec;
long nsec = value->tv_nsec;
if (sec >= (MAX_JIFFY_OFFSET/HZ))
return MAX_JIFFY_OFFSET;
nsec += 1000000000L/HZ - 1;
nsec /= 1000000000L/HZ;
return HZ * sec + nsec;
}
static __inline__ void
jiffies_to_timespec(unsigned long jiffies, struct timespec *value)
{
value->tv_nsec = (jiffies % HZ) * (1000000000L/HZ);
value->tv_sec = jiffies/HZ;
}
Nota: Ho controllato queste informazioni nella versione 2.4.22.
^per ricordarci di jiffies hard-coded. – PypeBros
Answer to #3875801 possono essere anche Revelant
Ho trovato questo codice di esempio su kernelnewbies. Assicurati di collegarti con -lrt
#include <unistd.h>
#include <time.h>
#include <stdio.h>
int main()
{
struct timespec res;
double resolution;
printf("UserHZ %ld\n", sysconf(_SC_CLK_TCK));
clock_getres(CLOCK_REALTIME, &res);
resolution = res.tv_sec + (((double)res.tv_nsec)/1.0e9);
printf("SystemHZ %ld\n", (unsigned long)(1/resolution + 0.5));
return 0;
}
- 1. python time (milli secondi)
- 2. Ruby timeout un blocco di codice dopo n * milli * secondi
- 3. Un thread può dormire per meno di mezzo milli secondi in Java/Other language?
- 4. Conversione dei secondi in ore, minuti e secondi
- 5. conversione di una stringa di tempo per secondi in python
- 6. Conversione del tempo in secondi con il numero di stringa
- 7. Conversione DateTime numero di secondi in VB NET
- 8. Conversione da frame a millisecondi in android
- 9. Conversione ore: minuti: secondi in minuti totali in excel
- 10. C++ Conversione di una stringa tempo di secondi di epoca
- 11. Conversione dei secondi in giorni, hh: mm: ss C#
- 12. Conversione del tempo 121.419419 in minuti/secondi leggibili
- 13. Conversione di data e ora ISO 8601 in secondi in Python
- 14. Oracle Converti secondi in ore: minuti: secondi
- 15. Converti secondi in giorni, minuti e secondi
- 16. Converti secondi in minuti e secondi
- 17. NSNumero di secondi a Ore, minuti, secondi
- 18. Conversione del timestamp Ruby in secondi in Epoch e in retro
- 19. Differenza di tempo in secondi
- 20. Convert HH: MM: SS stringa di secondi solo in javascript
- 21. Ruby/Rails - Come convertire secondi in tempo?
- 22. Converti DateTime.Ora in secondi
- 23. Converti in secondi
- 24. Come convertire secondi in ore, minuti e secondi?
- 25. Convertire secondi a giorni: ore: minuti: secondi
- 26. Differenza di tempo in secondi da numpy.timedelta64
- 27. Aggiunta di secondi a datetime in MySQL
- 28. conversione di byte in una stringa C#
- 29. Countdowntimer in minuti e secondi
- 30. Un modo efficiente per convertire secondi al minuto e secondi nel server sql 2005
Qual è la funzione utilizzata nel kernel 2.6? –
@kaciula Vedi jiffies_to_msecs() in include/linux/jiffies.h – tonylo