Se il programma che si desidera limitare non il vostro è, ci sono diverse opzioni:
- impostare la priorità del processo di
Idle
e non limitano l'utilizzo della CPU come la CPU dovrebbe essere utilizzato il più possibile in ogni caso. Va bene avere la CPU sempre al 100% se c'è qualcosa di utile da fare. Se la priorità è idle
, l'utilizzo della CPU di questo particolare processo verrà ridotto se un altro programma richiede CPU.
- se il sistema è multi-core o multi-CPU, quindi è possibile impostare processor affinity. Questo dirà al tuo programma di usare solo il/i processore/i che tu vuoi che usi. Ad esempio, se il tuo programma è multithreaded e in grado di consumare il 100% delle tue due CPU, imposta la sua affinità per utilizzare solo una CPU. Il suo utilizzo sarà quindi solo del 50%.
- La peggiore opzione, ma effettivamente utilizzata dal 90% dei "programmi di limitazione della CPU", si trova sul web: misurare l'utilizzo della CPU di un processo e sospenderlo e riprenderlo regolarmente fino a quando l'utilizzo della CPU va al valore che si volere.
Per sospendere/riprendere un processo che non è il tuo, dovrai utilizzare P/Invoke (e questo richiede di avere accesso al processo, quindi se sei Windows Vista o superiore, prenditi cura di UAC per i diritti di amministratore):
/// <summary>
/// The process-specific access rights.
/// </summary>
[Flags]
public enum ProcessAccess : uint
{
/// <summary>
/// Required to terminate a process using TerminateProcess.
/// </summary>
Terminate = 0x1,
/// <summary>
/// Required to create a thread.
/// </summary>
CreateThread = 0x2,
/// <summary>
/// Undocumented.
/// </summary>
SetSessionId = 0x4,
/// <summary>
/// Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
/// </summary>
VmOperation = 0x8,
/// <summary>
/// Required to read memory in a process using ReadProcessMemory.
/// </summary>
VmRead = 0x10,
/// <summary>
/// Required to write to memory in a process using WriteProcessMemory.
/// </summary>
VmWrite = 0x20,
/// <summary>
/// Required to duplicate a handle using DuplicateHandle.
/// </summary>
DupHandle = 0x40,
/// <summary>
/// Required to create a process.
/// </summary>
CreateProcess = 0x80,
/// <summary>
/// Required to set memory limits using SetProcessWorkingSetSize.
/// </summary>
SetQuota = 0x100,
/// <summary>
/// Required to set certain information about a process, such as its priority class (see SetPriorityClass).
/// </summary>
SetInformation = 0x200,
/// <summary>
/// Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
/// </summary>
QueryInformation = 0x400,
/// <summary>
/// Undocumented.
/// </summary>
SetPort = 0x800,
/// <summary>
/// Required to suspend or resume a process.
/// </summary>
SuspendResume = 0x800,
/// <summary>
/// Required to retrieve certain information about a process (see QueryFullProcessImageName). A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION.
/// </summary>
QueryLimitedInformation = 0x1000,
/// <summary>
/// Required to wait for the process to terminate using the wait functions.
/// </summary>
Synchronize = 0x100000
}
[DllImport("ntdll.dll")]
internal static extern uint NtResumeProcess([In] IntPtr processHandle);
[DllImport("ntdll.dll")]
internal static extern uint NtSuspendProcess([In] IntPtr processHandle);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr OpenProcess(
ProcessAccess desiredAccess,
bool inheritHandle,
int processId);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CloseHandle([In] IntPtr handle);
public static void SuspendProcess(int processId)
{
IntPtr hProc = IntPtr.Zero;
try
{
// Gets the handle to the Process
hProc = OpenProcess(ProcessAccess.SuspendResume, false, processId);
if (hProc != IntPtr.Zero)
{
NtSuspendProcess(hProc);
}
}
finally
{
// Don't forget to close handle you created.
if (hProc != IntPtr.Zero)
{
CloseHandle(hProc);
}
}
}
Penso che la tua domanda sia specifica del sistema operativo e debba essere contrassegnata come tale. Credo che il tuo programma non si compili con 'mono' su Linux. Quindi la tua domanda è più specifica del sistema operativo rispetto alla lingua specifica. –
Se il computer non è in uso (cioè inattivo), perché è un problema che un processo utilizza il 95% della CPU? –
Se la scelta è tra fare * nothing * e realizzare un lavoro utile, perché il sistema operativo sceglierebbe di non fare nulla? Il modo in cui ottenere un processo per utilizzare meno CPU è avere un processo con priorità più alta facendo qualcosa. –