I have absolutely the same problem and not only with executing several
scripts in different threads. After some digging I finaly decided that this
is a bug of operation system (NT in my case) that is not very happy to
manage threads with COM objects in multiprocessor architecture.
I set the mask that allows system to execute one process using only one
processor. I have several processes and the system split them between the
processors, but one of them with all its threads is running on one only.
This is a portion of Delphi code that set the mask.
procedure SetProcessToRunOnOneProcessor;
var
iIndex: Integer;
hProcess: THandle;
iProcessAffinityMask: DWORD;
iSystemAffinityMask: DWORD;
iOneProcessorMask: DWORD;
begin
hProcess := GetCurrentProcess;
if GetProcessAffinityMask(hProcess, iProcessAffinityMask,
iSystemAffinityMask) then
begin
for iIndex := 0 to 32 - 1 do
begin
iOneProcessorMask := $01 shl iIndex;
if (iProcessAffinityMask and iOneProcessorMask) <> 0 then
begin
iProcessAffinityMask := iProcessAffinityMask and iOneProcessorMask;
Break;
end;
end;
SetProcessAffinityMask(hProcess, iProcessAffinityMask);
end;
end;
급하게 만들어 봤읍니다.
작업관리자로 CPU사용내용을 확인해보세여...
3번째 CPU만 선호도를 설정하려면 $0004,
2번째와 3번째 CPU만 선호도를 설정하려면 $0006
처럼 마스크로 설정하시면 돼여...
uses Math;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
// 1번 CPU를 선호
SetProcessAffinityMask(GetCurrentProcess, $0001);
for i := 1 to 99999 do begin
Caption := IntToStr(i);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
begin
// 2번 CPU를 선호
SetProcessAffinityMask(GetCurrentProcess, $0002);
for i := 1 to 99999 do begin
Caption := IntToStr(i);
end;
end;
CPU 스케쥴링은 Context Switching 과 더불어 운영체제의 고유기능중에 하나이며
이며 아마도 O/S의 CPU 프로세스 스케쥴링을 프로그래머가 특정 프로세스에게 임의
할당하게 되면 자원공유에도 위반되며 이로인해 O/S의 프로세스 스케쥴링을 방해하여
도리어 O/S의 성능을 떨어뜨리는 결과를 초래할 것입니다
즉 O/S는 프로그래머가 작성한 프로그램만 신경쓰는것이 아니며 엄연히
프로세스 또는 쓰레드에도 우선순위가 있으니까요
UNIX의 경우도 CPU당 kernel thread인 LWP가 할당되고 여기에 user thread가
할당되어 처리되지만 프로그래머가 직접 O/S를 수정하지 않는한
프로그래머는 nice 등으로 우선순위를 바꾸는 정도입니다
Windows 프로세스 생성시 우선순위(priority)를 지정할수 는 있지만
CPU를 직접 할당하는 경우는 없는것 같습니다
프로세스의 성능이 문제시 된다면 병렬 프로그래밍을 고려해 보세요
SMP,MPP,NUMA 등등의 환경에서 프로그래밍 할 수 있는 라이브러리등이 제공됩니다
LAM,MPI,OpenMP,PVM 등이 클러스터나 이와 비슷한 환경에서 쉽게 병렬 프로그래밍을
작성할 수 있도록 공개되어 있습니다
윈도우즈용으로 개발된것이 있는지 모리겠습니다만 JAVA로 병렬 프로그래밍을
할 수 있도록 라이브러리가 있었던것으로 기억됩니다
SetProcessAffinityMask API를 사용하시면 되여...