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
}
It’s always best to choose long distance movers with experience, transparent pricing, and good customer support. Woodbridge moving help can be found here: Woodbridge movers
Técnicos expertos y disponibles 24/7 en Barcelona: cerrajero de urgencia .
Asking how they handle end-of-life care in assisted living is difficult but necessary. We discuss having those conversations on respite care .
Before starting a major renovation in Woodland Hills, get a consultation from Custom home building Woodland Hills to understand realistic costs and timelines.
I always believe local experience matters when hiring movers. A team that knows Snellville neighborhoods and traffic routes can make moving day much smoother. Best Snellville movers
Your post on kitchen remodels is inspiring. I advise clients get a transparent budget plan from the start, and I constantly point them to walk in shower remodel near me for examples.
This is exactly the kind of information people need before moving. Houston moves can involve apartments, homes, offices, and storage needs. I found Houston moving company relevant for this topic too.
Excellent advice on preventing frozen pipes. Insulation, drip prevention, and keeping indoor temperatures stable can save a lot of money in winter. plumber near me
For gravel driveways, culverts and grading stop washouts. Hired a drainage pro via septic pumping .
This is a practical guide for any homeowner with central air. central ac repair
Avoid silt in septic fields—protect with fabric and clean stone. We followed aggregates ’s build spec.
Nicely done! Discover more at ac repair near me .
matched england match betting cash out
Multi-day festival? individual restroom maps counts per day and service cycles to keep things clean.
Personalized bathing schedules, preferred hygiene products, and familiar routines are easier to honor in a small home setting. That kind of individual attention is what drew me to elderly care .
The supplier tips at individual restroom made delivery scheduling and site access straightforward.
This was a wonderful guide. Check out fitness certified trainer Slough for more.
Transparent pricing and clear policies are what I try to find in a daycare. This post nailed it– will go to Hip Hounds to compare alternatives and read evaluations.
online casino ab 100 euro muchbetter – https://raibahadur.jupiter-Cdn.com/uncategorized/neue-Freie-roulette-Ohne-registrierung/, casino zahlungsmetoden
Require new center support hardware and proper shimming; my spec list comes from drivelines .
Hey there would you mind sharing which blog platform you’re working with? I’m looking to start my own blog soon but I’m having a tough time making a decision between BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your design and style seems different then most blogs and I’m looking for something completely unique. P.S Sorry for being off-topic but I had to ask!
Thanks for the informative content. Sidewalks, steps, and driveways need strong repair solutions to stay safe and functional. nyc concrete repair is connected to this subject.
Every flag has its very own one-of-a-kind tour, reflecting the trials and triumphs of its other people for the time of history. Explore these journeys at cool flags for room !
Good post on plumbing maintenance for older homes. Aging pipes, outdated fixtures, and hidden leaks are common concerns in those properties. plumber near me
This course was a big relief because it’s “no reading” and “video only.” cheapest video defensive driving course texas online
Anyone in Feasterville-Trevose need drain cleaning? I found hydro-jetting options through plumber feasterville that cleared roots fast.
Prenatal chiropractic can be a game changer. If you’re expecting in Thousand Oaks, I recommend contacting Thousand Oaks Chiropractor for safe, supportive care.
best online horse racing bookmakers not on gamstop [https://Bukmacherjakie.com/] racing betting
sites
non runner no bet grand national
my page … Romford Greyhound Results Yesterday
Useful advice! For more, visit ac repair near me .
Solid point about healthcare directives and powers of attorney. If you haven’t created yours yet, check out Thousand Oaks Estate Planning Attorney to get started with professional guidance.
I agree that regular filter changes can make a big difference in cooling performance. central ac repair
online echtgeld casino google pay chancen
I appreciate how many Los Angeles home builders prioritize eco-friendly materials in their construction process. luxury home builder Los Angeles
how do you place bets on horse racing
Here is my page :: greyhound crayford results
Many ancient flags have gone through alterations in meaning over time; it’s charming to see how perceptions shift throughout generations—identify this evolution at Ultimate Flags Inc !
Si necesitas un cerrajero en Barcelona a cualquier hora, usa cerrajería .
Wow, fantastic blog layout! How long have you ever been running
a blog for? you made blogging glance easy. The whole glance of your website is wonderful,
as neatly as the content material!
Thanks for sharing these useful tree service tips. Appropriate trimming can really enhance both the look and health of a backyard. I would also advise taking a look at tree service west palm beach .
This was beautifully organized. Discover more at verified certified trainer Slough .
This piece really hits home. I’ve started asking “what would the model cite” rather than just focusing on what would rank, because accuracy feels like the new SEO SEO for answer engines
Knowing that Nursing Homes typically have licensed nurses on site around the clock, while Assisted Living may not, is a key safety point. I verified that difference using checklists from respite care .
Just had an emergency after-hours burst pipe in Feasterville—calling a 24/7 Plumber Feasterville via plumber feasterville saved my basement.
Athletes in the Conejo Valley: a Chiropractor in Thousand Oaks helped me recover after a marathon. Highly recommend looking at Thousand Oaks Chiropractor .
Loved the breakdown of avoiding probate. Setting up a living trust with a Thousand Oaks attorney such as Estate Planning Attorney in Thousand Oaks can save time and stress for families.
Progress replace practices that maintain every body aligned. Read at Phoenix kitchen remodeling company
Thanks for posting this. I agree that using the right treatment at the right time is essential for effective weed control. tree service may be helpful for property owners.
I appreciate your balanced coverage of both emotional and practical concerns. I’ll mention this post as recommended reading on assisted living .
Good reminder that not every leak is visible. Small pipe leaks under sinks, behind drywall, or under foundations can cause major structural damage over time. plumber near me
Servicio de cerrajero urgente que cumple lo prometido: cerrajero de urgencia .