![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отключение процессоров [D7, WinXP]
Admin © (2004-07-28 17:35:00)Как мне отключить (а замет опять включить) несколько процессоров в моей машине. Например, мне нужно, чтобы определенное место кода программы обрабатывалось на 1-ом процессоре, а затем опять кключались оставшиеся 3 процессора. Всего у меня 4 ксенона в машине. Отключал вручную через диспетчер задач (вин 2003) (Set affinity). Нашел АПИ ф-цию:
BOOL SetProcessAffinityMask(
HANDLE hProcess, // handle to process
DWORD dwProcessAffinityMask // process affinity mask
);
Но не могу понять, что мне прописывать в dwProcessAffinityMask. Подскажите плз.
Sergey Kaminski (2004-07-28 18:46:00) [1]Так эта... а зачем их отключать-то, я так и не понял?
Admin (2004-07-28 18:18:00) [2]А понял... Значит надо в двоичный вид представить число, что получилось. А вот например если у меня более 8 процессоров. Как тут быть?
panov (2004-07-28 18:18:00) [3]А вот например если у меня более 8 процессоров
Ну так и маска состоит не из одного байта. Один байт я для примера взял.
panov (2004-07-28 18:15:00) [4]У тебя процессоры также нумеруются с 0.
Admin (2004-07-28 18:15:00) [5]> Привязка к процессорам наследуется дочерними процессами.
А дочерними потоками (threads) ?
panov (2004-07-28 18:14:00) [6]В примере Рихтера:
0x00000005
берем последний байт, его двоичный вид:
00000101
биты нумеруются с 0 до 7, причем нулевой - правый бит.
т.е. в данном примере:
00000101
--------
76543210
тспользуются процессоры 0 и 2.
Admin (2004-07-28 18:12:00) [7]2 MU ©
смортю! но понять, видимо как и ты, не могу, как создать маску именно для моих нужд!
MU (2004-07-28 18:11:00) [8]см [2]
Admin (2004-07-28 18:10:00) [9]Подскажите, как мне рассчитать эту самую битовую маску для отключения 2,3 и 4 процессора, а затем для их включения...
Admin (2004-07-28 18:07:00) [10]Хмм... Сделал. На 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;
panov (2004-07-28 18:05:00) [11]см. также SetThreadAffimtyMask
panov (2004-07-28 18:01:00) [12]
BOOL SetProcessAffinityMask( HANDLE hProcess, DWOHD_PTR dwProcessAffinityMask);
В первом параметре, hProcess, передается описатель процесса. Второй параметр, dwProcessAffinityMask, — это битовая маска, указывающая, на каких процессорах мо гут выполняться потоки данного процесса. Передав, например, значение 0x00000005, мы разрешим процессу использовать только процессоры 0 и 2 (процессоры 1 и 3-31 ему будут недоступны).
Привязка к процессорам наследуется дочерними процессами. Так, если для роди тельского процесса задана битовая маска 0x00000005, у всех потоков его дочерних процессов будет идентичная маска, и они смогут работать лишь на тех же процессо рах. Для привязки целой группы процессов к определенным процессорам используйте объект ядра "задание" (см главу 5).
(c) Джеффри РИХТЕР
MU (2004-07-28 17:47:00) [13]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
);
чтобы получить значение. отключай ручками процессоры и см., что возвращается