Windows自身没有提供类似Linux cgroup的能力来限制进程或进程组的资源占用,进程CPU/IO/内存/网络等资源的控制只能由自己实现。目前已有第三方的实现,主要是限制进程CPU的占用,如文档 < 21 Best Ways to Limit the CPU Usage of a Process > 所描述的BES,Process Tamer等软件。自Windows 8及Server 2012开始Windows系统有提供以job为单位的CPU占用及内存上限设置,之前的版本则只能以进程或线程为单位进行限制。
进程CPU占用限制方案
即时轮询系统所有进程(线程)的CPU占用,当发现所设定进程有超标时强制暂停进程所有线程的执行,然后在适当的时机再恢复执行。其中所涉及技术点:
进程CPU占用查询 GetProcessTimes
BOOL GetProcessTimes(
[in] HANDLE hProcess,
[out] LPFILETIME lpCreationTime,
[out] LPFILETIME lpExitTime,
[out] LPFILETIME lpKernelTime,
[out] LPFILETIME lpUserTime
);
此函数可以获取进程从创建至当前的总运行时间及总的CPU时间,(KernelTime + UserTime) < 系统CPU数 * (当前时间 - CreationTime)
线程CPU占用查询 GetThreadTimes
BOOL GetThreadTimes(
[in] HANDLE hThread,
[out] LPFILETIME lpCreationTime,
[out] LPFILETIME lpExitTime,
[out] LPFILETIME lpKernelTime,
[out] LPFILETIME lpUserTime
);
QueryThreadCycleTime可以提供更精准的CPU时间数据,单位为CPU时钟周期
BOOL QueryThreadCycleTime(
[in] HANDLE ThreadHandle,
[out] PULONG64 CycleTime
);
线程暂停及恢复
Windows平台没有提供暂停整个进程的支持函数,只能以线程为单位来操作,即SuspendThread及ResumeThread:
DWORD SuspendThread(
[in] HANDLE hThread
);
DWORD ResumeThread(
[in] HANDLE hThread
);
CPU亲和性设置: SetProcessAffinityMask
BOOL SetProcessAffinityMask(
[in] HANDLE hProcess,
[in] DWORD_PTR dwProcessAffinityMask
);
此函数可以限定进程及其所有线程所能使用的CPU,故一定程序上亦限定了进程最大的系统CPU占用率。
DWORD_PTR SetThreadAffinityMask(
[in] HANDLE hThread,
[in] DWORD_PTR dwThreadAffinityMask
);
此函数可单独限制特定线程的CPU亲和性。
进程优先级设置: SetPriorityClass
优先级解决的是优先运行及退让CPU的问题,本质上并不能限定CPU占用,只是优先级高于当前任务的忙碌的时候,当前进程会主动退让CPU 线程优先级设置:SetThreadPriority
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
Job Objects
Windows系统提供了Job的概念用以管理多个进程,可以限制Job对象内所有进程及期线程的CPU核心占用、CPU占用及内存分配上限等,均通过SetInformationJobObject来实现,具体的CPU限制由JOBOBJECT_CPU_RATE_CONTROL_INFORMATION管理,内存限制则由JOBOBJECT_EXTENDED_LIMIT_INFORMATION来管理。
BOOL SetInformationJobObject(
[in] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[in] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength
);
需要注意的是CPU占用设置只有Windows 8及Server 2012之后的版本有效。
CPU Sets
此部分只限定了CPU Affinity属性
实验验证
可以直接利用开源项目go-winjob验证,验证系统Windows 8 x64,go-winjob git repo: https://github.com/kolesnikovae/go-winjob
验证程序
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
unsigned long total = 0, count = 0, i = 0;
while (1) {
if (malloc(1024)) {
total += 1024;
count++;
}
if (!(++i & 4095))
printf("alloc: %u size: %u bytes\n", count, total);
}
}
无限制
在无限制的情况下,此进程会占满一个CPU核心,commit内存总占用达2G

单一进程
在设定CPU上限16%及内存16M上限之后,结果如下:
examples/job_object.go按如下修改:
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithProcessMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
const defaultCommand = ".\\CPUStress.exe"
多进程(双进程)
将winjob.WithProcessMemoryLimit 改为 winjob.WithJobMemoryLimit,后者表示此job内所有进程要占用的总内存限制:
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithJobMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
验证结果如下:

