Pregunta

Tengo un programa que me gustaría correr en una sola CPU de modo que no tiene demasiados recursos del sistema. El problema es que hace una llamada a una DLL externa que utiliza automáticamente todos los núcleos de CPU disponibles. No tengo el código fuente para el DLL externa. ¿Cómo puedo limitar el DLL a usar solamente una CPU?

EDIT: Gracias por la ayuda, aquí está el código que utiliza para limitar a una CPU (Windows):

// Limit the process to only 1 thread so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
DWORD ProcessAffinityMask;
DWORD SystemAffinityMask;
if(GetProcessAffinityMask(ProcessHandle,&ProcessAffinityMask,&SystemAffinityMask)
    && SystemAffinityMask != 0)
{
    // Limit to 1 thread by masking all but 1 bit of the system affinity mask
    DWORD NewProcessAffinityMask = ((SystemAffinityMask-1) ^ SystemAffinityMask) & SystemAffinityMask;
    SetProcessAffinityMask(ProcessHandle,NewProcessAffinityMask);
}

EDIT: Resulta que el enfoque de Brannon de establecer la prioridad del proceso funciona incluso mejor de lo que yo quiero, que es mantener el proceso de la masticación recursos. Aquí está el código (Windows):

// Make the process low priority so we don't chew up system resources
HANDLE ProcessHandle = GetCurrentProcess();
SetPriorityClass(ProcessHandle,BELOW_NORMAL_PRIORITY_CLASS);
¿Fue útil?

Solución

Configuración afinidad del procesador es un enfoque equivocado. Dejar que la programación de mango OS.

Si la máquina está sentado inactivo, si desea utilizar tanto el procesador como sea posible. De lo contrario se está haciendo menos trabajo por ninguna razón. Si la máquina está ocupada, entonces usted quiere hacer uso de ciclos "libres" y no afectar negativamente a otros procesos.

Windows tiene esta funcionalidad incorporada. La solución adecuada para esto es para establecer la prioridad de base del proceso.

http://msdn.microsoft.com /en-us/library/ms686219(VS.85).aspx para obtener detalles sobre SetPriorityClass().

Si desea probar esto sin necesidad de escribir código, utilice el Administrador de tareas para cambiar la prioridad de su proceso.

Otros consejos

También podemos establecer la afinidad de la CPU de su programa. Prueba el SetProcessAffinityMask función en Windows o sched_setaffinity en Linux.

Normalmente, un archivo DLL vive en el mismo espacio de rosca / memoria como el código que llama. El acto de llamar a una DLL en sí no debe crear hilos. Si llamar a la DLL parece crear más hilos, eso significa que el DLL propio es la creación de los hilos en algún lugar de su código. Si usted no tiene ningún código fuente o la documentación de la DLL, no hay mucho que se pueda hacer al respecto (y si desea que el archivo DLL para hacer su trabajo, no hay mucho que debe hacer sobre esto).

Usted puede tratar de jugar con la prioridad de su aplicación - ajustarlo a baja podría cambiar el uso de la CPU, incluso si no cambia lo que las discusiones se creó. Sin embargo, parece probable que lo que realmente se desea es obtener documentación de esta bestia. Sin saber cómo funciona el código, en general, no hay mucho que puede hacer para cambiar la forma en que funciona. No super genio puede cambiar eso.

Er ...... ¿por qué? En serio, ¿por qué limitar una biblioteca que es capaz de darle un rendimiento adicional de tal manera? ¿Estás tratando de acceder a un recurso compartido o algo? Uno podría pensar que una biblioteca multi-hilo sería capaz de manejar esto de manera segura.

A menos que haya algo que no está mencionando, no puedo ver ninguna razón válida, incluso para tratando para limitar una biblioteca multi-hilo de un solo hilo.

Así que el programa utiliza un hilo, pero que no quiere que el DLL externa para utilizar más de un hilo? Usted no tiene mucho control sobre lo que hace el DLL externa, pero algunos enfoques podría ser:

No dijiste qué plataforma es esto. Voy a asumir ventanas aquí.

Crea el proceso hijo y asociarlo con un de empleo Objeto . A continuación, puede establecer la afinidad del procesador para ese objeto de trabajo para incluir sólo uno de los núcleos de CPU disponibles. El proceso hijo no es capaz de cambiar la máscara de afinidad a cualquier cosa que no es un subconjunto de la afinidad del procesador para el objeto de trabajo. Además, se debe recordar que no debe establecer el límite de JOB_OBJECT_LIMIT_BREAKAWAY_OK o la JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK límite extendida en el trabajo o de lo contrario el proceso hijo será capaz de salir del trabajo.

Además, se puede establecer la prioridad y la clase de planificación para el trabajo. Tal vez será suficiente para crear el proceso hijo en una CPU inferior y / o nivel de prioridad IO?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top