2012-06-17 1 views
0

Что является лучшим способом предоставить процессу/потоку право понизить его собственное приятное значение, не запуская его с полными привилегиями? Решение может быть внешним по отношению к самому процессу (например, ulimit или setcap).Самый портативный (среди * nix) способ, позволяющий потоку опускать свой собственный красивый

Я ищу что-то портативное, по крайней мере, в современных Linux и Mac OS X (и именно поэтому я не ответил сам ulimit или setcap).

ответ

1

Вам потребуются дополнительные привилегии для уменьшения хорошего значения (увеличение логического приоритета). В Linux это означает, что он выполняется от root или имеет возможность CAP_SYS_NICE. Оба могут быть установлены для двоичного исполняемого файла (либо setuid root через chown и chmod, либо setcap). Первый будет работать на всех Unix-подобных системах (но будет требовать привилегии root при установке), но последний имеет специфику Linux.

Наиболее приемлемым переносным способом, вероятно, является создание программы-обертки, в которой может быть установлен корень setuid. Это будет очень просто, всего несколько десятков строк C. Он просто вызывает sched_get_priority_min(), sched_get_priority_max(), sched_setscheduler() и sched_setparam(), чтобы опустить хорошее значение (получая его больше времени процессора), а затем вызывает seteuid (0); setregid (getgid(), getgid); setreuid (getuid(), getuid()); для удаления дополнительных привилегий и, наконец, execv() фактической программы. Примечание: вам наиболее определенно нужно жестко указать путь к реальной программе во время установки. Это должно работать без изменений во всех Linux и Unix-подобных системах.

В вашей реальной программе вы просто увеличиваете тонкость нитей, которые не так важны. Другими словами, вы не пытаетесь снизить привлекательность любых потоков в своей программе, но увеличиваете привлекательность всех других потоков. Программа корневой оболочки setuid - это переносимый способ уменьшить минимальный уровень удовлетворенности. Вы можете, очевидно, проверить текущую информацию о тонкости и планировщике, чтобы увидеть, есть ли достаточный диапазон для настройки. Возможно, ваша программа-обертка может устанавливать параметры командной строки или переменные среды, которые указывают фактическую программу, какие уровни приоритета использовать.

+0

проблема в том, что моя программа должна увеличивать и понижать динамику. –

1

Любой процесс может сделать себя лучше, используя setpriority() или sched_setscheduler(), и любую нить используя pthread_setchedparam() и pthread_setschedprio(). Оба они определены в POSIX.1-2001, поэтому должны быть доступны в основном во всех системах, отличных от Windows. Подробнее о типах планировщика и доступных приоритетах см. Man 2 sched_setscheduler.

Обратите внимание, что более высокие значения числового приоритета указывают на более приятный процесс; более низкий логический приоритет. Чем больше значение, тем меньше времени процессора. Чтобы узнать минимальные и максимальные значения для заданной политики планирования, вы должны использовать sched_get_priority_min() и sched_get_priority_max().

Обычно процесс или нить должны всегда иметь возможность снизить приоритет (что делает его более приятным) и использовать любую политику планирования, которая не делает ее менее приятной. Однако ядра Linux до 2.6.12 не разрешали это для обычных пользователей, поэтому ваша программа должна, вероятно, просто попытаться сделать ее или некоторые из ее потоков более приятными, но не слишком сильно, если это не будет разрешено на некоторых более сложных архитектурах , Самое главное, ваш алгоритмический дизайн не должен полагаться на планирование; стремиться к созданию более надежного кода.

+0

Я прошу предоставить доступ к переносимым способам получения прав на уменьшение полезной стоимости, и вы не решаете эту проблему. И с реализацией блокировки (так что блокировки шпинделей, явные блокировки памяти и т. Д.) Имеет значение, и с этим я могу получить очень хорошие улучшения производительности, которые невозможно с помощью мьютексов и без вмешательства в планирование. –