Rewrite: improve process handling and restoration

This commit is contained in:
2026-08-08 14:08:38 +03:00
parent bf37dd6974
commit 4f8f6218ad
3 changed files with 486 additions and 347 deletions
+57 -54
View File
@@ -1,103 +1,106 @@
# autoPriority
Monitors process memory usage on Windows and automatically adjusts CPU priority: promotes memory-heavy processes to HIGH and demotes everything else to NORMAL. Optionally enters **Game Mode** when a process exceeds a higher threshold, boosting it to HIGH and setting all other processes to IDLE.
Отслеживает использование памяти процессами в Windows и автоматически управляет их приоритетом: ресурсоемким процессам назначает HIGH, а менее ресурсоемким снижает приоритет до NORMAL, только если он был выше. При превышении повышенного порога может включать **игровой режим**, назначая обнаруженному процессу HIGH, а всем остальным — IDLE.
**Windows only.**
**Только для Windows.**
## How it works
## Принцип работы
### Normal mode
### Обычный режим
Every scan interval the program iterates over all running processes:
Через заданный интервал программа проверяет все запущенные процессы:
| RSS vs `-mem` | Current priority | Action |
| RSS относительно `-mem` | Текущий приоритет | Действие |
|---|---|---|
| ≥ threshold | anything except HIGH | → HIGH (logged as `PROMOTE`) |
| ≥ threshold | already HIGH | skip |
| < threshold | ABOVE_NORMAL, HIGH, or REALTIME | → NORMAL (logged as `DEMOTE`) |
| < threshold | NORMAL, BELOW_NORMAL, or IDLE | skip |
| ≥ порога | любой, кроме HIGH | → HIGH (запись `PROMOTE` в журнале) |
| ≥ порога | уже HIGH | пропустить |
| < порога | ABOVE_NORMAL, HIGH или REALTIME | → NORMAL (запись `DEMOTE` в журнале) |
| < порога | NORMAL, BELOW_NORMAL или IDLE | пропустить |
### Game mode (`-game-mem`)
### Игровой режим (`-game-mem`)
When any process reaches or exceeds the `-game-mem` threshold:
Когда любой процесс достигает или превышает порог `-game-mem`:
1. That process → **HIGH** (logged as `GAME`)
2. All other processes → **IDLE** (original priorities saved)
3. Log: `GAME MODE ON`
1. Этому процессу назначается **HIGH** (запись `GAME` в журнале).
2. Всем остальным процессам назначается **IDLE** с сохранением исходных приоритетов.
3. В журнал добавляется запись `GAME MODE ON`.
When all such processes close:
Когда все такие процессы завершаются:
1. All processes that were demoted during game mode are **restored to their original priority** (logged as `RESTORE`)
2. `GAME MODE OFF` logged
3. Normal mode resumes — priorities recalculated by `-mem` rules
1. Всем процессам, приоритет которых был снижен в игровом режиме, **возвращается исходный приоритет** (запись `RESTORE` в журнале).
2. В журнал добавляется запись `GAME MODE OFF`.
3. Возобновляется обычный режим, и приоритеты пересчитываются по правилам `-mem`.
If `SetPriorityClass` or `OpenProcess` fails for a process (e.g., anti-cheat protection, system processes), the process is added to an in-memory exclusion list and never touched again (logged as `BLOCK`). Blocked processes are still measured for RSS each scan — if a blocked process exceeds `-game-mem`, it triggers game mode without attempting to change its priority. When the process exits, it is automatically removed from the list.
Если изменить приоритет процесса невозможно, например из-за античита или системных ограничений, процесс добавляется во внутренний список исключений и больше не изменяется (запись `BLOCK` в журнале). Его RSS продолжает измеряться, поэтому он может включить игровой режим. Процессы, память которых прочитать не удалось, пропускаются до следующей проверки.
On shutdown, all processes demoted during game mode are restored to their saved original priority.
При штатном завершении программа несколько раз пытается восстановить приоритеты всех процессов, измененных в игровом режиме. Если Windows отклоняет восстановление, в журнал записывается предупреждение.
## Build
В одном сеансе Windows может работать только один экземпляр программы. Второй экземпляр завершается, не прерывая работу первого.
Requires Go 1.26+.
## Сборка
Требуется Go 1.26 или новее.
```
# Standard build (with console window)
# Обычная сборка с окном консоли
go build -o autopriority.exe .
# Background build (no console, minimal size)
go build -ldflags="-H windowsgui -s -w" -o autopriority.exe .
# Фоновая сборка без консоли, минимальный размер
go build -trimpath -buildvcs=false -gcflags="all=-l" -ldflags="-H=windowsgui -s -w -buildid=" -o autopriority.exe .
```
## Usage
## Использование
```
autopriority [flags]
```
| Flag | Default | Description |
| Флаг | Значение по умолчанию | Описание |
|-------------|---------------|----------------------------------|
| `-mem` | 512M | Memory threshold (e.g. 512M, 1G, 2048M) |
| `-game-mem` | 2G | Game threshold (e.g. 2G, 4G). Must be > `-mem`. 0 = disabled |
| `-interval` | 1 minute | Scan interval (min 10s) |
| `-dry-run` | false | Log only, don't change priority |
| `-mem` | 512M | Порог памяти, например 512M, 1G или 2048M |
| `-game-mem` | 2G | Порог игрового режима, например 2G или 4G. Должен быть больше `-mem`. 0 отключает режим |
| `-interval` | 1 минута | Интервал проверки, минимум 10 секунд |
| `-dry-run` | false | Только записывать решения в журнал, не менять приоритеты |
Examples:
Примеры:
```
# Run with 1 GB threshold, scanning every 30 seconds
# Порог 1 ГБ, проверка каждые 30 секунд
autopriority -mem=1G -interval=30s
# Run with defaults (512M threshold, 2G game threshold)
# Запуск со значениями по умолчанию: порог 512M, игровой порог 2G
autopriority
# Game mode: normal threshold 512M, game threshold 4G
# Обычный порог 512M, игровой порог 4G
autopriority -mem=512M -game-mem=4G
# Dry run — log decisions without changing anything
# Пробный запуск: записывать решения, ничего не изменяя
autopriority -dry-run
```
## Log
## Журнал
Log is always written to `%TEMP%\autopriority.log`. A new log file is created on each run (previous log is deleted).
Журнал всегда записывается в `%TEMP%\autopriority.log`. При каждом запуске создается новый файл, а предыдущий удаляется.
Log entries:
Типы записей:
| Prefix | Meaning |
| Префикс | Значение |
|---|---|
| `PROMOTE` | Priority raised to HIGH (normal mode) |
| `DEMOTE` | Priority lowered to NORMAL (normal mode) |
| `GAME DETECT` | Process first detected as exceeding game-mem threshold |
| `GAME` | Process set to HIGH or IDLE (game mode) |
| `GAME MODE ON` | Game mode activated |
| `GAME MODE OFF` | Game mode deactivated — processes restored |
| `BLOCK` | OpenProcess or SetPriorityClass failed; process added to exclusion list |
| `RESTORE` | Process restored to original/saved priority (game mode exit or shutdown) |
| `[DRY-RUN]` | Would change priority (dry-run mode) |
| `PROMOTE` | Приоритет повышен до HIGH в обычном режиме |
| `DEMOTE` | Приоритет снижен до NORMAL в обычном режиме |
| `GAME DETECT` | Впервые обнаружен процесс, превысивший порог `-game-mem` |
| `GAME` | Процессу назначен HIGH или IDLE в игровом режиме |
| `GAME MODE ON` | Игровой режим включен |
| `GAME MODE OFF` | Игровой режим выключен, приоритеты восстановлены |
| `BLOCK` | Ошибка OpenProcess или SetPriorityClass, процесс добавлен в список исключений |
| `SKIP` | Не удалось прочитать сведения о процессе, попытка повторится при следующей проверке |
| `RESTORE` | Восстановлен исходный приоритет при выходе из игрового режима или завершении программы |
| `[DRY-RUN]` | Приоритет был бы изменен в пробном режиме |
## Auto-start
## Автозапуск
Open **Win+R**, type `shell:startup`, and press Enter. Then place a shortcut to `autopriority.exe` in the folder that opens.
Нажмите **Win+R**, введите `shell:startup` и нажмите Enter. Поместите ярлык `autopriority.exe` в открывшуюся папку.
## Dependencies
## Зависимости
None. Uses only Windows API (kernel32, psapi) via raw syscall.
Отсутствуют. Программа напрямую вызывает Windows API (`kernel32`, `psapi`) через syscall.