GNU/Linux >> Belajar Linux >  >> Linux

Linux – Mengapa Utils Linux Tidak Menggunakan System Call Untuk Mendapatkan Waktu Saat Ini?

Saya benar-benar mencoba memahami mengapa VM tamu kami tidak menggunakan driver kvm-clock "seperti yang seharusnya". Mereka menjalankan RHEL 7.2, glibc-2.17, kern 3.10.0. Program seperti date dan perl -e 'print time' dapatkan waktu saat ini, tetapi lakukan tanpa melakukan panggilan sistem. Ini dikonfirmasi dengan strace dan ltrace dan selanjutnya dikonfirmasi dengan menggunakan gdb dan menelusuri melalui perakitan yang melewati syscall dan sebagai gantinya mengeksekusi beberapa instruksi yang disebut rtdscp .

Apakah ini upaya pengoptimalan oleh penulis glibc? Apakah ada cara untuk menonaktifkan ini dan memaksa panggilan glibc untuk melakukan panggilan sistem (kependekan dari peretasan LD_PRELOAD)?

PERBARUI 14-10-2016:

Setelah meninjau draf POSIX terbaru, sebagian dari jawabannya jelas:ada cara untuk meminta jam dari CPU, tetapi GNU glibc telah salah memaksakan implementasi ini pada penggunanya. Solusinya adalah memanggil panggilan sistem secara langsung. (Booooh)

Jika _POSIX_CPUTIME didefinisikan, implementasi harus mendukung nilai ID jam yang diperoleh dengan menjalankan clock_getcpuclockid(), yang mewakili jam waktu CPU dari proses yang diberikan. Implementasi juga harus mendukung nilai clockid_t khusus CLOCK_PROCESS_CPUTIME_ID, yang mewakili jam waktu-CPU dari proses panggilan saat memanggil salah satu dari clock_() atau timer_ () fungsi.

Mengingat bahwa pengguna dapat Apakah ada argumen nyata yang menentang gagasan bahwa jika clock_id disetel ke CLOCK_REALTIME , panggilan sistem harus digunakan?

Jawaban yang Diterima:

Saya pikir alasan Anda tidak melihat syscall terjadi, adalah karena beberapa panggilan sistem Linux (terutama yang terkait dengan waktu, seperti gettimeofday(2) dan time(2) ) memiliki implementasi khusus melalui vDSO, yang berisi implementasi beberapa syscalls yang agak dioptimalkan:

“vDSO” (objek bersama dinamis virtual) adalah perpustakaan bersama kecil
yang secara otomatis dipetakan oleh kernel ke dalam ruang alamat semua
aplikasi ruang pengguna.

Ada beberapa panggilan sistem yang
kernel sediakan bahwa kode ruang pengguna akhirnya sering digunakan, hingga
titik bahwa panggilan semacam itu dapat mendominasi kinerja secara keseluruhan. Hal ini disebabkan
baik oleh frekuensi panggilan maupun pengalihan konteks
overhead yang dihasilkan dari keluar dari ruang pengguna dan memasuki
kernel.

Sekarang, manual menyebutkan bahwa informasi yang diperlukan hanya ditempatkan di memori sehingga suatu proses dapat mengaksesnya secara langsung (bagaimanapun juga, waktu saat ini tidak terlalu dirahasiakan). Saya tidak tahu persis implementasinya, dan hanya bisa menebak tentang peran penghitung cap waktu CPU di dalamnya.

Jadi, sebenarnya bukan glibc yang melakukan optimasi, tapi kernelnya. Itu dapat dinonaktifkan dengan mengatur vdso=0 pada baris perintah kernel, dan mungkin untuk mengompilasinya. Namun, saya tidak dapat menemukan apakah mungkin untuk menonaktifkannya di sisi glibc (setidaknya tanpa menambal pustaka).

Terkait:Menyematkan waktu berhenti di tautan video YouTube?

Ada banyak informasi dan sumber lain tentang pertanyaan ini di SE.

Anda mengatakan dalam pertanyaan:

Setelah meninjau draf POSIX terbaru, sebagian jawabannya jelas:ada cara untuk meminta jam dari CPU, tetapi GNU glibc telah salah memaksakan implementasi ini pada penggunanya.

Yang menurut saya adalah pernyataan yang agak berani. Saya tidak melihat bukti "salah memaksakan" apa pun pada pengguna, setidaknya tidak merugikan mereka. Implementasi vDSO digunakan oleh hampir setiap proses Linux yang berjalan pada sistem saat ini, artinya jika tidak bekerja dengan benar, beberapa keluhan yang sangat keras akan terdengar. Anda juga mengatakan pada diri sendiri bahwa waktu yang diterima sudah benar.

Kutipan yang Anda berikan dari clock_gettime manual sepertinya hanya menyebutkan bahwa panggilan harus mendukung id jam yang dikembalikan oleh clock_getcpuclockid , bukan apa-apa tentang perilaku CLOCK_REALTIME atau gettimeofday .


Linux
  1. Cara Menggunakan Perintah Sentuh Linux + Contoh

  2. Apa runlevel sistem Linux saat ini?

  3. Linux:Bagaimana Mendapatkan Semua Log Masuk Dari Sistem?

  1. Bagaimana cara mendapatkan waktu mulai dari proses Linux yang sudah berjalan lama?

  2. Bagaimana cara mendapatkan sistem operasi saat ini di MSBuild?

  3. Dapatkan nilai saat ini/default dari TCP initcwnd di Linux

  1. Linux – Mengapa Tidak Ada Sistem File Rootfs Di Sistem?

  2. Mengapa ada kebutuhan untuk memodifikasi tabel system call di Linux?

  3. Bagaimana Linux menggunakan jam waktu nyata?