Rewrite: improve process handling and restoration
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user