Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизОтключение процессоров Найти похожие ветки
← →
Admin (2004-07-28 17:35) [0]Как мне отключить (а замет опять включить) несколько процессоров в моей машине. Например, мне нужно, чтобы определенное место кода программы обрабатывалось на 1-ом процессоре, а затем опять кключались оставшиеся 3 процессора. Всего у меня 4 ксенона в машине. Отключал вручную через диспетчер задач (вин 2003) (Set affinity). Нашел АПИ ф-цию:
BOOL SetProcessAffinityMask(
HANDLE hProcess, // handle to process
DWORD dwProcessAffinityMask // process affinity mask
);
Но не могу понять, что мне прописывать в dwProcessAffinityMask. Подскажите плз.
← →
MU © (2004-07-28 17:47) [1]A process affinity mask is a bit vector in which each bit represents the processor on which the threads of the process are allowed to run.
если сразу не понятно, то
используй
BOOL GetProcessAffinityMask(
HANDLE hProcess, // handle to the process of interest
LPDWORD lpProcessAffinityMask, // pointer to structure to receive process affinity mask
LPDWORD lpSystemAffinityMask // pointer to structure to receive system affinity mask
);
чтобы получить значение. отключай ручками процессоры и см., что возвращается
← →
panov © (2004-07-28 18:01) [2]
BOOL SetProcessAffinityMask( HANDLE hProcess, DWOHD_PTR dwProcessAffinityMask);
В первом параметре, hProcess, передается описатель процесса. Второй параметр, dwProcessAffinityMask, — это битовая маска, указывающая, на каких процессорах мо гут выполняться потоки данного процесса. Передав, например, значение 0x00000005, мы разрешим процессу использовать только процессоры 0 и 2 (процессоры 1 и 3-31 ему будут недоступны).
Привязка к процессорам наследуется дочерними процессами. Так, если для роди тельского процесса задана битовая маска 0x00000005, у всех потоков его дочерних процессов будет идентичная маска, и они смогут работать лишь на тех же процессо рах. Для привязки целой группы процессов к определенным процессорам используйте объект ядра "задание" (см главу 5).
(c) Джеффри РИХТЕР
← →
panov © (2004-07-28 18:05) [3]см. также SetThreadAffimtyMask
← →
Admin (2004-07-28 18:07) [4]Хмм... Сделал. На 1-процессорной машине указатель на lpProcessAffinityMask вернул 1, на 4-х проц. - 15... Где логика?
procedure TForm1.Button1Click(Sender: TObject);
var pam, sam: cardinal;
begin
GetProcessAffinityMask(GetCurrentProcess, pam, sam);
label1.Caption := inttostr(pam);
label2.Caption := inttostr(sam);
end;
← →
Admin (2004-07-28 18:10) [5]Подскажите, как мне рассчитать эту самую битовую маску для отключения 2,3 и 4 процессора, а затем для их включения...
← →
MU © (2004-07-28 18:11) [6]см [2]
← →
Admin (2004-07-28 18:12) [7]2 MU ©
смортю! но понять, видимо как и ты, не могу, как создать маску именно для моих нужд!
← →
panov © (2004-07-28 18:14) [8]В примере Рихтера:
0x00000005
берем последний байт, его двоичный вид:
00000101
биты нумеруются с 0 до 7, причем нулевой - правый бит.
т.е. в данном примере:
00000101
--------
76543210
тспользуются процессоры 0 и 2.
← →
panov © (2004-07-28 18:15) [9]У тебя процессоры также нумеруются с 0.
← →
Admin (2004-07-28 18:15) [10]> Привязка к процессорам наследуется дочерними процессами.
А дочерними потоками (threads) ?
← →
Admin (2004-07-28 18:18) [11]А понял... Значит надо в двоичный вид представить число, что получилось. А вот например если у меня более 8 процессоров. Как тут быть?
← →
panov © (2004-07-28 18:18) [12]А вот например если у меня более 8 процессоров
Ну так и маска состоит не из одного байта. Один байт я для примера взял.
← →
Sergey Kaminski © (2004-07-28 18:46) [13]Так эта... а зачем их отключать-то, я так и не понял?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.028 c