ในระบบของฉันมันได้รับ uptime จาก/proc/uptime
:
$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY) = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY) = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY) = 4
10:52:38 up 3 days, 23:38, 4 users, load average: 0.00, 0.02, 0.05
จากproc manpage :
/proc/uptime
This file contains two numbers: the uptime of the system
(seconds), and the amount of time spent in idle process
(seconds).
ระบบไฟล์ proc มีชุดของไฟล์หลอก สิ่งเหล่านี้ไม่ใช่ไฟล์จริงพวกเขาดูเหมือนไฟล์ แต่มีค่าที่เคอร์เนลจัดเตรียมไว้ให้โดยตรง ทุกครั้งที่คุณอ่านไฟล์เช่น/proc/uptime
เนื้อหาจะถูกสร้างใหม่ทันที ระบบไฟล์ proc เป็นส่วนต่อประสานกับเคอร์เนล
ในซอร์สโค้ดเคอร์เนลของ linux ของไฟล์fs/proc/uptime.c
ที่บรรทัดที่ 49คุณจะเห็นการเรียกใช้ฟังก์ชัน:
proc_create("uptime", 0, NULL, &uptime_proc_fops);
สิ่งนี้จะสร้างรายการระบบไฟล์ proc ที่เรียกว่าuptime
(โดยปกติจะติดตั้งอยู่ใต้ procfs /proc
) และเชื่อมโยงฟังก์ชั่นซึ่งกำหนดการทำงานของไฟล์ที่ถูกต้องในไฟล์เทียมและฟังก์ชั่นที่เกี่ยวข้อง ในกรณีของ uptime เป็นเพียงread()
และopen()
การดำเนินงาน อย่างไรก็ตามหากคุณติดตามฟังก์ชั่นย้อนกลับคุณจะสิ้นสุดที่นี่ซึ่งคำนวณเวลาการใช้งาน
ภายในมีตัวจับเวลา interupt ซึ่งปรับปรุงระบบ uptime เป็นระยะ (นอกเหนือจากค่าอื่น ๆ ) ช่วงเวลาที่ตัวจับเวลา inter-ticks ถูกกำหนดโดย preprocessor-macro HZ
ซึ่งมีค่าที่แน่นอนถูกกำหนดในไฟล์เคอร์เนลconfigและนำไปใช้ในเวลารวบรวม
เวลาที่ไม่ได้ใช้งานและจำนวนรอบของ CPU รวมกับความถี่HZ
(รอบต่อวินาที) สามารถคำนวณได้ในจำนวน (ของวินาที) นับตั้งแต่การบู๊ตครั้งสุดท้าย
เพื่อตอบคำถามของคุณ: “ เวลาทำงาน” เริ่มนับเมื่อใด
เนื่องจาก uptime เป็นค่าภายในเคอร์เนลซึ่งทำเครื่องหมายทุกรอบจึงเริ่มนับเมื่อเคอร์เนลเริ่มต้น นั่นคือเมื่อรอบแรกสิ้นสุดลง แม้ก่อนที่จะมีการติดตั้งอะไรก็ตามหลังจาก bootloader ให้การควบคุมกับเคอร์เนลอิมเมจ