Я изучаю, как сделать так, чтобы мой рабочий стол Linux оставался гладким и интерактивным, пока я выполняю задачи с интенсивным использованием ЦП в фоновом режиме. Вот пример программы (написанной на Java), которую я использую для имитации загрузки процессора:
public class Spinner {
public static void main(String[] args)
{
for (int i = 0; i < 100; i++) {
(new Thread(new Runnable() {
public void run() {
while (true);
}
})).start();
}
}
}
Когда я запускаю ее в командной строке, я замечаю, что интерактивность моих настольных приложений (например, текстового редактора) значительно падает. У меня двухъядерный компьютер, поэтому меня это не удивляет.
Чтобы бороться с этим, моей первой мыслью было nice процесс с помощью renice -p 20
. Однако я обнаружил, что это не сильно влияет. Вместо этого мне нужно перерисовать все дочерние процессы с помощью чего-то вроде ls / proc /
, что дает гораздо больший эффект.
Меня это очень смущает, так как я не ожидал, что потоки будут иметь собственные идентификаторы процесса. Даже если бы они это сделали, я ожидал, что renice
будет действовать в отношении всего процесса, а не только его основного потока.
Есть ли у кого-нибудь четкое представление о том, что здесь происходит? Похоже, что каждый поток на самом деле является отдельным процессом (по крайней мере, у него есть действительный PID). Я знал, что исторически Linux работал так, но я полагал, что NPTL исправил это много лет назад.
Я тестирую RHEL 5.4 (ядро Linux 2.6.18).
(Кстати, я замечаю тот же эффект, если я попробуйте использовать sched_setscheduler (
, чтобы попытаться решить эту проблему интерактивности. Т.е. мне нужно сделать этот вызов для всех «дочерних» процессов, которые я вижу в / proc /
, недостаточно выполнить его один раз на pid основной программы.)