คุ้มค่าหรือซีพียูใช้ร่วมกัน?
โปรดทราบว่าปัจจุบันค่านิยมที่ดีอาจจะไม่เกี่ยวข้องดังนั้น "ทั้งระบบ" เพราะงานอัตโนมัติการจัดกลุ่ม espacially เมื่อใช้systemd โปรดดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
ความแตกต่างระหว่างเธรดและกระบวนการ
คำถามที่สำคัญบน Linux เนื่องจากเอกสารประกอบจะทำให้เกิดข้อสงสัย (เช่นเธรดที่ไม่มี PID ของตัวเอง)
หมายเหตุ: คำตอบนี้อธิบายถึงหัวข้อ Linux อย่างแม่นยำ
กล่าวโดยย่อ: เคอร์เนลจัดการเฉพาะ "เอนทิตีที่เรียกใช้งานได้" ซึ่งก็คือสิ่งที่สามารถรันและกำหนดเวลาได้ เคอร์เนลฉลาด, หน่วยงานเหล่านี้เรียกว่ากระบวนการ เธรดเป็นเพียงกระบวนการที่แบ่งใช้พื้นที่หน่วยความจำ (อย่างน้อย) และตัวจัดการสัญญาณกับอีกกระบวนการหนึ่ง
ทุกกระบวนการดังกล่าวมีตัวระบุที่ไม่ซ้ำกันทั้งระบบ: PID (ID กระบวนการ) สำหรับเธรดที่เรียกว่าบางครั้งเรียกว่า TID (Thread ID) แต่จากมุมมอง sysadmin (และเคอร์เนล!) TID และ PID เป็นสิ่งเดียวกัน (แบ่งเป็นเนมสเปซเดียวกัน)
เป็นผลให้คุณสามารถ renice
แต่ละ "หัวข้อ" รายบุคคลเพราะพวกเขามีของพวกเขาเอง PID 1
ค้นหา PID ทั้งหมดไปยังrenice
แบบเรียกซ้ำ
เราจำเป็นต้องได้รับ PID ของกระบวนการทั้งหมด ("ปกติ" หรือ "เธรด") ซึ่งเป็นลูกหลาน (เด็กหรือในกลุ่มเธรด) ของกระบวนการที่ต้องถูกจัดให้อยู่ในสภาพดี สิ่งนี้ควรเป็นแบบเรียกซ้ำ (พิจารณาจากเด็ก ๆ )
คำตอบของAnton Leontievให้คำแนะนำ: ชื่อโฟลเดอร์ทั้งหมด/proc/$PID/task/
เป็น PID ของเธรดที่มีchildren
ไฟล์ที่แสดงรายการกระบวนการลูกที่มีศักยภาพ
อย่างไรก็ตามมันไม่มีการเรียกซ้ำดังนั้นนี่คือเชลล์สคริปต์ที่รวดเร็วและสกปรกเพื่อค้นหา:
#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1
PID_LIST=
findpids() {
for pid in /proc/$1/task/* ; do
pid="$(basename "$pid")"
PID_LIST="$PID_LIST$pid "
for cpid in $(cat /proc/$1/task/$pid/children) ; do
findpids $cpid
done
done
}
findpids $1
echo $PID_LIST
หากกระบวนการ PID 1234 เป็นสิ่งที่คุณต้องการทำซ้ำที่ดีตอนนี้คุณสามารถทำได้:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1โปรดทราบว่าสำหรับการปฏิบัติตาม POSIX การโทรgetpid(2)
ภายในเธรดจะไม่ให้ ID ที่ไม่ซ้ำกันทั่วทั้งระบบ (PID) ของเอนทิตีที่รันได้นี้ แต่เป็นการ PID ของกระบวนการหลักภายใน "กลุ่มเธรด" คุณจะต้องโทรgettid(2)
แทน ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม
man (7) pthreads
พูดเกี่ยวกับการใช้งานปัจจุบัน (NPTL): "เธรดทั้งหมดในกระบวนการถูกวางไว้ในกลุ่มเธรดเดียวกันสมาชิกทั้งหมดของกลุ่มเธรดใช้ PID เดียวกัน" และ "เธรดไม่แชร์ค่า nice ที่ดี" จากนั้นคุณจะสามารถยกเลิกเธรดที่ไม่มี PID ของตัวเองได้อย่างไรเมื่อrenice
ใช้ PID