2016-11-15 4 views
0

J'ai un serveur avec deux processeurs physiques. Je veux définir un processus en cours à un groupe spécifique comme si je le faisais manuellement à partir du gestionnaire de tâches. Notez que ce n'est pas une affinité mais un groupe de processeurs (chaque groupe a 16 processeurs logiques). Je n'ai trouvé aucun moyen de le faire ni en C# ni en C++. Alternativement j'ai essayé de créer un processus avec l'attribut préréglé:Affectation d'un processus à un groupe de processeurs

LPPROC_THREAD_ATTRIBUTE_LIST pAttribs = NULL; 
WORD iNuma = 0; 
STARTUPINFOEX sInfoEx; 
sInfoEx.StartupInfo.cb = sizeof(sInfoEx); 
DWORD size; 
int success = InitializeProcThreadAttributeList(0, 1, 0, &size); 
pAttribs = reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(HeapAlloc(GetProcessHeap(), 0, size)); 
success = InitializeProcThreadAttributeList(pAttribs, 1, 0, &size); 
success = UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_PREFERRED_NODE, &iNuma, sizeof(iNuma), NULL, NULL); 
long err = GetLastError(); 
auto fCreationFlags = EXTENDED_STARTUPINFO_PRESENT; 
PROCESS_INFORMATION pi = { 0 }; 
STARTUPINFOEX si = { 0 }; 
si.StartupInfo.cb = sizeof(si); 
si.lpAttributeList = pAttribs; 
int p = CreateProcess(NULL, L"notepad.exe", NULL, NULL, false, fCreationFlags, NULL, NULL, &si.StartupInfo, &pi); 

l'appel à CreateProcess bloque l'application avec la violation d'accès.

Ce code ne fonctionne pas non plus. Il chagnes juste affinité d'un fil, mais ne semble pas qu'il affecte le groupe d'un processus: How Can I Set Processor Affinity in .NET?

Répondre

0

Selon the documentation, la version Unicode de CreateProcess peut modifier le paramètre de ligne de commande (seconde). Passer dans une chaîne constante (ce que vous faites) peut entraîner une violation d'accès. Vous devrez passer un string ou un tableau modifiable.

+0

Super! Cela a résolu le problème de la création de processus. J'aimerais qu'il y ait une solution pour changer le groupe de processus du processus existant. – sergman