PowerShell, установка привязки к ЦП 63 (64-му логическому процессору)

Итак, оказывается, что в PowerShell нет встроенного способа переключения «Группы процессоров», когда у вас более 64 логических процессоров.

Хорошо, но даже без групп процессоров я столкнулся с проблемой, когда хотел установить привязку процесса к 63-му процессору (т. е. 64-му логическому процессору) с помощью .ProcessorAffinity, , который является последним логическим процессором, который может вписаться в «нормальный» системе без необходимости использования групп процессоров .

Возможно, я что-то упускаю, но это дает мне целочисленное переполнение, соответственно. он не может преобразовать значения в IntPtr.

Значение сходства для ЦП 63 будет 2^63, что составляет 9223372036854775808. Однако максимальное значение для 64-битного целого числа со знаком [Int64] составляет 9223372036854775807, то есть на 1 меньше. И я не могу передать [UInt64] или [BigInt] в .ProcessorAffinity, так как не получится преобразовать в IntPtr (даже при использовании небольших чисел).

В качестве примера:

> (Get-Process 'notepad').ProcessorAffinity = [UInt64] [Math]::Pow(2, 63)


Exception setting "ProcessorAffinity": "Cannot convert the "9223372036854775808" value of type "System.UInt64" to type
"System.IntPtr"."
At line:1 char:1
+ (Get-Process 'notepad').ProcessorAffinity = [UInt64] [Math]::Pow(2, 6 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting

И даже выполнение (Get-Process 'notepad').ProcessorAffinity = [UInt64] 3 не работает с той же ошибкой.

Удаление приведения типа к [UInt64] также не работает (аналогичное сообщение об ошибке, только на этот раз с [Double]), а приведение к [Int64] вместо этого вызывает «Арифметическая операция привела к переполнению». ошибка. Конечно, поскольку оно больше максимального значения.

Итак, есть ли способ вообще установить привязку процессора к собственному свойству PowerShell .ProcessorAffinity к ЦП 63 (или комбинации ЦП 63 с любым другим ЦП, что наверняка превысит предел 64-битного целого числа)?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следует помнить, что привязка процессора — это битовая маска, а не число (см. Привязка процессора).

Действительно, максимальное значение: 9223372036854775807

PS C:\> [System.IntPtr]::MaxValue
9223372036854775807

Что получается с небольшим значением:

PS C:\> [System.Convert]::ToString('9223372036854775807',2)
111111111111111111111111111111111111111111111111111111111111111

Правильно было указано (подмигнуло), что это всего лишь 63 бита. Но нам нужен 64-битный набор. например.:

1000000000000000000000000000000000000000000000000000000000000000

или

9223372036854775807 + 1 = 9223372036854775808

Да, мы можем сохранить это значение в Unsigned Int, но десятичное «число» больше, чем MaxValue 9223372036854775807, и поэтому, да, как вы узнали, Unsigned Int не будет работать.

Но помните, что целые числа работают так: 64-й бит — это значение знака, поэтому мы думали об этом неправильно. Нам нужно не 9223372036854775807 + 1, а на самом деле, как ни странно, нам нужно отрицательное значение:

PS C:\> [System.Convert]::ToInt64('1000000000000000000000000000000000000000000000000000000000000000',2)
-9223372036854775808

И мы можем убедиться, что это отрицательное число является допустимым значением, поскольку минимальное значение IntPtr не равно 0, а -9223372036854775808:

PS C:\> [System.IntPtr]::MinValue
-9223372036854775808

И мы можем установить это отрицательное значение:

(Get-Process 'notepad').ProcessorAffinity = -9223372036854775808

Действительно, оказывается, что отрицательное значение — это правильный способ установить близость с помощью ProcessorAffinity. Кроме того, значение для ЦП 62+63 равно -4611686018427387904. А если вы используете неродную функцию SetThreadGroupAffinity, вы действительно можете использовать беззнаковые 64-битные целые числа, поэтому нет необходимости передавать отрицательное значение. Однако когда вы используете это, диспетчер задач не будет отображать привязку к основному процессу.

sp00n 01.06.2024 03:09

Другие вопросы по теме