Вы сказали, что ваша обработка требует много памяти, поэтому решения, использующие nice
, не будут работать.nice
обрабатывает приоритет доступа ЦП, а не доступа ввода-вывода.PROCESS_MODE_BACKGROUND_BEGIN
снижает приоритет ввода-вывода, а также приоритет процессора и требует наличия функций ядра, которых нет в XP и более ранних версиях.
Управление приоритетом ввода / вывода не переносимо в Unices, но есть решение для современных ядер Linux.Вам нужно будет CAP_SYS_ADMIN
, чтобы снизить приоритет ввода / вывода до IO_PRIO_CLASS_IDLE
, но без этого можно снизить и повысить приоритет в классе наилучших усилий.
Вызов ключевой функции: ioprio_set
, который вам придется вызывать через оболочку syscall
:
static int ioprio_set(int which, int who, int ioprio)
{
return syscall(SYS_ioprio_set, which, who, ioprio);
}
Для полного примера источника, см. Здесь .
В зависимости от разрешений ваш вход в фоновый режим может быть либо IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_IDLE,0)
, либо IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,7)
.Последовательность должна быть такой:
#define IOPRIO_PRIO_VALUE(class, data) (((class) << IOPRIO_CLASS_SHIFT) | data)
ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,7));
// Do work
ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,4));
Обратите внимание, что многие из вас не имеют разрешения вернуться к своему первоначальному приоритету io, поэтому вам нужно будет вернуться к другому значению наилучшего усилия.