DOMANDA Come fa il SO a tener traccia del tempo che passa (software clock)?

Pubblicità

Johannesynt

Utente Èlite
Messaggi
1,568
Reazioni
220
Punteggio
102
Ciao a tutti, come da titolo vorrei capire bene come funziona l'orologio software del sistema operativo. So bene che quando la macchina viene accesa, il sistema prende l'ora attuale dall'orologio della scheda madre, e da quel momento in poi, fino allo spegnimento, l'orologio viene gestito dal sistema operativo. La mia domanda é: come ne tiene traccia? Ho fatto delle ricerca, ma cercando "clock" vengono fuori troppo cose che non c'entrano.
L'unica cosa che penso di aver capito, é che nel kernel c'é una variabile del tipo CLOCK_TICK_RATE9in linux si chiama cosí) di valore ad esempio 100 ( il valore é molto piú grande di 100, ma é giusto per fare un esempio); dovrebbe essere una cosa del genere: tick=100 vuol dire che il SO saprá che ogni 100 tick é passato un secondo. Infatti avevo trovato un esperimento di un utente che avevano compilato il kernel moltiplicando quella cifra per 10, ed il sistema andava molto piú lento. Ho quindi ipotizzato quel che ho scritto sopra. Nel mio esempio é come se il sistema credesse che ogni 1000 tick (non piú 100) passi un secondo, e quindi NEL sistema 1 sec corrisponde a nostri 10 sec nella realtá. Ma se cosí fosse, CHI genera questi tick? un meccanismo hardware (non l'orologio della scheda madre, benché sospetto che siano cmq legati)??
Spero di essermi spiegato, vi ringrazio.
 
In passato il sistema operativo usava il PIT, che è un generatore di frequenze dotato, in genere, di 3 divisori di frequenza. Conoscendo la frequenza alla quale il PIT genera un interrupt, si può stabilire quanto tempo è passato contando il numero di interrupt generati.

A questo si aggiunge un'altra fonte, cioè il RTC ( realtime clock ). Anche questo chip ha più divisori di frequenza, per cui è possibile settarlo per ottenere la risoluzione voluta ( il parametro CLOCK_TICK_RATE ).

Infine, dal 2005 in poi, è stato aggiunto un altro circuito, il HPET. E' il circuito da usare per ottenere una misura del tempo che sia il più possibile affidabile. Non a caso è stato creato appositamente per sostituire PIT e RTC.
 
A questo si aggiunge un'altra fonte, cioè il RTC ( realtime clock ). Anche questo chip ha più divisori di frequenza, per cui è possibile settarlo per ottenere la risoluzione voluta ( il parametro CLOCK_TICK_RATE ).

Innanzitutto ti ringrazio, era proprio questo che cercavo. Avrei qualche delucidazione da chiedere: questi meccanismi hardware sono quindi settabili (immagino dal bios, se questo lo permette - ho controllato nel mio non c'é nulla del genere), ma hanno un valore di default?
Ad esempio RTC e HPET, genereranno di default lo stesso numero di tick(hardware interrupts) al secondo, solamente che HPET é piú preciso..,siccome CLOCK_TICK_RATE é una varibaile (o meglio costante) che ha un valore prestabilito. A meno che i sistemi operativi non siano fatti in modo che, quando vengono installati la prima volta, vadano a leggere il tipo di meccanismo hardware del clock, ed in base a quello scelgano un valore da assegnare al CLOCK_TICK_RATE (avevo cercato nel sorgente di uno degli ultimi kernel linux, e CLOCK_TICK_RATE compariva piú volte con valori diversi, quindi magari QUALE di questi valori usare effettivamente viene scelto nel momento dell'installazione?).
 
No. I circuiti hanno una propria frequenza di base ( PIT circa 1.19 MHz, HPET circa 10MHz ). In uscita espongono una serie di comparatori, ognuno accessibile singolarmente, che danno come output il risultato di una divisione della frequenza di base per un certo divisore.

HPET supporta fino a 32 comparatori, per cui si possono ottenere vari sottomultipili dei 10 MHz di base. Ognuno di questi comparatori può essere programmato per produrre impulsi oneshot o ripetuti ( solo alcuni supportano la ripetizione, questi sono usati come timer ).

Quello che il kernel fa, è settare la frequenza di generazione dell'interrupt da parte del circuito timer. Ad esempio, il RTC ha una frequenza di 32.768 kHz. Il kernel setta un divisore apposito per ottenere tot interrupts al secondo ( 100,250,1000, ecc... ).

 
Quello che il kernel fa, è settare la frequenza di generazione dell'interrupt da parte del circuito timer. Ad esempio, il RTC ha una frequenza di 32.768 kHz. Il kernel setta un divisore apposito per ottenere tot interrupts al secondo ( 100,250,1000, ecc... ).

Ok, quindi il circuito timer (hardware) viene modificato via software(tramite kernel). E lo setta ad ogni avvio (non solo una volta in fase di installazione del SO). Se sulla stessa macchina ci sono piú sistemi operativi, mi immagino che appunto ogni volta che uno dei SO viene avviato, setta la frequenza di generazione interrupts del meccanismo hardware del timer. Giusto?
Quindi in pratica non é il SO che si adatta al timer, ma é il timer che viene adattato al SO? Nel senso che il SO ha un suo valore X di tick al secondo (CLOCK_TICK_RATE) prefissato, e setta il meccanismo hardware per farlo coincidere il piú possibile (ovvero per fargli generare X interrupts al secondo)?
Ti ringrazio ancora per le spiegazioni, e in piú ti chiedo se hai un link dove tutto ció viene documentato bene (in modo da poter approfondire senza dover fare altre mille domande)
 
Ok, quindi il circuito timer (hardware) viene modificato via software(tramite kernel). E lo setta ad ogni avvio (non solo una volta in fase di installazione del SO).

Considera che il timer non viene modificato, vengono configurati i divisori dei comparatori.

Se sulla stessa macchina ci sono piú sistemi operativi, mi immagino che appunto ogni volta che uno dei SO viene avviato, setta la frequenza di generazione interrupts del meccanismo hardware del timer. Giusto?

Ogni sistema può configurare ognuno dei comparatori a disposizione, come meglio crede.

Quindi in pratica non é il SO che si adatta al timer, ma é il timer che viene adattato al SO?

Si, il timer viene configurato dal sistema operativo.

Ti ringrazio ancora per le spiegazioni, e in piú ti chiedo se hai un link dove tutto ció viene documentato bene (in modo da poter approfondire senza dover fare altre mille domande)

Puoi trovarlo nella documentazione intel http://www.intel.com/content/dam/ww...ations/software-developers-hpet-spec-1-0a.pdf

Questo riguarda il HPET, per il RTC ci sono i manuali dei vari ICH sempre di intel.
 
Grazie mille, ultima domanda: riguardo ai comparatori (io avevo scritto che il kernel setta il timer, ma in effetti era ambiguo): questi comparatori che il kernel setta, fanno peró parte del componente hardware del timer? sono una sorta di registri con possibilitá di scrittura/lettura ( e non solo lettura)?
 
Grazie mille, ultima domanda: riguardo ai comparatori (io avevo scritto che il kernel setta il timer, ma in effetti era ambiguo): questi comparatori che il kernel setta, fanno peró parte del componente hardware del timer? sono una sorta di registri con possibilitá di scrittura/lettura ( e non solo lettura)?

Si, sono parte integrante del circuito temporizzatore.
 
Pubblicità
Pubblicità
Indietro
Top