Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программное обеспечение Windows (http://forum.oszone.net/forumdisplay.php?f=7)
-   -   Переключение задач на одно ядро (http://forum.oszone.net/showthread.php?t=201908)

rsod 13-03-2011 21:29 1634121

Переключение задач на одно ядро
 
Есть ли какая-нибудь утилитка, позволяющая на время действия некоторого процесса отдать ему 3 (2, 1) из нескольких ядер, а остальные процессы автоматически переключить на другие ядра? Естественно, после завершения процесса всё должно автоматически вернуться "на круги своя".

Казбек 13-03-2011 21:37 1634138

rsod,
http://www.howtogeek.com/howto/windo...windows-vista/

Petya V4sechkin 13-03-2011 21:39 1634141

rsod, в Диспетчере задач на процессе правой кнопкой мыши -> Задать соответствие.

rsod 14-03-2011 15:01 1634630

Казбек, Petya V4sechkin, эти способы я знаю, но мне нужно немножко другое. Мне нужно автопереключение всех выполняющихся и вновь запущенных процессов на, скажем, первые два ядра, а два другие ядра отдать под единственный процесс. Временно, конечно. Я, конечно, думаю, что такого в природе не существует, но всё-таки для верности создал тему

Iska 14-03-2011 17:38 1634767

rsod, теоретически это можно сделать. Практически же — малопредсказуемо, как поведут себя в этом случае системные процессы. Проще сделать так, как описано выше («ручками», або программно), а у запускаемого Вами процесса дополнительно выставить высокий приоритет. Я думаю так.

rsod 14-03-2011 19:27 1634853

Цитата:

Цитата Iska
системные процессы »

ну в принципе их можно и не трогать, достаточно обрабатывать процессы, запущенные от имени какого-либо пользователя компьютера.

Iska 15-03-2011 04:06 1635087

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», и Вы хотите большей разницы — можете экспериментировать. Я не стал.


Время: 06:50.

Время: 06:50.
© OSzone.net 2001-