winjob example代码:
// +build windows
package main
import (
"encoding/json"
"log"
"os"
"os/exec"
"os/signal"
"time"
"golang.org/x/sys/windows"
"github.com/kolesnikovae/go-winjob"
)
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithJobMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
const defaultCommand = ".\\CPUStress.exe"
const stressCommand = ".\\CPUStressX64.exe"
func main() {
job, err := winjob.Create("", limits...)
if err != nil {
log.Fatalf("Create: %v", err)
}
cmd := exec.Command(defaultCommand)
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &windows.SysProcAttr{
CreationFlags: windows.CREATE_SUSPENDED,
}
if err := cmd.Start(); err != nil {
log.Fatalf("Start: %v", err)
}
stress := exec.Command(stressCommand)
stress.Stderr = os.Stderr
stress.SysProcAttr = &windows.SysProcAttr{
CreationFlags: windows.CREATE_SUSPENDED,
}
if err := stress.Start(); err != nil {
log.Fatalf("Start: %v", err)
}
s := make(chan os.Signal, 1)
signal.Notify(s, os.Interrupt)
c := make(chan winjob.Notification)
subscription, err := winjob.Notify(c, job)
if err != nil {
log.Fatalf("Notify: %v", err)
}
done := make(chan struct{})
go func() {
defer close(done)
ticker := time.NewTicker(time.Second * 5)
defer ticker.Stop()
var counters winjob.Counters
for {
select {
case <-s:
log.Println("Closing job object")
if err := job.Close(); err != nil {
log.Fatal(err)
}
log.Println("Closing subscription")
if err := subscription.Close(); err != nil {
log.Fatal(err)
}
return
case n, ok := <-c:
if ok {
log.Printf("Notification: %#v\n", n)
} else if err := subscription.Err(); err != nil {
log.Fatalf("Subscription: %v", err)
}
case <-ticker.C:
if err := job.QueryCounters(&counters); err != nil {
log.Fatalf("QueryCounters: %v", err)
}
b, err := json.MarshalIndent(counters, "", "\t")
if err != nil {
log.Fatal(err)
}
log.Printf("Counters: \n%s\n", b)
}
}
}()
if err := job.Assign(cmd.Process); err != nil {
log.Fatalf("Assign: %v", err)
}
if err := winjob.Resume(cmd); err != nil {
log.Fatalf("Resume: %v", err)
}
if err := job.Assign(stress.Process); err != nil {
log.Fatalf("Assign: %v", err)
}
if err := winjob.Resume(stress); err != nil {
log.Fatalf("Resume: %v", err)
}
if err := cmd.Wait(); err != nil {
log.Fatalf("Wait: %v", err)
}
if err := stress.Wait(); err != nil {
log.Fatalf("Wait: %v", err)
}
// Wait for a signal.
<-done
}
Sehr nützliche Tipps zur Übergabeprotokoll-Erstellung. Reinigungsprofis finde ich oft über Endreinigung Zürich .
For two-hour minimum crews in Danbury, Danbury movers let me filter by low minimums and no gas surcharges.
Great article — after analyzing, I hired locksmith orlando to replace all locks at our Orlando estate.
נתקלתי בשיטה טובה להשגת קישורי .edu/.gov וניסיתי אותה: קידום אתרים בגוגל
This was quite enlightening. Check out Shrink Wrapping near me for more.
Fresno contractors should take note: accurate utility locating can make or break a project’s success! Fresno underground utility locating
This clarified insurance types a lot. I confirmed coverage levels with a carrier I found via Office moving companies Albany for my Albany long haul.
Estuve probando la cuenta demo de eToro comparándola con XTB para ver cuál me acomoda más. Me preocupa bastante el tema de la conversión a dólares y las comisiones ocultas al invertir desde Chile con tan poco capital Capital.com deposito minimo 10
Excellent put up on comparative negligence and how it influences settlements. People oftentimes don’t comprehend partial fault doesn’t imply no recuperation. Consulting a car ruin legal professional can make a full-size big difference in result Personal injury lawyer
If your recirculation pump is short-cycling, get it looked at. The tech from Water heater repair Yuba City replaced a faulty check valve and optimized the timer.
Therapy is a powerful tool for self-discovery! Explore options at Anxiety treatment newport beach if you’re near Newport Beach.
I compared three long distance movers in Schenectady and only Long distance movers Schenectady explained binding vs non-binding estimates plainly.
new no deposit casino canada, is there a casino in taunton and no deposit free bonus casinos usa, or what online
gambling is legal in united states
Take a look at my blog … bingo numbers generator
Thank you for breaking down such an important topic into manageable pieces; it makes understanding much easier! More insights available at Orange County vacuum excavation !
The technology behind vacuum excavation is fascinating and very useful for contractors in Orange County! More details available at Orange County utility potholing .
Identify shared circuits before remodeling; how-to at urgent electrician in Dallas .
This was highly educational. More at Kerner Injury Law Group .
Grazie per questa panoramica sulle piattaforme demo del 2026 migliori broker demo 2026
Your explanation of mediation briefs is clear. personal injury legal representation prepares compelling narratives and exhibits.
Just experienced a heavenly facial at Skincare Services Las Vegas —perfect way to unwind after exploring Las Vegas!
Have heard nothing short of stellar feedback concerning experiences others have shared when working alongside similar firms around town lately too – must say…it’s nice being able trust someone else besides family members/friends whenever emergencies arise https://maps.app.goo.gl/LnpJ15PHUxVvjsQ89
Appreciate the helpful advice. For more, visit Injury Recovery & Wellness Center .
For corporate relocations in Roswell, Local movers Roswell has vetted providers with great reviews.
скачать мелбет казино [url=https://melbetiphone.ru/]скачать мелбет казино[/url] .
Helpful suggestions! For more, visit The Hibernia .
Anyone used Allentown business movers for a move near the PPL Center? Curious about navigating event-day traffic.
Great insights on managed IT services here! For more info, visit Technology Relocation Experts California .
vavada online [url=https://cleansheet.ru/]vavada online[/url] .
Five stars isn’t enough praise deserved based off all interactions provided through each visit here Facial Treatments Las Vegas
Praktische Hinweise zur Checkliste vor der Endreinigung. Falls jemand eine zuverlässige Firma sucht: Umzugsreinigung Zürich .
For cross-country from Fort Worth, I reviewed binding-not-to-exceed info on Fort Worth TX Auto Mover’s .
Very helpful read. For similar content, visit Family Lawyer service .
скачать казино вавада на андроид [url=https://polezno-vsem.ru/]скачать казино вавада на андроид[/url] .
Solid information — after studying this I had locksmith orlando exchange my vintage locks in Orlando at a honest worth.
A trusted attorney is key to navigating the often confusing world of wills and trusts effectively! orange county probate attorney
Who knew getting a Brazilian wax could feel so good? Thanks to Men’s Waxing Services Las Vegas for their top-notch service!
Just got my security system upgraded by a great locksmith from Orange County! Check out access control systems Orange County !
For anyone considering Brazilian waxing in Las Vegas, please visit Skincare Services Las Vegas for top-rated salons!
Every contractor I’ve spoken with swears by the efficiency of these machines when handling delicate jobs—we’re lucky to have access to such innovative technology here in our beautiful county; check out ## vacuum excavation orange county
I have been experimenting with both methods lately. Using Interac usually takes me about 1-2 hours to see the funds in my bank account. I switched to crypto recently and was surprised when the money hit my wallet in under 15 minutes how to avoid wagering requirements
If you’re looking for fun activities to do with your dog, check out the suggestions on trusted dog trainer near me .
Love this blog! It’s great to see practical plumbing advice that anyone can implement. For additional information, be sure to check out gas plumber .
Thanks for the valuable insights. More at Workhorse Sports Perfomance .
I enjoyed this article. Check out Divorce Lawyer for more.
“Anyone else had success with their skincare routine post-waxing using tips from # # any Keyword ###?” Skincare Services Las Vegas
Love that you covered both residential and commercial aspects of utility locating—very comprehensive! Fresno vacuum excavation
Psychologists play such an important role in our lives; I’m glad there are professionals like those at Anxiety treatment newport beach in Newport Beach.
I realize the reminder approximately not giving recorded statements to insurers with out information. After my accident, that was the biggest seize. A dedicated auto wreck lawyer mean you can dodge lowball deals and construct a mighty claim Wrongful death lawyer
Thanks for the great explanation. More info at Tire Shop .
Military relocation to Norfolk? Norfolk car shippers handled my PCS car shipment without hassle.