Apa yang secara spesifik adalah waktu-jam dinding, waktu-pengguna-waktu, dan waktu-sistem-waktu di UNIX?

144

Saya dapat menebak berdasarkan nama-nama, tetapi apa yang secara spesifik adalah jam dinding, waktu pengguna, dan waktu sistem di UNIX?

Apakah waktu pengguna-cpu jumlah waktu yang dihabiskan untuk mengeksekusi kode-pengguna sementara waktu kernel-cpu jumlah waktu yang dihabiskan dalam kernel karena kebutuhan operasi istimewa (seperti IO ke disk)?

Unit waktu pengukuran ini di.

Dan apakah jam dinding benar-benar jumlah detik proses yang dihabiskan untuk CPU atau apakah namanya hanya menyesatkan?

John Humphreys - w00te
sumber
Kemungkinan duplikat Apa arti 'nyata', 'pengguna' dan 'sistem' dalam output waktu (1)?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

142

Waktu jam dinding adalah waktu yang diukur oleh jam di dinding (atau stopwatch di tangan) telah berlalu antara awal proses dan 'sekarang'.

Waktu pengguna-CPU dan waktu sistem-CPU cukup banyak seperti yang Anda katakan - jumlah waktu yang dihabiskan dalam kode pengguna dan jumlah waktu yang dihabiskan dalam kode kernel.

Satuannya adalah detik (dan subsekon, yang mungkin berupa mikrodetik atau nanodetik).

Waktu jam dinding bukan jumlah detik yang dihabiskan proses pada CPU; ini adalah waktu yang telah berlalu, termasuk waktu yang dihabiskan menunggu gilirannya pada CPU (sementara proses lain bisa dijalankan).

Jonathan Leffler
sumber
16
Jadi apakah ini berarti waktu jam dinding akan selalu lebih besar dari waktu cpu?
Pacerier
35
@Pacerier: pada mesin inti tunggal, ya, tetapi mesin multi-inti dan program multi-ulir dapat menggunakan lebih dari 1 CPU detik per detik yang berlalu.
Jonathan Leffler
@JonathanLeffler terima kasih atas jawabannya, saya ingin mendapatkan jumlah nanodetik yang telah berlalu tetapi menghitung waktu CPU menggunakan rumus CPUtime = #clock_cycles / clock_ratetidak bisa sama dengan menghitung waktu yang telah berlalu. Apakah Anda tahu jika saya bisa mendapatkan waktu yang telah berlalu dari waktu CPU?
Bionix1441
2
@ Bionix1441: Anda tidak dapat memperoleh waktu yang telah berlalu dari waktu CPU karena sejumlah alasan. Pertama, suatu proses bisa diam, tidak memakan waktu CPU apa pun, untuk periode yang sewenang-wenang (misalnya, proses daemon menunggu klien untuk menghubungkannya melalui jaringan), sehingga mungkin tidak melakukan apa-apa selama berhari-hari pada waktu yang telah berlalu . Kedua, jika sedang berjalan, mungkin ada beberapa utas, dan jika memiliki, katakanlah, 4 utas dan ada 4 atau lebih inti pada sistem, mungkin diperlukan 4 detik CPU dari upaya yang dikeluarkan per detik dari waktu yang telah berlalu. Ini menunjukkan bahwa tidak ada rumus sederhana (atau bahkan rumit) yang dapat Anda gunakan.
Jonathan Leffler
1
@Catbuilts: Apakah Anda sadar bahwa kernel Unix berjalan secara terpisah dari program pengguna. Ketika program Anda membuat panggilan sistem (misalnya, read()atau getpid()), kernel mengeksekusi kode atas nama program Anda. Kernel juga menangani pre-emptive multi-tasking sehingga program lain dapat menjalankannya, dan melakukan beberapa pekerjaan rumah tangga umum untuk menjaga sistem berjalan dengan lancar. Kode ini dieksekusi dalam 'kode kernel' (juga dalam 'mode kernel'). Ini berbeda dari kode yang Anda tulis, dan pustaka pengguna (termasuk pustaka sistem C) yang Anda jalankan.
Jonathan Leffler
36

Jam dinding waktu: waktu berlalu sesuai dengan jam internal komputer, yang harus cocok dengan waktu di dunia luar. Ini tidak ada hubungannya dengan penggunaan CPU; itu diberikan untuk referensi.

Waktu CPU pengguna dan waktu sistem: persis apa yang Anda pikirkan. Panggilan sistem, yang meliputi I / O panggilan seperti read, write, dll dijalankan oleh melompat ke dalam kode kernel dan melaksanakan itu.

Jika jam dinding <waktu CPU, maka Anda menjalankan program secara paralel. Jika waktu jam dinding> waktu CPU, Anda sedang menunggu disk, jaringan atau perangkat lain.

Semua diukur dalam hitungan detik, per SI .

Fred Foo
sumber
7

Waktu jam dinding persis seperti yang tertulis, waktu yang berlalu yang diukur dengan jam di dinding Anda (atau jam tangan)

Waktu cpu pengguna adalah waktu yang dihabiskan di "lahan pengguna", yaitu waktu yang dihabiskan untuk proses non-kernel

Waktu cpu sistem adalah waktu yang dihabiskan di kernel, biasanya waktu yang dihabiskan untuk melayani panggilan sistem.

ennuikiller
sumber
7
time [WHAT-EVER-COMMAND]

real    7m2.444s
user    76m14.607s
sys 2m29.432s

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24

nyata atau jam dinding

7m2.444 nyata

Pada sistem dengan prosesor 24 inti, proses cmd / ini memakan waktu 7+ menit untuk menyelesaikannya. Itu dengan memanfaatkan paralelisme yang paling mungkin dengan semua core yang diberikan.

pengguna

pengguna 76m14.607s

Cmd / proses telah menggunakan banyak waktu cpu. Dengan kata lain, pada mesin dengan CPU single core, yang asli dan pengguna akan hampir sama, sehingga perintah yang sama akan memakan waktu ~ 76 menit untuk selesai.

sys

sys 2m29.432s

Ini adalah waktu yang dibutuhkan oleh kernel untuk menjalankan semua operasi tingkat dasar / sistem untuk menjalankan cmd ini, termasuk pengalihan konteks, alokasi sumber daya, dll.

Catatan: Contoh ini mengasumsikan bahwa perintah Anda menggunakan paralelisme / utas.

Halaman manual terperinci: https://linux.die.net/man/1/time

Sankarganesh Eswaran
sumber
Mengingat waktu yang Anda posting, bukankah kira-kira setengah dari paralelisme selesai? (saya hanya melakukan (user + sys) / realuntuk mewakili hal itu.
dtc