Nilai bagus atau pembagian CPU?
Harap dicatat bahwa saat ini, nilai yang bagus mungkin tidak begitu relevan "seluruh sistem", karena pengelompokan tugas otomatis, terutama ketika menggunakan systemd . Silakan lihat jawaban ini untuk lebih jelasnya.
Perbedaan antara utas dan proses
Pertanyaan penting di Linux, karena dokumentasi melanggengkan keraguan (tentang utas yang tidak memiliki PID sendiri misalnya).
Catatan: jawaban ini menjelaskan thread Linux dengan tepat.
Singkatnya: kernel hanya menangani "entitas yang dapat dijalankan ", yaitu sesuatu yang dapat dijalankan dan dijadwalkan . Kernel bijaksana, entitas ini disebut proses. Utas, adalah sejenis proses yang berbagi (setidaknya) ruang memori dan penangan sinyal dengan yang lain.
Setiap proses tersebut memiliki pengidentifikasi unik seluruh sistem: PID (Process ID). Untuk apa yang disebut utas, terkadang disebut TID (Utas ID), tetapi dari sudut pandang sysadmin (dan kernel!), TID dan PID adalah hal yang sama (mereka berbagi namespace yang sama).
Hasilnya, Anda dapat renice
masing - masing "utas" secara individual karena mereka memiliki PID 1 mereka sendiri .
Menemukan semua PID renice
secara rekursif
Kita perlu mendapatkan PID dari semua proses ("normal" atau "utas") yang merupakan turunan (anak-anak atau dalam grup utas) dari proses yang akan dilakukan. Ini harus bersifat rekursif (mempertimbangkan anak-anak anak-anak).
Jawaban Anton Leontiev memberikan petunjuk untuk melakukannya: semua nama folder /proc/$PID/task/
adalah PID utas yang berisi children
file yang berisi daftar proses anak-anak yang potensial.
Namun, ini kurang berulang, jadi inilah skrip shell cepat & kotor untuk menemukannya:
#!/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
Jika proses PID 1234 adalah yang Anda inginkan secara rekursif bagus, sekarang Anda dapat melakukannya:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1 Perhatikan bahwa, untuk kepatuhan POSIX, panggilan getpid(2)
dalam utas tidak akan memberi Anda ID unik (PID) seluruh sistem dari entitas yang dapat dijalankan ini, melainkan PID dari proses utama dalam "grup utas". Anda harus menelepon gettid(2)
saja. Lihat jawaban ini untuk informasi lebih lanjut.
man (7) pthreads
mengatakan tentang implementasi saat ini (NPTL): "semua utas dalam suatu proses ditempatkan dalam grup utas yang sama; semua anggota grup utas berbagi PID yang sama" dan "Utas tidak berbagi nilai bagus yang sama". Lalu, bagaimana Anda bisa mengganti utas yang tidak memiliki PID sendiri, saatrenice
menggunakan PID untuk melakukannya?