GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:perché gli utenti Linux non utilizzano una chiamata di sistema per ottenere l'ora corrente?

Sto davvero cercando di capire perché le nostre VM guest non utilizzano il driver kvm-clock "come dovrebbero". Stanno eseguendo RHEL 7.2, glibc-2.17, kern 3.10.0. Programmi come date e perl -e 'print time' ottenere l'ora corrente, ma farlo senza effettuare una chiamata di sistema. Ciò è confermato con strace e ltrace e ulteriormente confermato utilizzando gdb e tracciando tramite assembly che ha ignorato il syscall e invece ha eseguito alcune istruzioni chiamate rtdscp .

È un tentativo di ottimizzazione da parte degli autori di glibc? C'è un modo per disabilitarlo e forzare le chiamate glibc a effettuare la chiamata di sistema (a meno di LD_PRELOAD hack)?

AGGIORNAMENTO 14-10-2016:

Dopo aver esaminato l'ultima bozza di POSIX, parte della risposta è chiara:c'è un modo per richiedere l'orologio dalla CPU, ma GNU glibc ha forzato erroneamente questa implementazione ai suoi utenti. La soluzione alternativa consiste nell'invocare direttamente la chiamata di sistema. (Booooh)

Se _POSIX_CPUTIME è definito, le implementazioni supporteranno i valori di clock ID ottenuti invocando clock_getcpuclockid(), che rappresentano l'orologio della CPU di un determinato processo. Le implementazioni supportano anche lo speciale valore clockid_t CLOCK_PROCESS_CPUTIME_ID, che rappresenta l'orologio della CPU del processo chiamante quando si richiama uno dei clock_() o timer_ () funzioni.

Dato che l'utente può Esiste un vero argomento contro l'idea che se clock_id è impostato su CLOCK_REALTIME , è necessario utilizzare la chiamata di sistema?

Risposta accettata:

Penso che il motivo per cui non vedi una syscall in corso sia che alcune chiamate di sistema Linux (in particolare quelle relative al tempo, come gettimeofday(2) e time(2) ) hanno implementazioni speciali tramite vDSO, che contiene implementazioni in qualche modo ottimizzate di alcune syscall:

Il “vDSO” (virtual dynamic shared object) è una piccola libreria condivisa
che il kernel mappa automaticamente nello spazio degli indirizzi di tutte le
applicazioni dello spazio utente.

Ci sono alcune chiamate di sistema fornite dal kernel
che il codice dello spazio utente finisce per essere usato frequentemente, al punto
che tali chiamate possono dominare le prestazioni complessive. Ciò è dovuto
sia alla frequenza della chiamata che all'overhead del cambio di contesto
che risulta dall'uscita dallo spazio utente e dall'ingresso nel
kernel.

Ora, il manuale menziona che le informazioni richieste sono semplicemente memorizzate in modo che un processo possa accedervi direttamente (l'ora corrente non è un gran segreto, dopotutto). Non conosco l'esatta implementazione e posso solo immaginare il ruolo del contatore del timestamp della CPU in esso.

Quindi, non è proprio glibc a fare un'ottimizzazione, ma il kernel. Può essere disabilitato impostando vdso=0 sulla riga di comando del kernel e dovrebbe essere possibile compilarlo. Tuttavia, non riesco a trovare se è possibile disabilitarlo sul lato glibc (almeno senza patchare la libreria).

Correlati:incorporare il tempo di arresto in un collegamento video di YouTube?

Ci sono un sacco di altre informazioni e fonti su questa domanda su SE.

Hai detto nella domanda:

Dopo aver esaminato l'ultima bozza POSIX, parte della risposta è chiara:c'è un modo per richiedere l'orologio dalla CPU, ma GNU glibc ha forzato erroneamente questa implementazione ai suoi utenti.

Che penso sia un'affermazione piuttosto audace. Non vedo alcuna prova di "forzare erroneamente" qualcosa sugli utenti, almeno non a loro svantaggio. L'implementazione vDSO è utilizzata da quasi tutti i processi Linux in esecuzione sui sistemi attuali, il che significa che se non avesse funzionato correttamente, si sarebbero già sentiti dei reclami molto rumorosi. Anche tu stesso hai detto che l'ora ricevuta è corretta.

La citazione che dai da clock_gettime il manuale sembra menzionare solo che la chiamata deve supportare gli ID dell'orologio restituiti da clock_getcpuclockid , niente sul comportamento di CLOCK_REALTIME o gettimeofday .


Linux
  1. Come utilizzare il comando touch di Linux + esempi

  2. Linux:come ottenere l'ora dell'orologio da parete di un processo in esecuzione?

  3. Come eseguire il mmap dello stack per la chiamata di sistema clone() su Linux?

  4. Ottieni l'ora corrente in secondi da Epoch su Linux, Bash

  5. Come ottenere l'ora di inizio di un processo Linux di lunga durata?

Perché ora è il momento migliore per usare GNOME

Perché usare il desktop Pantheon per Linux Elementary OS

Come usare il comando ftp di Linux

Come ottenere la data e l'ora correnti in Python

Come utilizzare il comando fd sul sistema Linux

Qual è la differenza tra una chiamata di libreria e una chiamata di sistema in Linux?