Показать полную графическую версию : Переключение задач на одно ядро
Есть ли какая-нибудь утилитка, позволяющая на время действия некоторого процесса отдать ему 3 (2, 1) из нескольких ядер, а остальные процессы автоматически переключить на другие ядра? Естественно, после завершения процесса всё должно автоматически вернуться "на круги своя".
rsod,
http://www.howtogeek.com/howto/windows-vista/start-an-application-assigned-to-a-specific-cpu-in-windows-vista/
Petya V4sechkin
13-03-2011, 21:39
rsod, в Диспетчере задач на процессе правой кнопкой мыши -> Задать соответствие.
[решено] Как заставить приложение работать с одним ядром процессора (http://forum.oszone.net/thread-199496.html)
[решено] Как запустить приложение на одном CPU из двух (http://forum.oszone.net/thread-181531.html)
[решено] как сделать чтоб процесс автоматически использовал только одно ядро? (http://forum.oszone.net/thread-95951.html)
Казбек, Petya V4sechkin, эти способы я знаю, но мне нужно немножко другое. Мне нужно автопереключение всех выполняющихся и вновь запущенных процессов на, скажем, первые два ядра, а два другие ядра отдать под единственный процесс. Временно, конечно. Я, конечно, думаю, что такого в природе не существует, но всё-таки для верности создал тему
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», и Вы хотите большей разницы — можете экспериментировать. Я не стал.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC