ดูkernel / sched / loadavg.cซึ่งมีความคิดเห็นที่ยาวและยอดเยี่ยมในช่วงเริ่มต้นที่อธิบายถึงการได้มาของค่าเฉลี่ยการโหลดจากค่าเฉลี่ยการเน่าเปื่อยแบบทวีคูณของจำนวนเธรดที่รันได้ ("คิวการทำงาน") บวกจำนวนเธรดที่ไม่หยุดชะงัก บน I / O หรือรอการล็อค)
นี่คือสาระสำคัญของความคิดเห็น แต่มันก็คุ้มค่าที่จะอ่านทั้งหมด:
* The global load average is an exponentially decaying average of
* nr_running + nr_uninterruptible.
*
* Once every LOAD_FREQ:
* nr_active = 0;
* for_each_possible_cpu(cpu)
* nr_active += cpu_of(cpu)->nr_running +
* cpu_of(cpu)->nr_uninterruptible;
* avenrun[n] = avenrun[0] *
* exp_n + nr_active *
* (1 - exp_n)
ชีวิตจริงทำให้โค้ดค่อนข้างซับซ้อน: ตัวนับต่อซีพียู, เคอร์เนลที่ไม่ทำงาน, ซีพียู hotswap, การขาดรหัสจุดลอยที่ต้องการการใช้งานแบบคงที่ของ exp (n) แต่มันเป็นเรื่องง่ายที่จะเห็นว่าสิ่งเหล่านี้ล้วน แต่ทำงานเพื่อนำวิธีการที่อธิบายไว้ในความคิดเห็นไปใช้อย่างซื่อสัตย์
คุณจะทราบว่า Linux นับเธรดไม่ใช่เพียงแค่กระบวนการซึ่งตอบคำถามของคุณ