Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


rsod, принцип понятен.
Цитата rsod:
Есть ли какая-нибудь утилитка, »
Утилитки такой нет. Можно попробовать написать её, например, на PowerShell. Наподобие:
Код: Выделить весь код
# Имя текущего пользователя
$sUserName      = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

# Хэш-таблица для имен владельцев процессов
$aProcessOwners = @{ }

# Заполняем хэш-таблицу именами владельцев процессов
Get-WmiObject "Win32_Process" | % { $aProcessOwners[$_.Handle] = $_.GetOwner().Domain + "\" + $_.GetOwner().User }

# Получаем коллекцию процессов, владельцем которых является текущий пользователь,
# и которые имеют текущий приоритет выполнения равный 8 (Normal Priority)
$cProcess = Get-Process | `
    Where-Object -FilterScript {
        ($aProcessOwners[$_.Id.ToString()] -eq $sUserName) `
        -and ($_.PriorityClass -eq [System.Diagnostics.ProcessPriorityClass]::Normal)
    }
        
# Каждому процессу из полученной коллекции пытаемся понизить приоритет до 6 (BelowNormal Priority)
# и назначаем для его исполнения нулевой процессор (битовая маска 0x01 — binary 00000001)
$cProcess | `
    ForEach-Object -Process { 
        Try {
            $_.PriorityClass     = [System.Diagnostics.ProcessPriorityClass]::BelowNormal
            $_.ProcessorAffinity = 0x01
        } Catch {} 
    }

# Запускаем новый процесс «Косынка»
$oProcess = Start-Process -FilePath "c:\windows\system32\freecell.exe" -PassThru

# Задаём ему высокий приоритет выполнения, равный 13 (High Priority)
# и назначаем для его исполнения первый процессор (битовая маска 0x02 — binary 00000010)
$oProcess.PriorityClass     = [System.Diagnostics.ProcessPriorityClass]::High
$oProcess.ProcessorAffinity = 0x02

# Ожидаем завершения запущенного процесса
$oProcess | Wait-Process


# Вобрат перебираем процессы из коллекции, пытаемся установить приоритет процесса на 8 (Normal Priority)
# и назначаем для его исполнения оба из имеющихся процессоров (битовая маска 0x03 — binary 00000011)
$cProcess | `
    ForEach-Object -Process { 
        Try {
            $_.PriorityClass     = [System.Diagnostics.ProcessPriorityClass]::Normal
            $_.ProcessorAffinity = 0x03
        } Catch {}
    }
Я решил дополнительно ограничиться процессами, имеющими нормальный приоритет, поскольку:
* если у процесса и так был пониженный приоритет — нет нужды его трогать;
* если у процесса был повышенный приоритет — его лучше не трогать .

Поскольку в моём наличии было лишь два ядра, я привёл пример кода именно для такого количества. Вы же можете задавать потребные битовые маски для своего процессора.

Если Вам недостаточно «BelowNormal»/«High», и Вы хотите большей разницы — можете экспериментировать. Я не стал.

Отправлено: 04:06, 15-03-2011 | #7